
Небольшая портативная реализация AES128/192/256 на C
Это небольшая и переносимая реализация алгоритмов шифрования AES ECB, CTR и CBC, написанная на C.
Вы можете переопределить размер ключа по умолчанию — 128 бит — на 192 или 256 бит, определив символы AES192 или AES256 в aes.h.
API очень прост и выглядит следующим образом (я использую аннотированные типы в стиле 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);
Важные замечания:
Вы можете использовать любой или все режимы работы, определив символы CBC, CTR или ECB в aes.h (читайте комментарии для пояснения).
Пользователям C++ следует #include aes.hpp вместо aes.h
В библиотеке нет встроенной проверки ошибок или защиты от ошибок выхода за границы памяти в результате вредоносного ввода.
Модуль использует менее 200 байт ОЗУ и 1–2 КБ ПЗУ при компиляции для ARM, но результат может отличаться в зависимости от включённых режимов.
Это одна из самых компактных реализаций на C, которые я видел, но свяжитесь со мной, если вам известно что-то более компактное (или если у вас есть улучшения для этого кода).
Я успешно использовал этот код на платформах 64-бит x86, 32-бит ARM и 8-бит AVR.
Вывод размера GCC при компиляции только режима CTR для 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
.. а при компиляции для набора инструкций THUMB размер кода оказывается значительно меньше 1 КБ.
$ 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
Я использую компилятор ARM GCC от 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.
Эта реализация проверена на данных из:
Специальная публикация 800-38A 2001 ED Национального института стандартов и технологий Приложение F: Примеры векторов для режимов работы AES.
Другие приложения документа полезны для деталей реализации, например, заполнения, генерации IV и nonce в режиме CTR и т.д.
Искренняя благодарность всем замечательным людям, которые внесли вклад в этот проект.
Все материалы в этом репозитории находятся в общественном достоянии.