Kleinste AES-Implementierung für Mikrocontroller?


38

Kann mir jemand eine kleine, kostenlose Implementierung von AES-128 Rijndael für Mikrocontroller empfehlen. Idealerweise wäre für das PIC18 eine allgemeine Implementierung in C nützlich.

Das Kompilieren der axTLS-Implementierung für PIC18 und das Verschlüsseln / Entschlüsseln eines Blocks erfordert 6 KB ROM und 750 KB RAM.

Das Kompilieren von rijndael-alg-fst.c für PIC18 und das Verschlüsseln / Entschlüsseln eines Blocks erfordert 28 KB ROM und 0,5 KB RAM.

Das Kompilieren von Brian Gladmans 8-Bit-AES für PIC18 und das Verschlüsseln / Entschlüsseln eines Blocks erfordert 19 KB ROM und 190 Byte RAM.

Gibt es besser optimierte PIC-spezifische Varianten?

(aktualisierte RAM-Anforderungen für die axTLS-Version)


1
Ist das für Bootloader?
Daniel Grillo

Nein, es ist für eine Netzwerkanwendung
Toby Jaffey

Microchip verfügt über eine Implementierung für dsPIC und PIC 24 mit einer Codegröße von 3.018 Byte, die jedoch nur verschlüsselt und nicht entschlüsselt wurde. Ich schätze, das ist nicht das Richtige für dich.
Kellenjb,

@Kellenjb Interessant, aber ich bin auf der Suche nach etwas Kleinem für 8-Bit-Mikros
Toby Jaffey

1
@mikeselectricstuff Ja, es muss AES sein. Ich versuche, mit einem vorhandenen System unter Verwendung von AES-128 zusammenzuarbeiten. Ich bin an einer kleinen AES-Implementierung interessiert, aber ich bin derzeit auf PIC18 ausgerichtet. Ich benutze den HiTech Pro Picc18 Compiler.
Toby Jaffey

Antworten:


19

Ich frage mich, wie Sie mit axTLS 7,5 KB RAM verbraucht haben. Betrachtet man den Code, wird der gesamte Kontext in dieser Struktur gespeichert:

typedef struct aes_key_st 
{
    uint16_t rounds;
    uint16_t key_size;
    uint32_t ks[(AES_MAXROUNDS+1)*8];
    uint8_t iv[AES_IV_SIZE];
} AES_CTX;

Die Größe dieser Struktur ist 2 + 2 + 4 * 15 * 8 + 16 = 504. Ich sehe keine globalen Variablen in aes.c, automatische Variablen sind alle klein, daher ist die Stapelverwendung auch sinnvoll. Wohin gehen also 7,5 kB? Vielleicht versuchen Sie, die gesamte Bibliothek zu verwenden, anstatt nur die AES-Implementierung daraus zu extrahieren?

Wie auch immer, diese Implementierung sieht ziemlich einfach aus. Ich bleibe lieber bei diesem Code und versuche, ihn zu optimieren. Ich weiß, dass es schwierig sein kann, aber das Erlernen der AES-Details kann Ihnen zumindest dabei helfen, die absolute minimale RAM-Auslastung abzuschätzen.

Update: Ich habe gerade versucht, diese Bibliothek unter IA-32 Linux zu kompilieren und einen einfachen CBC AES-128-Verschlüsselungstest zu schreiben. Erhielt die folgenden Ergebnisse (erste Zahl ist die Abschnittslänge hex):

 22 .data         00000028  0804a010  0804a010  00001010  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 23 .bss          00000294  0804a040  0804a040  00001038  2**5
                  ALLOC

Das sind nur 660 Byte .bss (ich habe AES_CTX als globale Variable deklariert). Die meisten .data werden von IV und key belegt. Ich füge hier keinen .text ein, da Sie auf PIC ein völlig anderes Ergebnis erhalten (Datenabschnitte sollten auf beiden Architekturen nahezu gleich groß sein).


Ich habe die axTLS-Version um den Faktor 10 falsch gelesen. Du hast recht. Aber ich bin immer noch an effizienteren Versionen von AES interessiert ...
Toby Jaffey

