c - 寻求可以在Delphi和C中处理整个文件加密/解密的单个文件加密实现

标签 c delphi encryption aes microcontroller

[更新] 我为此提供奖金。坦率地说,我不关心使用哪种加密方法。最好是像 XTEA、RC4、BlowFish 这样简单的东西……但你选择了。

我希望自己付出最少的努力,最好只是将文件放入我的项目中并构建。

理想情况下,您应该已经使用代码在 Delphi 和 C 中加密/解密文件(我想在 Atmel UC3 微处理器(用 C 编码)和 Windows PC(用 Delphi 编码)之间交换文件在两个方向加密和解密)。

强烈偏好单个 .PAS 单元和单个 .C/.H 文件。我不想使用支持数十种加密算法的 DLL 或库,只使用一种(而且我当然不希望安装程序有任何东西)。

我希望我在这里听起来不太挑剔,但我已经用谷歌搜索和尝试代码一个多星期了,但仍然找不到两个匹配的实现。我怀疑只有已经做过这件事的人才能帮助我......

提前致谢。


作为 my previous post 的跟进,我仍在寻找一些非常简单的代码,说明为什么我可以 - 以最小的努力 - 加密文件并在 PC 上的 Delphi 和 Atmel UC3 u 处理器上的 C 之间交换它。

这在理论上听起来很简单,但在实践中却是一场噩梦。有很多可能的候选者,我花了几天时间在谷歌上搜索并试用它们 - 但无济于事。

有些是 humonous 库,支持许多加密算法,我想要一些轻量级的东西(尤其是在 C/u 处理器端)。

有些看起来不错,但一组源仅提供 block 操作,其他的字符串(我更喜欢整个文件加密/解密)。

大多数文档似乎都很少,参数名称毫无意义,也没有调用函数的示例代码。

在过去的周末(再加上几天),我已经完成了大量的 XTEA、XXTEA 和 BlowFish 实现,但是虽然我可以加密,但我无法逆转这个过程。

现在我正在研究 AES-256。有没有人知道 C 中的实现是单个 AES.C 文件? (当然还有 AES.H)

坦率地说,我会采取任何可以在 Delphi 和 C 之间对整个文件进行加密/解密的操作,但除非有人自己实际这样做过,否则我希望听到的只是“任何符合标准的实现都应该这样做”——这是一个很好的理论,但对我来说并不适用:-(

C 中有任何简单的 AES-256 吗?我有一些看起来合理的 Delphi 代码,但在我一起尝试它们之前不能确定。

提前致谢...

最佳答案

我建议使用 .NET Micro Framework在辅助微 Controller (例如 Atmel SAM7X)上作为加密协处理器。您可以在 Netduino 上进行测试,您可以花大约 35 美元/30 英镑购买。该框架在 System.Security.Cryptography 命名空间下包含一个 AES 实现,以及可能对您有用的各种其他加密函数。这样做的好处是您可以获得经过全面测试的有效实现,并通过类型安全代码提高了安全性。

您可以使用 SPI 或 I2C 在两个微 Controller 之间进行通信,或者如果需要更高的吞吐量,则可以在多条 I/O 线上并行使用您自己的数据传输协议(protocol)。

我正是使用 Arduino 和 Netduino(使用 Netduino 为硬件 BitTorrent 设备散列数据 block )完成的,并使用通过 SPI 和中断机制在设备之间发送的各种命令实现了一个基本的异步系统。

  • Arduino 是 SPI 主机,Netduino 是 SPI 从机。
  • Netduino 上的一个 GPIO 引脚设置为输出,并连接到另一个 interrupt-enabled GPIO pin on the Arduino即设置为输入。这是中断引脚。
  • Arduino 发送 0xF1 作为“你好”初始化消息。
  • Netduino 发回 0xF2 作为确认。
  • 当 Arduino 想要散列一个 block 时,它会发送 0x48 (ASCII 'H') 后跟数据。发送完数据后,它会将 CS 设置为低电平。它必须发送整个字节;当接收到的位数不能被 8 整除时,将 CS 设置为低会导致错误。
  • Netduino 接收数据,并发回 0x68(ASCII 'h'),后跟作为 2 字节无符号整数的接收字节数。如果发生错误,它会发回 0x21(ASCII“!”)。
  • 如果成功,Netduino 会计算哈希值,然后将中断引脚设置为高电平。在计算时间内,Arduino 在等待期间可以自由地继续其工作。
  • Arduino 发送 0x52 (ASCII 'R') 请求结果。
  • Netduino 将中断引脚设置为低电平,然后发送 0x72(ASCII“r”)和原始哈希数据。

由于 Arduino 可以通过 GPIO 引脚处理中断,因此我可以让处理过程完全异步。 Arduino 端的一个变量跟踪我们当前是否正在等待协处理器完成其任务,因此我们不会在它仍在处理旧 block 时尝试向它发送新 block 。

您可以轻松地采用此方案来计算 AES block 。

关于c - 寻求可以在Delphi和C中处理整个文件加密/解密的单个文件加密实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13801231/

相关文章:

java - 用于 PKCS7 加密/签名的 Bouncy CaSTLe java 库的替代品?

c - 检测 -nostdlib 或仅检测 stdlib 是否可用

CUDA:具有共享内存和非 block 大小倍数的矩阵大小的平铺矩阵-矩阵乘法

c - 为什么 GCC 会给我 -Wjump-misses-init 警告?

multithreading - Delphi 7如何使Com对象等到程序初始化完成?

c# - 有人可以解释一下 C# CngKey.Create 吗?

c++ - 与守护进程交谈

delphi - 是否有可用于 Delphi 的备用 XML 模式导入器?

delphi - 如果出现 "not a valid win32 application"错误,如何在 Delphi XE4 中从源代码安装我自己的 Indy10 副本?

python - 用 Python 和 Objective C 解密