
Kleines portables AES128/192/256 in C
Dies ist eine kleine und portable Implementierung der AES-Verschlüsselungsalgorithmen ECB, CTR und CBC, geschrieben in C.
Sie können die Standard-Schlüssellänge von 128 Bit durch die Definition der Symbole AES192 oder AES256 in aes.h auf 192 oder 256 Bit ändern.
Die API ist sehr einfach und sieht wie folgt aus (ich verwende C99-<stdint.h>-Stil mit annotierten Typen):
/* Initialize context calling one of: */
void AES_init_ctx(struct AES_ctx* ctx, const uint8_t* key);
void AES_init_ctx_iv(struct AES_ctx* ctx, const uint8_t* key, const uint8_t* iv);
/* ... or reset IV at random point: */
void AES_ctx_set_iv(struct AES_ctx* ctx, const uint8_t* iv);
/* Then start encrypting and decrypting with the functions below: */
void AES_ECB_encrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_ECB_decrypt(const struct AES_ctx* ctx, uint8_t* buf);
void AES_CBC_encrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
void AES_CBC_decrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
/* Same function for encrypting as for decrypting in CTR mode */
void AES_CTR_xcrypt_buffer(struct AES_ctx* ctx, uint8_t* buf, size_t length);
Wichtige Hinweise:
Sie können wahlweise eine oder alle Betriebsarten verwenden, indem Sie die Symbole CBC, CTR oder ECB in aes.h definieren (lesen Sie die Kommentare zur Klarstellung).
C++-Benutzer sollten aes.hpp anstelle von aes.h per #include einbinden.
Es gibt keine eingebaute Fehlerprüfung oder Schutz vor Speicherzugriffsfehlern außerhalb der Grenzen, die durch bösartige Eingaben verursacht werden.
Das Modul benötigt bei der Kompilierung für ARM weniger als 200 Bytes RAM und 1–2 KB ROM, aber das Ergebnis kann je nach aktivierten Modi variieren.
Es ist eine der kleinsten Implementierungen in C, die ich bisher gesehen habe – aber kontaktieren Sie mich gerne, wenn Sie etwas Kleineres kennen (oder Verbesserungen am Code hier haben).
Ich habe den Code erfolgreich auf 64-Bit-x86-, 32-Bit-ARM- und 8-Bit-AVR-Plattformen eingesetzt.
GCC-Größenausgabe, wenn nur der CTR-Modus für ARM kompiliert wird:
$ arm-none-eabi-gcc -Os -DCBC=0 -DECB=0 -DCTR=1 -c aes.c
$ size aes.o
text data bss dec hex filename
1171 0 0 1171 493 aes.o
... und bei der Kompilierung für den THUMB-Befehlssatz liegen wir in der Codegröße deutlich unter 1 KB.
$ arm-none-eabi-gcc -Os -mthumb -DCBC=0 -DECB=0 -DCTR=1 -c aes.c
$ size aes.o
text data bss dec hex filename
903 0 0 903 387 aes.o
Ich verwende den ARM-GCC-Compiler der Free Software Foundation:
$ arm-none-eabi-gcc --version
arm-none-eabi-gcc (4.8.4-1+11-1) 4.8.4 20141219 (release)
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Diese Implementierung wurde anhand der Daten in folgendem Dokument verifiziert:
National Institute of Standards and Technology Special Publication 800-38A 2001 ED Anhang F: Beispielvektoren für die Betriebsarten des AES.
Die anderen Anhänge des Dokuments sind wertvoll für Implementierungsdetails zu z. B. Padding, der Erzeugung von IVs und Nonces im CTR-Modus usw.
Ein herzliches Dankeschön an all die netten Leute, die zu diesem Projekt beigetragen haben.
Das gesamte Material in diesem Repository ist gemeinfrei (Public Domain).