11

寻找在 C 中加密字节数组的建议和一些参考代码。问题是我必须与其他例程一起适应1KByte内存,而 MCU 只有 8MHz。所以尺寸和速度是关键。我已经检查了 Rijndael,但它为我的 MCU 提供了巨大的表格。基本上我要在PC上加密intel hex格式,可能只有数据区,然后在MCU中解密。

使用动态内存分配例程是不可取的。

我的谷歌搜索把我带到了 C# 实现中,使用库。

更新:

解密端约束:

RAM: 512 byte
MAX code size: 512-1024 words
CPU: 8 bit, 8MHz
4

4 回答 4

14

我看到在嵌入式世界中使用的一个非常简单的加密算法是XXTEA

于 2013-01-03T10:21:17.310 回答
4

Rijndael 中的所有表都被定义为 GF2 中的简化操作。因此,我很想说可以写例如。1k 中的 128 位 AES。

另请参阅:https ://electronics.stackexchange.com/questions/13275/smallest-aes-implementation-for-microcontrollers

但是任何选择的算法都是安全性的一个次要因素,例如。如果密钥与二进制文件一起分发。在这种情况下,揭示原始二进制文件的最简单机制是通过模拟器运行代码并存储内存。

于 2013-01-03T15:42:58.550 回答
0

看看我调用的 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 只需要避免编译器完全优化encryptdecrypt输出):

➜  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
于 2020-06-06T08:21:59.177 回答
-1

我读过椭圆曲线加密(ECC)是一种新事物,旨在为微型处理器带来强大的加密。

Google of:
elliptic curve cryptography 微控制器
在列表顶部对 8 位微控制器上的实现进行了讨论。

但也许考虑转移到 Stack Exchange。例如,这可能很有用:

Stack Exchange Crypto - 4-8 位微控制器的密码学类型

于 2013-01-05T09:10:54.920 回答