0

我有一个程序可以生成字节数组unsigned * char并使用 fwrite 通过无线流将该数据发送出去。

我想将该字节数组压缩并加密为另一个字节数组,但由于我在嵌入式系统上运行代码,我宁愿不加载新库;我宁愿自己写出压缩和加密函数。

所以,换句话说,我的程序如下:

void send(STREAM* s, unsigned* char byteArr) {
  fwrite(s, byteArr);
}

相反,我想创建一个函数:

void send(STREAM* s, unsigned* char byteArr) {
    unsgiend* char compressedArr = compressCharArr(byteArr);
    unsigned* char encryptedArr = encryptCharArr(compressedArr)
    fwrite(s, encryptedArr);
}

unsigned* char encryptedArr(unsigned* char byteArr) {
  // make the encrypted byte array (?)
}

unsigned* char compressedArr (unsigned* char byteArr) {
  // make the compressed byte array (?)
}

我的问题是:我可以自己写出什么简单的算法来用 C 语言完成这个任务?我更喜欢只涉及标准 C 代码、没有库、只有数学、for 循环等的东西。

至于加密,我知道加密需要通信两端的密钥/密码。很好,让我们假设密钥是共享的并且我们使用的是对称加密。

我不介意使用与 zip、7zip、gzip 相同的算法——我知道这些压缩系统还包括加密/密码保护。我只是不确定如何在不将库、DLL 等插入嵌入式系统的情况下简单地实现它。

PS - 我的语法可能与 fwrite() 不一致,因为我现在不在我的代码附近。我希望我的编码示例清楚地表明了我的意图。

ADD:我要提一下,C 代码运行在一个名为“Atmega168”的芯片上......所以如果使用库是唯一可靠的方法,那么任何人都可以推荐针对这种芯片优化的库吗?http://www.atmel.com/devices/atmega168.aspx

4

2 回答 2

4

编写自己的加密算法不是一个好主意甚至,如果你复制它。有许多旁道和其他意想不到的攻击,它真的不鼓励。

相反,我建议您使用众所周知的安全算法,例如AES(因为您使用的是软件)或3DES(如果您需要硬件方法)。如果您确实需要更快的算法的资源受限,那么还有称为“轻量级对称密码”的非常快速的对称密码,但这是一个新领域,它可能超出了您的应用程序的范围。

我的建议是使用具有这些算法并针对您正在使用的设备进行优化的库(它们通常设计有一些非常快的装配部件)。如果您可以针对它们进行静态编译,那么您应该不会比自己编写代码有更多的开销。但他们的代码很可能更快、更安全。

关于压缩:请记住在加密之前进行压缩,这样做有多种原因,例如速度、大小和熵。我听说过一些针对之后加密的压缩数据的攻击,但我现在找不到它们。我不会认为这是一个问题,除非你正在做一些特别重要的事情(想想:像 SSL/TLS 对一般互联网通信的影响)。

于 2013-04-14T18:23:00.360 回答
2

您没有理由编写自己的压缩或加密代码,因为已经使用经过大量测试的免费代码为您完成了,这样做会浪费时间,而且您自己编写的代码非常容易出现错误和安全漏洞。

您可以在嵌入式系统中使用现有代码。 例如, zlib可以编译为根本不使用其他库。您不需要“加载”库。您可以简单地链接压缩例程,就好像您自己编写它们一样。

AES 也是如此,有许多. 实现出来那里

于 2013-04-14T20:14:51.973 回答