微控制器的最小AES实现?


38

谁能为微控制器推荐一个免费的小型AES-128 Rijndael实现。理想情况下,对于PIC18,尽管使用C进行通用实现是有用的。

为PIC18 编译axTLS实现并加密/解密模块需要6KB ROM和750b RAM。

为PIC18 编译rijndael-alg-fst.c并对块进行加密/解密需要28KB ROM和0.5KB RAM。

编译用于PIC18的Brian Gladman的8位AES并对模块进行加密/解密需要19KB的ROM和190字节的RAM。

是否有更好的优化的PIC特定变体可用?

(更新了axTLS版本的RAM要求)


1
这是引导加载程序吗?
Daniel Grillo

不,它用于网络应用程序
Toby Jaffey

Microchip具有dsPIC和PIC 24的实现,其代码大小为3018字节,但只有加密,没有解密。猜猜这并不能帮您。
Kellenjb 2011年

@Kellenjb有趣,但我正在寻找8位微米的小物件
Toby Jaffey

1
@mikeselectricstuff是的,它必须是AES。我正在尝试使用AES-128与现有系统进行互操作。我对任何小型AES实现都感兴趣,但是我目前的目标是PIC18。我正在使用HiTech Pro picc18编译器。
Toby Jaffey

Answers:


19

我想知道如何通过axTLS获得7.5kB的RAM使用率。查看代码,所有上下文都存储在此结构中:

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详细信息至少可以帮助您估计绝对的最小RAM使用量。

更新:我刚刚尝试在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上您将获得完全不同的结果(两种结构上的数据段大小几乎相同)。


我在axTLS版本上误读了10倍。你是对的。但是,我仍然对更高效的AES版本感兴趣...
Toby Jaffey

5
在大小或速度方面有效吗?实际上有什么限制?请记住,较小的库可能会比较慢-如果您查看较大的库(就代码部分而言)的源代码,则大多数膨胀是由于预先计算的常数数组引起的。
Code Painters

1
在RAM和ROM占用空间方面。速度不是问题,但我希望将很多功能塞入小型设备中。
Toby Jaffey

14

我知道这个问题有点老,但是最近我不得不自己研究它,因为我正在PIC16和8051上实现AES128,所以我也对此问题感到好奇。

我用过这样的东西:http : //cs.ucsb.edu/~koc/cs178/projects/JT/aes.c ,我的ram用法是几百个字节,二进制大小小于3kb ROM。

我最好的建议是在Wikipedia页面上阅读http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation 并了解不同的模式,例如OFB模式中的AES排序如何将ECB模式用作基本构建块。而且,异或运算(在OFB模式下)使其成为对称操作,因此加密/解密是相同的功能,还节省了空间。

当我了解AES的真正工作原理后,我可以在C中实现它,然后针对NIST规范进行测试**(执行此操作!网上找到的很多代码都有缺陷),仅实现我绝对需要的东西。

通过进行此自定义和优化,我能够将AES128与其他一些RF固件一起安装在8051上。(整个系统的)RAM使用量从约2.5kb降至2kb以下,这意味着我们不必升级到具有4kb SRAM的8051,但可以继续使用便宜的2kb SRAM版本。

**测试向量位于附录F中:http : //csrc.nist.gov/publications/nistpubs/800-38a/addendum-to-nist_sp800-38A.pdf

编辑:

终于在Github上获得了代码:https : //github.com/kokke/tiny-AES-c

我对尺寸进行了一些优化。为ARM编译时的GCC大小输出:

$ 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

因此,资源使用现在是1KB代码,204字节RAM。

我不记得如何为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代码和198bytes RAM。


我不知道我在2001年提出的实施方案会如何叠加。它不会生成S-box;他们是静态的。
卡兹(Kaz)2013年

6

我最近采用了axTLS实施,并尽我最大的努力来缩小它。您可以轻松地自己生成S-box,并节省数百个字节。

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
亚历克斯(Alex)

3

我一直在使用MIT许可证在C中执行仅AES-128的实现,称为aes-min。它针对具有少量RAM / ROM的小型微处理器(例如8位)。

它具有可选的即时密钥计划计算功能,以减少内存需求(避免在RAM中需要完整扩展的密钥计划)。


1

您可能会发现此实现有趣。它来自开源AVR加密库。

您可以在此处找到有关代码大小和性能的一些常规(过时)信息和统计信息。

AES:

AES信息

我只使用该库中的SHA-1源代码,因此无法评论AES。



0

我为PIC系列编写的最小AES128可在900条指令和42字节RAM中运行。我自己在PIC12系列上使用它,但PIC10F206也可以:-)。

由于我的公司提供了该代码,所以我无法透露它,但我在PIC10-12-16系列的asm中编写了该代码。加密需要444字节的代码,包括256字节的查找表,此代码还包括大约25字节的密钥加载功能。

我都会建议您检查一下AES纸并自己实施!大多数实现都是非常糟糕的,并且使用了很多ram和rom的方法。

我还为dsPIC和PIC24实现了AES128,与微芯片的lib相比,使用了约70%的代码空间,而且我的代码也快了一点。dsPIC和PIC24实现编号:

“加密大约需要2995个周期。40 MIPS时为79.10uS,16 MIPS时为197.75uS”

“ DecKeySetup大约需要567个周期。14.20uS @ 40 MIPS,35.43uS @ 16 MIPS”

“解密大约需要3886个周期。40 MIPS时为97.15uS,16 MIPS时为242.88uS”

“总代码大小为1050个单词,包括表。”

PIC24内核的优点在于,某些指令是32位的,这使构建小型AES128实现的工作变得更加轻松,我的代码使用了所有可用的32位指令,并且完全在32位操作中,因此我可以快速将代码移植到PIC32或其他32位cpu。

AES的实现非常简单,只有大多数人甚至都不尝试!

查看链接:http : //www.cs.bc.edu/~straubin/cs381-05/blockciphers/rijndael_ingles2004.swf


它是开源的吗?您可以发布代码吗?
Toby Jaffey

2
@Paul-欢迎来到电子工程!您的答案很有趣且令人鼓舞,但没有更多细节,它实际上并没有用。900条指令可能适合一个代码块!请使用答案下方的“编辑”链接进行改进。
凯文·维米尔

@PaulHolland好消息,代码在哪里?
弗兰克

2
@Paul-如果您解释了如何编写并发布了代码,您将获得一堆赞成票,而不是目前拥有的赞成票!如果由于许可原因而无法发布代码,请至少说明您是如何编写的以及Joby如何并行工作。
凯文·维米尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.