Наименьшая реализация AES для микроконтроллеров?

38

Может кто-нибудь порекомендовать небольшую бесплатную реализацию AES-128 Rijndael для микроконтроллеров. В идеале, для PIC18, хотя общая реализация на C была бы полезна.

Компиляция реализации axTLS для PIC18 и шифрование / дешифрование блока требует 6 КБ ПЗУ и 750b ОЗУ.

Компиляция rijndael-alg-fst.c для PIC18 и шифрование / дешифрование блока требует 28 КБ ПЗУ и 0,5 КБ ОЗУ.

Для компиляции 8-битного AES Брайана Гладмана для PIC18 и шифрования / дешифрования блока требуется 19 КБ ПЗУ и 190 байтов ОЗУ.

Существуют ли лучше оптимизированные варианты для PIC?

(обновлены требования к ОЗУ для версии axTLS)

Тоби джеффи
источник
1
Это для загрузчика?
Даниэль Грилло,
Нет, это для сетевого приложения
Тоби Джаффей,
Microchip имеет реализацию для dsPIC и PIC 24, которая имеет размер кода 3 018 байт, но она имеет только шифрование, но не дешифрование. Угадай, что это не значит для тебя.
Келленджб
@Kellenjb Интересно, но я ищу что-то маленькое для 8-битных
микросхем
1
@mikeselectricstuff Да, это должен быть AES. Я пытаюсь взаимодействовать с существующей системой, используя AES-128. Я заинтересован в любой небольшой реализации AES, но в настоящее время я нацеливаюсь на PIC18. Я использую компилятор HiTech Pro picc18.
Тоби Джаффей

Ответы:

19

Мне интересно, как вы получили 7,5 КБ оперативной памяти с помощью AxTLS. Глядя на код, весь контекст хранится в этой структуре:

typedef struct aes_key_st 
{
    uint16_t rounds;
    uint16_t key_size;
    uint32_t ks[(AES_MAXROUNDS+1)*8];
    uint8_t iv[AES_IV_SIZE];
} AES_CTX;

Размер этой структуры 2 + 2 + 4 * 15 * 8 + 16 = 504. Я не вижу глобальных переменных в aes.c, все автоматические переменные малы, поэтому использование стека также разумно. Так куда же уходит 7,5 КБ? Возможно, вы пытаетесь использовать всю библиотеку вместо того, чтобы просто извлечь из нее реализацию AES?

В любом случае, эта реализация выглядит довольно просто, я бы предпочел придерживаться этого кода и попытаться оптимизировать его. Я знаю, что это может быть сложно, но изучение деталей AES может помочь вам, по крайней мере, оценить абсолютный минимум использования ОЗУ.

Обновление: я только что попытался скомпилировать эту библиотеку на IA-32 Linux и написать простой тест шифрования CBC AES-128. Получили следующие результаты (первое число - это длина шестнадцатеричного сечения):

 22 .data         00000028  0804a010  0804a010  00001010  2**2
                  CONTENTS, ALLOC, LOAD, DATA
 23 .bss          00000294  0804a040  0804a040  00001038  2**5
                  ALLOC

Это всего 660 байт .bss (я объявил AES_CTX в качестве глобальной переменной). Большая часть .data занята IV и ключом. Я не включаю здесь .text, поскольку вы получите совершенно другой результат для PIC (разделы данных должны быть примерно одинакового размера на обеих архитектурах).

Исполнители кода
источник
Я неправильно прочитал в 10 раз версию AxTLS. Вы правы. Но я все еще заинтересован в более эффективных версиях AES ...
Тоби Джаффей
5
Эффективен с точки зрения размера или скорости? Каковы ограничения, на самом деле? Имейте в виду, что меньшие библиотеки, вероятно, будут работать медленнее - если вы посмотрите на исходный код больших (с точки зрения раздела кода) библиотек, большая часть раздувания происходит из-за предварительно вычисленных константных массивов.
Исполнители кода
1
С точки зрения оперативной памяти и ПЗУ. Скорость не проблема, но я собираюсь встроить множество функций в маленькое устройство.
Тоби Джаффей
14

Я знаю, что этот вопрос немного устарел, но мне только недавно пришлось его исследовать, поскольку я внедряю 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:

$ 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

Таким образом, использование ресурсов теперь составляет 1 КБ кода, 204 байта ОЗУ.

Я не помню, как собрать для PIC, но если 8-битный AVR Atmel Mega16 похож на PIC, использование ресурсов:

$ 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

Итак, 1.5K код и 198 байт оперативной памяти.

Мортен Дженсен
источник
Интересно, как реализация, которую я сделал в 2001 году , складывалась. Он не генерирует S-блоки; они статичны.
Каз
6

Я недавно взял реализацию axTLS и работал над тем, чтобы уменьшить ее настолько, насколько мог. Вы можете легко создать S-блоки и сэкономить несколько сотен байтов.

static uint8_t aes_sbox[256];   /** AES S-box  */
static uint8_t aes_isbox[256];  /** AES iS-box */
void AES_generateSBox(void)
{
    uint32_t t[256], i;
    uint32_t x;
    for (i = 0, x = 1; i < 256; i ++)
    {
        t[i] = x;
        x ^= (x << 1) ^ ((x >> 7) * 0x11B);
    }

    aes_sbox[0] = 0x63;
    for (i = 0; i < 255; i ++)
    {
        x = t[255 - i];
        x |= x << 8;
        x ^= (x >> 4) ^ (x >> 5) ^ (x >> 6) ^ (x >> 7);
        aes_sbox[t[i]] = (x ^ 0x63) & 0xFF;
    }
    for (i = 0; i < 256;i++)
    {
         aes_isbox[aes_sbox[i]]=i;
    }
}

Вы можете получить полный источник по адресу: http://ccodeblog.wordpress.com/2012/05/25/aes-implementation-in-300-lines-of-code/

Эндрю
источник
Вы знаете свои вещи, Эндрю. Upvoted. : D
Алекс
3

Я делал реализацию на C, только AES-128, называемую aes-min , с лицензией MIT. Он предназначен для небольших микропроцессоров (например, 8-разрядных) с небольшим объемом ОЗУ / ПЗУ.

Он имеет необязательный оперативный расчет расписания ключей для уменьшения требований к памяти (избегая необходимости полного расширенного расписания ключей в оперативной памяти).

Крейг МакКуин
источник
1

Вы можете найти эту реализацию интересной. Это из крипто-библиотеки AVR с открытым исходным кодом.

Вы можете найти общую (устаревшую) информацию и статистику о размере и производительности кода здесь .

AES:

AES информация

Я играл только с источником SHA-1 из этой библиотеки, поэтому не могу комментировать AES.

rev1.0
источник
0

Самый маленький 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

PaulHolland
источник
Это с открытым исходным кодом? Вы можете опубликовать код?
Тоби Джаффи
2
@Paul - Добро пожаловать в электроинжиниринг! Ваш ответ интересный и обнадеживающий, но без подробностей он не очень полезен. 900 инструкций, вероятно, могли бы поместиться в блоке кода! Пожалуйста, перейдите по ссылке "изменить" под ответом, чтобы улучшить его.
Кевин Вермеер
@PaulHolland отличные новости, где код?
Фрэнк
2
@Paul - Вы получите кучу голосов «против» вместо того, что у вас есть, если бы вы объяснили, как вы это написали, и разместили код! Если вы не можете опубликовать код по причинам, связанным с лицензированием, хотя бы объясните, как вы его написали и как Джоби мог бы сопоставить вашу работу.
Кевин Вермеер