嵌入式系统对称加密算法

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

你想使用 XOR 吗?这在多态恶意软件加密中更常见。这只是一个想法! - Grijesh Chauhan
2
@GrijeshChauhan:除非您将其用作一次性密码本,否则XOR不是加密方法。 - Kris
表格通常不是问题,只要它们包含常量。常量可以存储在持久性存储器(ROM、EEPROM、Flash)中,而不是RAM中。唯一需要存储在RAM中的部分是状态。在密码学中不存在所谓的“十六进制格式”,只有二进制数据。十六进制(十进制)是使用[标签:编码]将该二进制数据表示为字符的表示形式。看起来像是吹毛求疵,但如果你没有正确理解这一点,你就会遇到麻烦。 - Maarten Bodewes
@owlstead:原始数据是以Intel HEX格式存储的,因此我必须读取数据区域,将其转换为字节数组,执行编码,将其放回到Intel HEX格式中,调整校验和并发送到设备引导加载程序。因此,我只会加密/解密数据块。这应该可以提供一些错误检查,并且在数据块损坏的情况下,我可以重新传输数据。设备缓冲区(RAM)不太大,无法一次性容纳所有数据。但我对任何其他方法都持开放态度。 - Pablo
没问题。解码十六进制,加密,重新编码为十六进制,都可以。对称加密不关心格式,它操作的是二进制数据,并返回二进制数据。编码/解码不在密码算法的范围内。 - Maarten Bodewes
显示剩余2条评论
4个回答

14

我在嵌入式领域看到过一种非常简单的加密算法,它叫做XXTEA


我刚刚尝试了XXTEA,看起来非常快速和小巧。如果没有更好的选择,我会选择它并接受这个答案。 - Pablo
我在引导加载程序中使用了XTEA(XXTEA的前身),它非常易于实现,速度快且占用空间小。对于廉价产品来说,XTEA / XXTEA应该足够安全。我可以推荐它。 - jeb

4

+1 给链接和建议。密钥并未分发,而是存储在设备的引导程序中,很难破解(但有可能)。解密应该从引导程序中运行。 - Pablo

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只是为了避免编译器完全优化掉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

-1

我已经了解到椭圆曲线加密(ECC)是旨在为微型处理器提供强大加密的新技术。

通过谷歌搜索:
椭圆曲线加密 微控制器
可以看到讨论8位微控制器实现的内容排在榜首。

但也许考虑转到Stack Exchange。例如,这可能会有所帮助:

Stack Exchange Crypto - Types of Cryptography for a 4-8 bit microcontroller


2
你不会单独使用ECC进行加密。您将其与对称加密一起用作密钥交换机制。OP没有表明他需要非对称性。 - CodesInChaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接