【问题标题】:Incompatible AES implementations?不兼容的 AES 实现?
【发布时间】:2013-07-08 00:22:59
【问题描述】:

我从site 编译了一些 AES 实现代码,它应该执行 128 位密钥加密。我测试了可以协同工作的加密/解密程序。

但是,如果我使用上述代码加密任何内容,然后尝试使用 linux 内置的 openssl 工具对其进行解密,我就是无法解密它,它甚至会记录我 错误的幻数 错误。同样,如果我使用 openssl 加密任何内容并尝试使用代码解密将不起作用。我尝试了两个 cbc ecb。

如果他们都在实现 AES,它不应该以同样的方式工作吗?

【问题讨论】:

  • 信息太少,无法确定。 AES 有不同的模式,例如 CBC 或 CFB,什么样的填充(null、PKCS7 等)以及进入的数据。密钥和初始化向量是否相同?发布相关代码并展示您如何使用 OpenSSL,应该有助于诊断。
  • 好吧,你说得对,我要进行一些编辑...
  • 到目前为止,我在这里提供更多信息:stackoverflow.com/questions/17517156/…
  • AES 只是低级算法。还有密钥编码、填充、块链接模式等的选择。如果这些选择不同,那么实现将不会直接兼容。
  • 看起来 C 代码正在使用 ECB 并且没有填充。所以尝试加密一条 16 字节的消息(倍数),后跟 16 字节的值 16(pkcs#7 填充)。或在 openssl 中使用 16 个字节的消息(倍数)和 --nopad(更有可能工作)。另外,使用 -ecb-128 或其他任何名称。

标签: c algorithm encryption aes


【解决方案1】:

看起来 C 代码正在使用 ECB 并且没有填充。所以尝试加密一条 16 字节的消息(倍数),后跟 16 字节的值 16(pkcs#7 填充)。或在 openssl 中使用 16 字节的消息(倍数)和 --nopad (更有可能工作)。另外,使用 aes-128-ecb 或其他任何名称。

分组密码适用于“块”文本 - 在这种情况下,它有 16 个字符长。因此,如果您不想担心填充,则需要提供确切数量的块。

此外,ecb 模式(在没有额外处理的情况下依次执行每个块)对于许多用途来说并不安全。请参阅维基百科文章(查看企鹅照片)。

[编辑:] [编辑 2:]

> echo -n "abcdabcdabcdabcd" > msg
> wc msg
 0  1 16 msg
> openssl enc -aes-128-ecb -nopad -in msg -K 0 -S "" -iv ""
[noise]
> openssl enc -aes-128-ecb -nopad -in msg -K 0 -S "" -iv "" | wc
 0 1 16

自己试试上面的方法,看看其他代码是否解密(编辑 2 显式设置密钥,并删除 IV 和 salt - 在这种情况下不确定后两者的用途)。

[编辑 3:]

据我所知,问题与密码转换为密钥的方式有关。 openssl 似乎正在做一些我无法摆脱的额外事情,除非我将密钥指定为十六进制 (-K 0)。如果我这样做,其他程序将无法运行(需要密码)。

抱歉,我没办法了。

【讨论】:

  • 对不起,如果问它很愚蠢,我该如何做 16 字节消息的倍数和 16 字节的值 16?
  • openssl aes-128-ecb -nopad -in msg -out output 尝试并得到:错误解密 139963007211200:错误:0607F08A:数字信封例程:EVP_EncryptFinal_ex:数据不是块长度的倍数:evp_enc.c:414:
  • msg 必须正好是 16 个字符。例如(不带引号且不返回)“abcdabcdabcdabcd”
  • 目前没有结果。我试过:openssl enc -aes-128-ecb -nopad -nosalt -in msg -k hola -out a,得到了 16 字节的输出。但是 other 代码并没有很好地解密它
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 2017-03-17
相关资源
最近更新 更多