
Pequeno AES128/192/256 portátil em C
Esta é uma implementação pequena e portátil dos algoritmos de criptografia AES ECB, CTR e CBC escritos em C.
Você pode substituir o tamanho de chave padrão de 128 bits por 192 ou 256 bits definindo os símbolos AES192 ou AES256 em aes.h.
A API é muito simples e se parece com isto (estou usando tipos anotados no 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:
Você pode optar por usar qualquer um ou todos os modos de operação, definindo os símbolos CBC, CTR ou ECB em aes.h (leia os comentários para esclarecimentos).
Usuários de C++ devem incluir aes.hpp via #include em vez de aes.h
Não há verificação de erros integrada ou proteção contra erros de acesso à memória fora dos limites resultantes de entrada maliciosa.
O módulo usa menos de 200 bytes de RAM e 1-2K de ROM quando compilado para ARM, mas os resultados podem variar dependendo de quais modos estão habilitados.
É uma das menores implementações em C que já vi até hoje, mas entre em contato comigo se você conhecer algo menor (ou tiver melhorias para o código aqui).
Usei o código com sucesso em plataformas x86 de 64 bits, ARM de 32 bits e AVR de 8 bits.
Saída de tamanho do GCC quando apenas o modo CTR é compilado 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
.. e ao compilar para o conjunto de instruções THUMB, terminamos bem abaixo de 1K em tamanho 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
Estou usando o compilador GCC ARM da 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 implementação é verificada em relação aos dados em:
Publicação Especial 800-38A, edição de 2001, do National Institute of Standards and Technology Apêndice F: Vetores de Exemplo para Modos de Operação do AES.
Os outros apêndices do documento são valiosos para detalhes de implementação, por exemplo, sobre preenchimento (padding), geração de IVs e nonces no modo CTR, etc.
Um sincero agradecimento a todas as pessoas legais que contribuíram para este projeto.
Todo o material neste repositório é de domínio público.