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)
pic
encryption
Toby Jaffey
quelle
quelle
Antworten:
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:
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):
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).
quelle
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:
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:
Also 1,5K Code und 198Byte RAM.
quelle
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.
Den vollständigen Quellcode finden Sie unter: http://ccodeblog.wordpress.com/2012/05/25/aes-implementation-in-300-lines-of-code/
quelle
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).
quelle
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:
Ich habe nur mit der SHA-1-Quelle aus dieser Bibliothek herumgespielt, daher kann ich AES nicht kommentieren.
quelle
Ich verwende die Implementierung von Texas für msp430 in einem Freescale-Mikrocontroller S08SH8 mit 512 RAM und 8 KB Flash sowie in Arduino ohne Nacharbeit.
http://www.ti.com/lit/an/slaa547a/slaa547a.pdf
http://www.ti.com/tool/AES-128
quelle
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
quelle