寻找用于在C中加密字节数组的建议和一些参考代码。问题是我必须与其他例程一起装入1KByte内存,MCU仅为8MHz。因此,大小和速度是关键。我已经检查了Rijndael,但它具有适用于我的MCU的庞大表。基本上,我将在PC上加密intel hex格式,可能只在数据区域加密,然后在MCU中解密。
不希望使用动态内存分配例程。
我的Google搜索使用库将我带到了C#实现中。
更新:
解密方约束:
RAM: 512 byte
MAX code size: 512-1024 words
CPU: 8 bit, 8MHz
我看到在嵌入式世界中使用的一种非常简单的加密算法是XXTEA
Rijndael中的所有表在GF2中均定义为简单操作。因此,我很想说有可能写例如。 1k中的128位AES。
但是任何选择的算法在安全性上都是次要因素,例如如果密钥与二进制文件一起分发。在这种情况下,公开原始二进制文件的最简单机制是通过仿真器运行代码并存储内存。
看看我命名为Simple Tea
的XTEA的简化版本:
Simple Tea
在AVR上产生<250字节的操作码(这里的#include <avr/io.h>
#include "simple_tea.h"
uint8_t secret_data[] = {0xFE, 0x67};
SimpleTEA<sizeof(secret_data) / 2> tea;
int main()
{
unsigned int rounds{16};
uint8_t key[] = {0x45, 0x74, 0x32, 0x11, 0x98, 0x94, 0xAB, 0xCF, 0x90, 0xAE, 0xBA, 0xDC, 0x06, 0x16, 0x81, 0x95};
secret_data[0] = PINB;
tea.encrypt(rounds, secret_data, key);
if (secret_data[0] & (PINB))
{
PORTC = 0x05;
}
secret_data[1] = PINB & (1 << 2);
tea.decrypt(rounds, secret_data, key);
if (secret_data[0] & (PINB))
{
PORTC = 0x50;
}
}
仅在避免编译器完全优化if
和encrypt
时才需要:]
decrypt
我已经读到椭圆曲线加密(ECC)是旨在将强大的加密技术引入小型处理器的新事物。
[的Google:椭圆曲线密码微控制器在列表顶部产生有关8位微控制器的实现的讨论。
但也许考虑迁移到Stack Exchange。例如,这可能很有用:
➜ Encryption git:(master) ✗ avr-gcc -std=c++17 -Os -mmcu=atmega328p main.cpp -o main
➜ Encryption git:(master) ✗ avr-size main
text data bss dec hex filename
214 2 1 217 d9 main
➜ Encryption git:(master) ✗ avr-nm --size-sort -C -r --radix=d main
00000044 T main
00000022 T __do_copy_data
00000016 T __do_clear_bss
00000002 D secret_data
00000001 B tea