
Petit AES128/192/256 portable en C
Ceci est une implémentation petite et portable des algorithmes de chiffrement AES ECB, CTR et CBC écrits en C.
Vous pouvez remplacer la taille de clé par défaut de 128 bits par 192 ou 256 bits en définissant les symboles AES192 ou AES256 dans aes.h.
L'API est très simple et ressemble à ceci (j'utilise des types annotés de style 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);
Remarques importantes :
Vous pouvez choisir d'utiliser l'un ou l'ensemble des modes de fonctionnement, en définissant les symboles CBC, CTR ou ECB dans aes.h (lisez les commentaires pour plus de précisions).
Les utilisateurs de C++ devraient #include aes.hpp au lieu de aes.h
Il n'y a pas de vérification d'erreur intégrée ni de protection contre les erreurs d'accès mémoire hors limites résultant d'une entrée malveillante.
Le module utilise moins de 200 octets de RAM et 1-2K de ROM lorsqu'il est compilé pour ARM, mais les résultats peuvent varier selon les modes activés.
C'est l'une des plus petites implémentations en C que j'ai vues jusqu'à présent, mais contactez-moi si vous connaissez quelque chose de plus petit (ou si vous avez des améliorations à apporter au code ici).
J'ai utilisé avec succès le code sur des plateformes x86 64 bits, ARM 32 bits et AVR 8 bits.
Sortie de taille GCC lorsque seul le mode CTR est compilé pour 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
.. et lors de la compilation pour le jeu d'instructions THUMB, nous aboutissons à bien moins de 1K en taille de code.
$ 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
J'utilise le compilateur ARM GCC de la 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.
Cette implémentation est vérifiée par rapport aux données de :
National Institute of Standards and Technology Special Publication 800-38A 2001 ED Annexe F : Vecteurs d'exemple pour les modes de fonctionnement de l'AES.
Les autres annexes du document sont précieuses pour les détails d'implémentation, par exemple le bourrage, la génération des IV et des nonces en mode CTR, etc.
Un merci sincère à toutes les personnes formidables qui ont contribué à ce projet.
Tout le contenu de ce dépôt est dans le domaine public.