Найменша реалізація 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
Це для завантажувача?
Даніель Грілло

Ні, це для мережевого додатку
Toby Jaffey

Microchip має реалізацію для dsPIC та PIC 24, що має розмір коду 3018 байт, але він мав лише шифрування, не розшифровував. Здогадавшись, це не вирішує це для вас.
Kellenjb

@Kellenjb Цікаво, але я шукаю щось маленьке для 8-бітових мікросхем
Toby Jaffey

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 як глобальну змінну). Більша частина .даних зайнята IV та ключовими. Я не включаю .text сюди, оскільки ви отримаєте абсолютно різні результати на PIC (розділи даних повинні бути приблизно однакового розміру для обох архітектур).


Я неправильно прочитав коефіцієнт 10 у версії axTLS. Ти правий. Але мене все ж цікавлять більш ефективні версії AES ...
Toby Jaffey

5
Ефективний за розміром чи швидкістю? Які обмеження є насправді? Майте на увазі, що менші бібліотеки, ймовірно, будуть повільнішими - якщо вивчити вихідний код більшої (з точки зору розділу коду) бібліотеки, більша частина розшарування пояснюється попередньо обчисленими постійними масивами.
Code Painters

1
З точки зору оперативної пам’яті та ПЗП. Швидкість не є проблемою, але я прагну втягнути багато функціональних можливостей у невеликий пристрій.
Toby Jaffey

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'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

Редагувати:

Нарешті отримав код на 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,5 К і оперативна пам’ять 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/


Ви знаєте свої речі, Ендрю. Отримано. : D
Алекс

3

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

Він має необов'язковий розрахунок розкладу ключів на льоту, щоб зменшити потреби в пам'яті (уникаючи необхідності повного розкладеного розкладу ключів в оперативній пам'яті).


1

Ви можете знайти цю реалізацію цікавою. Це з криптовалюти з відкритим кодом AVR.

Ви можете знайти деякі загальні (застаріле) інформацію і статистичні дані про розмір коду та продуктивності тут .

AES:

Інформація про AES

Я грав лише з джерелом SHA-1 з цієї ліб, тому я не можу коментувати AES.



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


Чи це відкритий код? Чи можете ви опублікувати код?
Toby Jaffey

2
@Paul - Ласкаво просимо до Електроінженерії! Ваша відповідь цікава та обнадійлива, але вона не є корисною без деталізації. 900 інструкцій, ймовірно, можуть вміститися в кодовому блоці! Будь ласка, перейдіть за посиланням "редагувати" нижче відповіді, щоб покращити його.
Кевін Вермер

@PaulHolland чудова новина, де код?
Френк

2
@Paul - Ви б отримали купу анотацій замість того, що ви зараз маєте, якщо ви пояснили, як це написали та опублікували код! Якщо ви не можете опублікувати код з причин ліцензування, принаймні поясніть, як ви його написали та як Джобі може паралельно працювати.
Кевін Вермер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.