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

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

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

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

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

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

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

37 голосов | спросил Toby Jaffey 20 AMpWed, 20 Apr 2011 03:00:09 +040000Wednesday 2011, 03:00:09

7 ответов


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,5kB идти? Возможно, вы пытаетесь использовать всю библиотеку вместо того, чтобы просто извлекать из нее реализацию AES?

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

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

 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 (разделы данных должны быть почти одинакового размера на обеих архитектурах).

ответил Code Painters 22 PMpFri, 22 Apr 2011 13:59:29 +040059Friday 2011, 13:59:29
14

Я знаю, что этот вопрос немного устарел, но мне недавно пришлось самому его исследовать, поскольку я реализую AES128 на PIC16 и 8051, поэтому мне тоже было интересно узнать об этом вопросе.

Я использовал что-то вроде этого: http: //cs.ucsb.edu/~koc/cs178/projects/JT/aes.c и мое использование бара составляет пару сотен байт, а двоичный размер меньше 3 КБ ROM.

Мой лучший совет - прочитать на странице Википедии http://en.wikipedia.org/вики /Block_cipher_modes_of_operation и понимать различные режимы, например, как AES в режиме OFB sorta использует режим ECB в качестве основного строительного блока. Также XOR'ing (в OFB-режиме) делает его симметричной операцией, поэтому шифрование /дешифрование является той же функцией, которая также экономит пространство.

Когда я понял, как работает AES, я мог бы реализовать его на C, настроив фрагмент кода, найденный в Интернете, а затем протестировал его по спецификации NIST ** (сделать это! много кода, найденного в Интернете, является ошибочным) и только реализовать то, что мне абсолютно необходимо.

Мне удалось установить AES128 на 8051 вместе с некоторыми другими прошивками RF, выполнив эту настройку и оптимизацию. Объем использования ОЗУ (для всей системы) снизился с ~ 2,5 кбайт до чуть ниже 2 кб, что означает, что нам не нужно было обновлять до 8051 с 4 КБ SRAM, но он мог продолжать использовать более дешевую версию SRAM на 2 КБ.

** Тест-векторы приведены в приложении F в: http://csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf

EDIT:

Наконец, получил код в Github: https://github.com/kokke/tiny- AES-с

Я немного оптимизировал размер. Размер 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 байта ОЗУ.

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

$ 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-байтовая оперативная память.

ответил Morten Jensen 15 Mayam12 2012, 05:06:34
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/

ответил Andrew 26 Mayam12 2012, 06:31:54
3

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

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

ответил Craig McQueen 26 FriEurope/Moscow2014-12-26T12:34:37+03:00Europe/Moscow12bEurope/MoscowFri, 26 Dec 2014 12:34:37 +0300 2014, 12:34:37
1

Вы можете найти эта реализация интересна. Его из крипто-libary с открытым исходным кодом AVR.

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

AES:

Информация AES

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

ответил Rev1.0 30 Maypm14 2014, 19:50:01
1

Я использую реализацию 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

ответил 30 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 30 Sep 2013 04:30:47 +0400 2013, 04:30:47
0

Самый маленький AES128, который я написал для серии PIC, может работать в 900 инструкциях и 42 байтах ОЗУ. Я использую его сам в серии PIC12, но PIC10F206 также возможен :-).

Я не могу раскрыть код, так как это из моей компании, но я написал его в asm для серии PIC10-12-16. Шифрование занимает 444 байта кода, включая таблицу поиска из 256 байтов, этот код также включает функцию загрузки ключа, которая составляет около 25 байт.

Я бы советовал проверить бумагу AES и реализовать ее самостоятельно! Большинство реализаций являются очень плохими и используют способ для большого количества ram и rom.

Я также реализовал AES128 для dsPIC и PIC24 и использовал примерно на 70% меньше пространства кода по сравнению с библиотекой микрочипа, а мой код также немного быстрее. номера внедрения 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 18 J000000Monday11 2011, 00:57:04

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132