在C中压缩和加密字节数组

时间:2013-04-14 18:10:36

标签: c encryption binary embedded compression

我有一个生成字节数组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-loops等的东西。

至于加密,我知道加密需要通信两端的密钥/密码。没关系,假设密钥是共享的,我们使用对称加密。

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

PS - 我的语法可能因fwrite()而关闭,因为我现在不接近我的代码。我希望我的编码示例能清楚地表明我的意图。

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

2 个答案:

答案 0 :(得分:4)

编写自己的加密算法是一个好主意。如果你复制它,甚至都没有。有许多侧流道和其他意外攻击,真的气馁。

相反,我建议您使用一个众所周知的安全算法,如AES(因为您使用的是软件)或3DES(您是否需要硬件方法)。如果你真的 资源限制你需要更快的算法,那么也有非常快的对称密码称为“Leightweight Symmetric Ciphers”,但这是一个新领域,它可能超出了你的应用范围。 / p>

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

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

答案 1 :(得分:2)

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

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

使用many的AES也是如此。 implementationsoutthere