【问题标题】:Symmetric encryption algorithm for embedded system嵌入式系统的对称加密算法
【发布时间】:2012-12-17 16:38:17
【问题描述】:

寻找在 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,更常用于多态恶意软件加密。这只是一个想法!
  • @GrijeshChauhan : XOR 不是一种加密方法,除非您将其用作一次性密码。
  • 表通常不是问题,只要它们包含常量。常量可以存储在持久内存(ROM、EEPROM、闪存)中,而不是 RAM。唯一需要存储在 RAM 中的部分是 state。密码学中没有“十六进制格式”之类的东西,只有二进制数据。十六进制(十进制)是在该二进制数据的字符中使用encoding 的表示。看起来像是在吹毛求疵,但如果你没有做到这一点,你遇到麻烦。
  • @owlstead:我说的是Intel HEX format。我提到过,以防万一会有一些基于该数据格式的想法。该程序将从 Flash 的 Bootloader 区域运行,并对 Flash 芯片和 EEPROM 的其余部分进行编程。引导加载程序限制为 512-1024 个字。我没有其他地方可以存储这些表,因此这是一个问题。我非常了解十六进制表示和编码,谢谢。
  • 好的,所以请确保您的问题包含持久性和暂时性内存限制。请在将数据存储到英特尔 HEX 编码文件之前对数据执行加密/解密 - 文件本身的格式应该无关紧要。

标签: c encryption cryptography embedded avr


【解决方案1】:

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

【讨论】:

  • 我刚刚试用了 XXTEA,看起来非常快速和小巧。如果没有更好的结果,我会去接受这个答案。
  • 我在引导加载程序中使用了 XTEA(XXTEA 的前身),它非常容易实现、快速且占用空间小。对于便宜的产品,XTEA/XXTEA 应该足够安全。我可以推荐它。
【解决方案2】:

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

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

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

【讨论】:

  • +1 链接和建议。密钥未分发,但它位于设备本身的 bootrom 中,这很难破解(但可能)。解密应该从 bootrom 运行。
【解决方案3】:

看看我称为Simple Tea的XTEA修改版:

#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 上产生 ifs 仅用于避免编译器完全优化 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

【讨论】:

    【解决方案4】:

    我了解到椭圆曲线加密 (ECC) 是旨在为微型处理器带来强大加密的新事物。

    Google 的:
    椭圆曲线密码微控制器
    在列表顶部讨论了 8 位微控制器上的实现。

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

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

    【讨论】:

    • 您不会单独使用 ECC 进行加密。您将其与对称加密一起用作密钥交换机制。 OP 没有表明他需要不对称。
    猜你喜欢
    • 1970-01-01
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    相关资源
    最近更新 更多