
Small portable AES128/192/256 in C
Questa è un'implementazione piccola e portabile degli algoritmi di cifratura AES ECB, CTR e CBC scritta in C.
Puoi sostituire la dimensione predefinita della chiave di 128 bit con 192 o 256 bit definendo i simboli AES192 o AES256 in aes.h.
L'API è molto semplice e si presenta così (sto usando tipi annotati in stile C99 <stdint.h>):
/* 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);
Note importanti:
Puoi scegliere di utilizzare una o tutte le modalità operative, definendo i simboli CBC, CTR o ECB in aes.h (leggi i commenti per chiarimenti).
Gli utenti C++ dovrebbero #include aes.hpp invece di aes.h
Non è presente alcun controllo degli errori integrato né protezione dagli errori di accesso alla memoria fuori dai limiti derivanti da input malevoli.
Il modulo utilizza meno di 200 byte di RAM e 1-2K di ROM quando viene compilato per ARM, ma i risultati possono variare a seconda delle modalità abilitate.
È una delle implementazioni in C più piccole che abbia mai visto finora, ma contattami se conosci qualcosa di più piccolo (o hai miglioramenti per il codice qui).
Ho usato con successo il codice su piattaforme x86 a 64 bit, ARM a 32 bit e AVR a 8 bit.
Output delle dimensioni GCC quando viene compilata solo la modalità CTR per ARM:
$ 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
.. e compilando per il set di istruzioni THUMB, si scende ben al di sotto di 1K in termini di dimensione del codice.
$ 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
Sto usando il compilatore ARM GCC della 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.
Questa implementazione è verificata rispetto ai dati contenuti in:
National Institute of Standards and Technology Special Publication 800-38A 2001 ED Appendice F: Vettori di esempio per le modalità operative dell'AES.
Le altre appendici del documento sono preziose per i dettagli implementativi, ad esempio su padding, generazione di IV e nonce in modalità CTR, ecc.
Un sentito ringraziamento a tutte le belle persone che hanno contribuito a questo progetto.
Tutto il materiale in questo repository è di pubblico dominio.