Wiem, że to pytanie jest trochę stare, ale niedawno musiałem je zbadać, ponieważ wdrażam AES128 na PIC16 i 8051, więc też byłem ciekawy tego pytania.
Użyłem czegoś takiego: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c,
a moje użycie pamięci RAM to kilkaset bajtów, a rozmiar binarny jest mniejszy niż 3kb ROM.
Moja najlepsza rada to przeczytać na stronie Wikipedii http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation
i zrozumieć różne tryby, na przykład, w jaki sposób AES w trybie OFB wykorzystuje tryb EBC jako podstawowy element konstrukcyjny. Również XOR'ing (w trybie OFB) sprawia, że jest to symetryczna operacja, więc szyfrowanie / deszyfrowanie to ta sama funkcja, która również oszczędza miejsce.
Kiedy zrozumiałem, jak naprawdę działa AES, mogłem zaimplementować go w C, a następnie przetestować pod kątem specyfikacji NIST ** (zrób to! Dużo kodu znalezionego online jest wadliwy) i zaimplementuj tylko to, czego absolutnie potrzebowałem.
Dzięki temu dostosowaniu i optymalizacji mogłem dopasować AES128 do 8051 wraz z innym oprogramowaniem RF. Zużycie pamięci RAM (dla całego systemu) spadło z ~ 2,5 kb do nieco poniżej 2 kb, co oznacza, że nie musieliśmy aktualizować do 8051 z SRAM 4 kb, ale mogliśmy nadal korzystać z tańszej wersji SRAM 2 kb.
** Wektory testowe znajdują się w załączniku F w: http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf
EDYTOWAĆ:
W końcu dostałem kod na Github: https://github.com/kokke/tiny-AES-c
Zoptymalizowałem trochę rozmiar. Wielkość wyjściowa GCC po skompilowaniu dla ARM:
$ arm-none-eabi-gcc -O2 -c aes.c -o aes.o
$ size aes.o
text data bss dec hex filename
1024 0 204 1228 4cc aes.o
Wykorzystanie zasobów wynosi teraz 1KB, 204 bajty RAM.
Nie pamiętam, jak budować dla PIC, ale jeśli 8-bitowy AVR Atmel Mega16 jest podobny do PIC, użycie zasobów jest następujące:
$ avr-gcc -Wall -Wextra -mmcu=atmega16 -O2 -c aes.c -o aes.o
$ avr-size aes.o
text data bss dec hex filename
1553 0 198 1751 6d7 aes.o
Więc 1,5K kodu i 198 bajtów pamięci RAM.