Может кто-нибудь порекомендовать небольшую бесплатную реализацию AES-128 Rijndael для микроконтроллеров. В идеале, для PIC18, хотя общая реализация на C была бы полезна.
Компиляция реализации axTLS для PIC18 и шифрование / дешифрование блока требует 6 КБ ПЗУ и 750b ОЗУ.
Компиляция rijndael-alg-fst.c для PIC18 и шифрование / дешифрование блока требует 28 КБ ПЗУ и 0,5 КБ ОЗУ.
Для компиляции 8-битного AES Брайана Гладмана для PIC18 и шифрования / дешифрования блока требуется 19 КБ ПЗУ и 190 байтов ОЗУ.
Существуют ли лучше оптимизированные варианты для PIC?
(обновлены требования к ОЗУ для версии axTLS)
pic
encryption
Тоби джеффи
источник
источник
Ответы:
Мне интересно, как вы получили 7,5 КБ оперативной памяти с помощью AxTLS. Глядя на код, весь контекст хранится в этой структуре:
Размер этой структуры 2 + 2 + 4 * 15 * 8 + 16 = 504. Я не вижу глобальных переменных в aes.c, все автоматические переменные малы, поэтому использование стека также разумно. Так куда же уходит 7,5 КБ? Возможно, вы пытаетесь использовать всю библиотеку вместо того, чтобы просто извлечь из нее реализацию AES?
В любом случае, эта реализация выглядит довольно просто, я бы предпочел придерживаться этого кода и попытаться оптимизировать его. Я знаю, что это может быть сложно, но изучение деталей AES может помочь вам, по крайней мере, оценить абсолютный минимум использования ОЗУ.
Обновление: я только что попытался скомпилировать эту библиотеку на IA-32 Linux и написать простой тест шифрования CBC AES-128. Получили следующие результаты (первое число - это длина шестнадцатеричного сечения):
Это всего 660 байт .bss (я объявил AES_CTX в качестве глобальной переменной). Большая часть .data занята IV и ключом. Я не включаю здесь .text, поскольку вы получите совершенно другой результат для PIC (разделы данных должны быть примерно одинакового размера на обеих архитектурах).
источник
Я знаю, что этот вопрос немного устарел, но мне только недавно пришлось его исследовать, поскольку я внедряю AES128 на PIC16 и 8051, и поэтому мне тоже был интересен этот вопрос.
Я использовал что-то вроде этого: http://cs.ucsb.edu/~koc/cs178/projects/JT/aes.c, и мое оперативное использование составляет пару сотен байт, а размер двоичного файла составляет менее 3 КБ ПЗУ.
Мой лучший совет - прочитать на странице Википедии http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation и разобраться в различных режимах, например, как AES в режиме OFB сорта использует режим ECB в качестве основного строительного блока. Также XOR (в режиме OFB) делает его симметричной операцией, поэтому шифрование / дешифрование - это та же функция, которая также экономит место.
Когда я понял, как на самом деле работает AES, я смог реализовать его на C, а затем проверить его на соответствие спецификации NIST ** (сделайте это! Большая часть кода, найденного в Интернете, имеет недостатки) и реализовать только то, что мне абсолютно необходимо.
Благодаря этой настройке и оптимизации я смог установить AES128 на 8051 вместе с некоторыми другими радиочастотными прошивками. Использование ОЗУ (для всей системы) снизилось с ~ 2,5 КБ до чуть ниже 2 КБ, что означает, что нам не пришлось обновляться до 8051 с 4 КБ SRAM, но мы могли продолжать использовать более дешевую версию 2 КБ SRAM.
** Тестовые векторы находятся в Приложении F в: http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf
РЕДАКТИРОВАТЬ:
Наконец-то получил код на Github: https://github.com/kokke/tiny-AES-c
Я немного оптимизировал размер. Вывод размера GCC при компиляции для ARM:
Таким образом, использование ресурсов теперь составляет 1 КБ кода, 204 байта ОЗУ.
Я не помню, как собрать для PIC, но если 8-битный AVR Atmel Mega16 похож на PIC, использование ресурсов:
Итак, 1.5K код и 198 байт оперативной памяти.
источник
Я недавно взял реализацию axTLS и работал над тем, чтобы уменьшить ее настолько, насколько мог. Вы можете легко создать S-блоки и сэкономить несколько сотен байтов.
Вы можете получить полный источник по адресу: http://ccodeblog.wordpress.com/2012/05/25/aes-implementation-in-300-lines-of-code/
источник
Я делал реализацию на C, только AES-128, называемую aes-min , с лицензией MIT. Он предназначен для небольших микропроцессоров (например, 8-разрядных) с небольшим объемом ОЗУ / ПЗУ.
Он имеет необязательный оперативный расчет расписания ключей для уменьшения требований к памяти (избегая необходимости полного расширенного расписания ключей в оперативной памяти).
источник
Вы можете найти эту реализацию интересной. Это из крипто-библиотеки AVR с открытым исходным кодом.
Вы можете найти общую (устаревшую) информацию и статистику о размере и производительности кода здесь .
AES:
Я играл только с источником SHA-1 из этой библиотеки, поэтому не могу комментировать AES.
источник
Я использую реализацию Texas for msp430 в микроконтроллере Freescale S08SH8 с 512 RAM и 8k флэш-памяти, а также в Arduino без каких-либо переделок.
http://www.ti.com/lit/an/slaa547a/slaa547a.pdf
http://www.ti.com/tool/AES-128
источник
Самый маленький AES128, который я написал для серии PIC, может работать с 900 инструкциями и 42 байтами оперативной памяти. Я использую это сам на серии PIC12, но PIC10F206 также возможно :-).
Я не могу раскрыть код, так как он от моей компании, но я написал его в asm для серии PIC10-12-16. Шифрование занимает 444 байта кода, включая справочную таблицу из 256 байтов, этот код также включает функцию загрузки ключа, которая составляет около 25 байтов.
Я бы всем посоветовал проверить наличие бумаги AES и реализовать ее самостоятельно! Большинство реализаций являются очень плохими и используют способ большого количества оперативной памяти.
Я также реализовал AES128 для dsPIC и PIC24 и использую примерно на 70% меньше места для кода по сравнению с lib микрочипа, и мой код также немного быстрее. Номера реализации dsPIC и PIC24:
«Шифрование занимает около 2995 циклов. 79.10uS при 40 MIPS, 197.75uS при 16 MIPS»
«DecKeySetup занимает около 567 циклов. 14.20uS при 40 MIPS, 35.43uS при 16 MIPS»
«Расшифровка занимает около 3886 циклов. 97.15uS при 40 MIPS, 242.88uS при 16 MIPS»
«Общий размер кода составляет 1050 слов, включая таблицы».
Прелесть ядра PIC24 в том, что некоторые инструкции являются 32-битными, и это значительно упрощает построение небольшой реализации AES128, мой код использует все доступные 32-битные инструкции и полностью 32-битный в работе, поэтому я могу быстро перенести код на PIC32 или другой 32-битный процессор.
AES очень просто реализовать, только большинство людей даже не пытаются!
Посмотрите на ссылку: http://www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf
источник