5
Effizient in Größe oder Geschwindigkeit? Was sind eigentlich die Einschränkungen? Bedenken Sie, dass kleinere Bibliotheken wahrscheinlich langsamer sein werden - wenn Sie sich den Quellcode der größeren (in Bezug auf den Codeabschnitt) Bibliotheken ansehen, ist der Großteil des Aufgeblähten auf vorberechnete konstante Arrays zurückzuführen.
Code Painters

1
In Bezug auf RAM und ROM Stellfläche. Geschwindigkeit ist kein Problem, aber ich versuche, viele Funktionen in ein kleines Gerät zu packen.
Toby Jaffey

14

Ich weiß, dass diese Frage ein bisschen alt ist, aber ich musste sie erst kürzlich selbst recherchieren, da ich AES128 auf einem PIC16 und einem 8051 implementiere, und deshalb war ich auch neugierig auf diese Frage.

Ich habe so etwas verwendet: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c und meine RAM-Nutzung beträgt ein paar hundert Bytes und die Binärgröße ist weniger als 3 KB ROM.

Mein bester Rat ist, auf der Wikipedia-Seite http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation nachzulesen und die verschiedenen Modi zu verstehen, zum Beispiel, wie AES im OFB-Modus den ECB-Modus als Grundbaustein verwendet. Auch das XOR'ing (im OFB-Modus) macht es zu einer symmetrischen Operation, so dass das Ver- / Entschlüsseln dieselbe Funktion ist, die auch Platz spart.

Als ich verstand, wie AES wirklich funktionierte, konnte ich es in C implementieren und dann anhand der NIST-Spezifikation testen ** (tun Sie dies! Viel Code, der online gefunden wurde, ist fehlerhaft) und nur das implementieren, was ich unbedingt brauchte.

Durch diese Anpassung und Optimierung konnte ich AES128 zusammen mit einer anderen HF-Firmware auf einem 8051 installieren. Die RAM-Auslastung (für das gesamte System) ging von ~ 2,5 kB auf knapp 2 kB zurück, was bedeutet, dass wir mit 4 kB SRAM nicht auf eine 8051 aktualisieren mussten, sondern weiterhin die billigere 2 kB SRAM-Version verwenden konnten.

** Testvektoren finden Sie in Anhang F unter: http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf

BEARBEITEN:

Endlich den Code auf Github: https://github.com/kokke/tiny-AES-c

Ich habe ein bisschen für die Größe optimiert. GCC-Größenausgabe beim Kompilieren für ARM:

$ arm-none-eabi-gcc -O2 -c aes.c -o aes.o
$ size aes.o
   text    data     bss     dec     hex filename
   1024       0     204    1228     4cc aes.o

Die Ressourcennutzung beträgt jetzt 1 KB Code, 204 Byte RAM.

Ich erinnere mich nicht, wie man für den PIC baut, aber wenn der 8-Bit-AVR Atmel Mega16 dem PIC ähnelt, ist die Ressourcennutzung:

$ avr-gcc -Wall -Wextra -mmcu=atmega16 -O2 -c aes.c -o aes.o
$ avr-size aes.o
   text    data     bss     dec     hex filename
   1553       0     198    1751     6d7 aes.o

Also 1,5K Code und 198Byte RAM.


Ich frage mich, wie sich eine Implementierung, die ich im Jahr 2001 vorgenommen habe , aufbauen würde. Die S-Boxen werden nicht generiert. Sie sind statisch.
Kaz

6

Ich habe kürzlich die axTLS-Implementierung übernommen und daran gearbeitet, sie so weit wie möglich zu verkleinern. Sie können die S-Boxen ganz einfach selbst generieren und sich einige hundert Bytes sparen.

static uint8_t aes_sbox[256];   /** AES S-box  */
static uint8_t aes_isbox[256];  /** AES iS-box */
void AES_generateSBox(void)
{
    uint32_t t[256], i;
    uint32_t x;
    for (i = 0, x = 1; i < 256; i ++)
    {
        t[i] = x;
        x ^= (x << 1) ^ ((x >> 7) * 0x11B);
    }

    aes_sbox[0] = 0x63;
    for (i = 0; i < 255; i ++)
    {
        x = t[255 - i];
        x |= x << 8;
        x ^= (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7);
        aes_sbox[t[i]] = (x ^ 0x63) & 0xFF;
    }
    for (i = 0; i < 256;i++)
    {
         aes_isbox[aes_sbox[i]]=i;
    }
}

