说明
aes2.c 是从AVR231的IAR程序和VC程序中提取修改的aes加密解密算法子程序,aes.c 是在aes2.c 基础上优化得出的。
使用AVR Studio进行项目编辑和调试,使用默认优化级别(-s),选择晶体速度为8M。为了对比,选择了Mega8和Mega168作为仿真CPU,以及使用了WinAVR20071221和WInAVR20080512两个版本的编译器,分别进行了仿真测试。
仿真时,在每个断点处先将时钟清零,然后单步运行,这样可以得出每个子程序执行的时间。下面的aesEncrypt和aesDecrypt的运行时间都是解密或者解密一个数据块(16字节)的时间。
为了验证优化后的程序和优化前的加密是相同的,在watch中添加了变量dat,并在加密后进行观察比较。
单片机:Mega8
编译器:20080512
aes.c
KEY_COUNT 1 2 3
aesEncInit 3833 4316 4010 us
aesEncrypt 11719 14293 16868 us
aesDecInit 49323 49805 49500 us
aesDecrypt 1863 2245 2628 us
Code 2370 2396 2454 byte
RAM 868 868 868 byte
aes2.c
KEY_COUNT 1 2 3
aesEncInit 3961 4444 4138
aesEncrypt 12896 15732 18568
aesDecInit 49450 49933 49628
aesDecrypt 1499 1797 2098
Code 2730 2756 2814
RAM 868 868 868
编译器:20071221
aes.c
KEY_COUNT 1 2 3
aesEncInit 3711 4188 3914
aesEncrypt 13859 16910 19961
aesDecInit 49169 49646 49372
aesDecrypt 2114 2558 2999
Code 1910 1928 1950
RAM 868 868 868
aes2.c
KEY_COUNT 1 2 3
aesEncInit 3843 4312 4038
aesEncrypt 14221 17353 20486
aesDecInit 49303 49771 49497
aesDecrypt 1734 2093 2450
Code 2244 2258 2274
RAM 868 868 868
--------------------------------------
单片机:Mega168
编译器:20080512
aes.c
KEY_COUNT 1 2 3
aesEncInit 3834 4322 4011 us
aesEncrypt 11743 14323 16902 us
aesDecInit 49323 49812 49500 us
aesDecrypt 1870 2252 2637 us
Code 2486 2514 2570 byte
RAM 868 868 868 byte
aes2.c
KEY_COUNT 1 2 3
aesEncInit 3961 4450 4139
aesEncrypt 12896 15763 18604
aesDecInit 49451 49940 49628
aesDecrypt 1499 1806 2108
Code 2814 2890 2946
RAM 868 868 868
编译器:20071221
aes.c
KEY_COUNT 1 2 3
aesEncInit 3720 4203 3924
aesEncrypt 13963 17037 20111
aesDecInit 49178 49661 49383
aesDecrypt 2135 2583 3030
Code 2078 2098 2120
RAM 868 868 868
aes2.c
KEY_COUNT 1 2 3
aesEncInit 3843 4327 4048
aesEncrypt 14222 17476 20629
aesDecInit 49303 49787 49508
aesDecrypt 1734 2103 2462
Code 2328 2440 2456
RAM 868 868 868
WinAVR20071221编译出的代码竟然比WinAVR20080512还要小一些,但是运行速度慢一些。当然,优化效果与不同的C编译器、编译器版本、参数设置、表达式写法等都有一定的关系。
从上面还可以看出,优化代码大小后,解密速度有所下降。在使用128位密钥,解密一个块(16字节时),速度降低了约0.3-0.4ms。如果解密16K的程序空间,将多消耗 0.4 * 16 * 1024 / 16 = 0.4s,还是可以接受的。当然现在只是一个粗略的测试,最终的效果可能会有所提高。
文章评论(0条评论)
登录后参与讨论