寻找在c中加密字节数组的建议和一些参考代码。问题是我必须适合1KByte内存以及其他例程和MCU只有8MHz。所以大小和速度是关键。我已经检查过Rijndael,但它有巨大的表为我的MCU。基本上我将在PC上加密英特尔十六进制格式,可能只有数据区,然后在MCU中解密。
使用动态内存分配例程是不可取的。我的谷歌搜索给我带来了所有的c#实现,使用库。
更新:解密端约束:
RAM: 512 byte
MAX code size: 512-1024 words
CPU: 8 bit, 8MHz
我看到在嵌入式世界中使用的一个非常简单的加密算法是XXTEA
Rijndael中的所有表都被定义为GF2中的简单操作。因此,我想说这是可能的。128位AES在1k。
参见:https://electronics.stackexchange.com/questions/13275/smallest-aes-implementation-for-microcontrollers
但是任何选择的算法在安全性方面都是一个次要因素。如果密钥与二进制文件一起分发。在这种情况下,揭示原始二进制文件的最简单机制是通过模拟器运行代码并存储内存。
看看我修改过的XTEA,我叫它Simple Tea
:
#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;
}
}
在AVR上产生<250字节的操作码(这里只需要if
s,以避免编译器优化encrypt
和decrypt
完全退出):
➜ 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
我读到椭圆曲线加密(ECC)是一种旨在为微型处理器带来强大加密的新事物。
Google of:
椭圆曲线密码微控制器
在列表的顶部给出关于8位微机上实现的讨论。
但也许可以考虑转移到Stack Exchange。例如,这可能是有用的:
堆栈交换密码。4-8位微控制器的密码类型