Den vollständigen Quellcode finden Sie unter: http://ccodeblog.wordpress.com/2012/05/25/aes-implementation-in-300-lines-of-code/


Du kennst dich aus, Andrew. Upvoted. : D
Alex

3

Ich habe eine Implementierung in C (nur AES-128) namens aes-min mit MIT-Lizenz durchgeführt. Es zielt auf kleine Mikroprozessoren (z. B. 8-Bit) mit wenig RAM / ROM ab.

Es verfügt über eine optionale On-the-Fly-Berechnung des Schlüsselzeitplans, um den Speicherbedarf zu reduzieren (wodurch der vollständig erweiterte Schlüsselzeitplan im RAM entfällt).


1

Möglicherweise finden Sie diese Implementierung interessant. Es ist aus einer Open Source AVR-Kryptobibliothek.

Sie können einige allgemeine (veraltet) Informationen und Statistiken über die Codegröße und Leistung finden hier .

AES:

AES-Informationen

Ich habe nur mit der SHA-1-Quelle aus dieser Bibliothek herumgespielt, daher kann ich AES nicht kommentieren.



0

Das kleinste AES128, das ich für die PIC-Serie geschrieben habe, kann mit 900 Anweisungen und 42 Byte RAM ausgeführt werden. Ich benutze es selbst auf der PIC12-Serie, aber PIC10F206 ist auch möglich :-).

Ich kann den Code nicht weitergeben, da er von meiner Firma stammt, aber ich habe ihn in asm für die PIC10-12-16-Serie geschrieben. Die Verschlüsselung benötigt 444 Byte Code einschließlich einer Nachschlagetabelle von 256 Byte, dieser Code enthielt auch die Schlüsselladefunktion, die etwa 25 Byte beträgt.

Ich würde jedem raten, nach dem AES - Papier zu suchen und es selbst umzusetzen! Die meisten Implementierungen sind sehr schlecht und verwenden viel zu viel RAM und ROM.

Ich habe auch AES128 für den dsPIC und den PIC24 implementiert und verbrauche im Vergleich zur lib von microchip etwa 70% weniger Code. Mein Code ist auch etwas schneller. dsPIC- und PIC24-Implementierungsnummern:

Die Verschlüsselung dauert ungefähr 2995 Zyklen. 79,10 us bei 40 MIPS, 197,75 us bei 16 MIPS

DecKeySetup dauert ungefähr 567 Zyklen. 14,20 us bei 40 MIPS, 35,43 us bei 16 MIPS

Die Entschlüsselung dauert ungefähr 3886 Zyklen. 97,15 uS bei 40 MIPS, 242,88 uS bei 16 MIPS

"Die gesamte Codegröße beträgt 1050 Wörter inkl. Tabellen."

Das Schöne am PIC24-Kern ist, dass einige Befehle 32-Bit-Befehle sind. Dies erleichtert das Erstellen einer kleinen AES128-Implementierung erheblich. Mein Code verwendet alle verfügbaren 32-Bit-Befehle und ist vollständig 32-Bit-fähig, sodass ich den Code schnell portieren kann PIC32 oder andere 32-Bit-CPUs.

AES ist sehr einfach zu implementieren, nur die meisten Leute versuchen es nicht einmal!

Schauen Sie sich den Link an: http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


Ist es Open Source? Können Sie den Code posten?
Toby Jaffey

2
@Paul - Willkommen bei Electrical Engingeering! Ihre Antwort ist interessant und ermutigend, aber ohne weitere Details ist sie nicht wirklich nützlich. 900 Anweisungen könnten wahrscheinlich in einen Codeblock passen! Bitte klicken Sie auf den Link "Bearbeiten" unter der Antwort, um sie zu verbessern.
Kevin Vermeer

@ PaulHolland gute Nachrichten, wo ist der Code?
Frank

2
@Paul - Du würdest einen Stapel Upvotes bekommen anstatt der Downvote, die du derzeit hast, wenn du erklärst, wie du es geschrieben und den Code gepostet hast! Wenn Sie den Code aus lizenzrechtlichen Gründen nicht veröffentlichen können, erklären Sie zumindest, wie Sie ihn geschrieben haben und wie Joby parallel zu Ihrer Arbeit arbeiten könnte.
Kevin Vermeer
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.