我有一个程序,它生成字节数组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
发布于 2013-04-15 02:23:00
这是,而不是,这是一个好主意,写你自己的加密算法。如果你复制它,甚至都不会。有许多侧面通道和其他意想不到的攻击,这真的是不鼓励的。
相反,我建议您使用众所周知的安全算法,如AES (因为您使用的是软件)或3DES (如果您想使用硬件方法)。如果您确实受到资源限制,需要更快的算法,也有非常快的对称密码,称为“轻量级对称密码”,但这是一个新的领域,它可能超出了您的应用程序的范围。
我的建议是使用具有这些算法的库,并针对您正在使用的设备进行优化(它们通常是用一些非常快的装配部件设计的)。如果您可以针对它们进行静态编译,那么您应该不会有比自己编码更多的开销。但他们的代码很可能更快、更安全。
关于压缩:只需记住在加密之前压缩,有各种原因,如速度,大小和熵来做到这一点。我听说过一些对压缩数据的攻击,这些数据后来被加密了,但我现在找不到它们。我不认为这是一个问题,除非你正在做一些特别关键的事情(想想:像SSL/TLS对一般互联网通信的影响)。
发布于 2013-04-15 04:14:52
您没有理由编写自己的压缩或加密代码,因为已经为您编写了大量测试的免费代码,这样做将是浪费时间,并且滚动您自己的代码将非常容易出现错误和安全漏洞。
您可以在嵌入式系统中使用现有代码。例如,zlib可以编译为根本不使用其他库。你不需要“加载”一个库。您可以简单地链接压缩例程,就好像它们是您自己编写的一样。
对于AES和many也是如此。implementations。out。there。
https://stackoverflow.com/questions/16002541
复制相似问题