【问题标题】:Compress and Encrypt a Byte Array in C在 C 中压缩和加密字节数组
【发布时间】:2013-04-06 19:42:47
【问题描述】:

我有一个程序可以生成字节数组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() 不同,因为我现在不在我的代码附近。我希望我的编码示例清楚地表明了我的意图。

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

【问题讨论】:

  • 你对一个问题关心太多,你的问题也不清楚,例如加密不一定是用户输入或密码,你也在引入新的网络解决方案的典型问题,例如数据损坏和网络/通信的可靠性(仅举2个例子),并且由于某些原因,您假设压缩数据总是最好的。以我有限的经验,我认为您需要一个可以让您抽象更多的层,并且当您根据需要放入文件时,它会处理协议,试试 0mq。
  • 这是一个链接zeromq.org
  • 无线协议是蓝牙,所以我觉得应该可靠地发送数据。我可能是错的......到目前为止,在测试中,数据已经完全通过,尽管我使用 Java DataInputStream readfully 方法来获取数据
  • 我了解 0MQ,但从跨许多不同系统的排队和任务交付系统的角度来看。这只是一个嵌入式芯片到另一个。
  • 如果您在压缩之前加密,您将不会得到任何压缩。

标签: c encryption binary embedded compression


【解决方案1】:

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

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

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

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

【讨论】:

  • 我要写入的无线流是蓝牙,但我宁愿自己加密数据,因为要使用大量 BT 开销和配对代码等。如果我记得在我的安全研讨会上,无线使用 RC4,这是一种对称加密。 -- 所以我想我应该研究为我的芯片优化的 ​​RC4 库?
  • RC4 是流密码,而 AESDES 是分组密码。流密码通常很快,但研究较少,也不太了解。作为基本规则,您应该说:如果您可以使用分组密码,请使用它们。如果确实不可行,请使用快速但安全的流密码。但是很难找到一个:RC4 不再是真正安全的了。您可能想查看eSTREAM,但正如您所见:目前很难找到好的流密码。
  • 是的,想想看,我们使用的不是流,而是块。我在我的问题中添加了一些信息,即我们正在运行 C 代码的芯片类型:atmel.com/devices/atmega168.aspx
【解决方案2】:

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

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

对于 AES,many 也是如此。 implementationsoutthere.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多