
AES128/192/256 portátil pequeño en C
Esta es una implementación pequeña y portátil de los algoritmos de cifrado AES ECB, CTR y CBC escritos en C.
Puedes sobrescribir el tamaño de clave predeterminado de 128 bits con 192 o 256 bits definiendo los símbolos AES192 o AES256 en aes.h.
La API es muy sencilla y tiene este aspecto (estoy usando tipos anotados al estilo 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);
Notas importantes:
Puedes elegir usar cualquiera o todos los modos de operación, definiendo los símbolos CBC, CTR o ECB en aes.h (lee los comentarios para aclaraciones).
Los usuarios de C++ deben #include aes.hpp en lugar de aes.h
No hay comprobación de errores incorporada ni protección contra accesos a memoria fuera de los límites como resultado de entradas maliciosas.
El módulo usa menos de 200 bytes de RAM y 1-2K de ROM cuando se compila para ARM, pero puede variar según los modos habilitados.
Es una de las implementaciones más pequeñas en C que he visto hasta ahora, pero no dudes en contactarme si conoces alguna más pequeña (o si tienes mejoras para el código).
He usado el código con éxito en plataformas x86 de 64 bits, ARM de 32 bits y AVR de 8 bits.
Salida de tamaño de GCC cuando solo se compila el modo CTR para 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
.. y al compilar para el conjunto de instrucciones THUMB, terminamos muy por debajo de 1K en tamaño de código.
$ 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
Estoy usando el compilador 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.
Esta implementación está verificada contra los datos de:
Special Publication 800-38A del Instituto Nacional de Estándares y Tecnología, edición 2001 Apéndice F: Vectores de ejemplo para modos de operación del AES.
Los otros apéndices del documento son valiosos para detalles de implementación, p. ej., relleno, generación de IVs y nonces en modo CTR, etc.
Un sincero agradecimiento a todas las buenas personas que han contribuido a este proyecto.
Todo el material de este repositorio es de dominio público.