【问题标题】:Wrong decryption of initial 16 bytes by Perl Crypt:Rijndael module [closed]Perl Crypt:Rijndael 模块对初始 16 个字节的错误解密 [关闭]
【发布时间】:2026-01-27 08:05:04
【问题描述】:

我正在使用Crypt::Rijndael 模块来解密一些应用程序数据。

我给出了加密数据、加密密钥和客户端 IV 作为输入。

在 432 个字节的应用程序数据中,解密输出的前 16 个字节总是错误的。

什么可能导致这个问题?

【问题讨论】:

  • 向我们展示一些代码,并请解释在这种情况下“错误”是什么意思。
  • 我建议您通过电子邮件发送给该模块的作者 Brian D Foy ,他是这里的偶尔贡献者。
  • 我们怎么知道你做错了什么?
  • @ikegami 通过了解这种特殊情况下的 CBC 模式加密
  • 代码是,使用 Crypt::Rijndael;我的 $crypted = pack("H*",加密的应用程序数据);我的 $key = pack("H*","4ffd099494d9cc0d0a6e238209038f27d56da73c8ce376e0b58678f1dd3d9656");我的 $iv = pack("H*", "6907fd4a18bacd7bbfb0bf61b28cd37c");我的 $cipher = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_CBC()); $cipher->set_iv($iv);我的 $plaintext = $cipher->decrypt($crypted); #my $hex = 解压 "H*",$plaintext;打印 $plaintext;

标签: perl cryptography encryption rijndael


【解决方案1】:

16 个字节是 128 位,与 AES/Rijndael 块大小相同。如果前 16 个字节是垃圾,然后是完整的消息,那么可能发生的情况是 IV 已预先添加到消息中,并且您正在尝试解密 IV 以及消息。为了解决,提取传入密文的前 16 个字节并将其用作 IV。

或者,您有 16 个字节的垃圾,后跟部分消息,缺少前 16 个字节。在这种情况下,您可能使用了错误的 IV。确保您使用的是正确的 IV。逐个字节地检查它以确保它是正确的。特别是,确保正确处理传输 IV 时使用的任何编码。如果 IV 中有一点是错误的,你就会有问题。

【讨论】:

  • 您好,感谢您的回复。我从客户端日志中检查了 IV 是否正确。我也尝试了您的第一个建议。没有任何效果。该套件是 AES_256_CBC_SHA。我需要与 SHA 做一些事情。我假设它用于 MAC 身份验证,与解密无关。
  • 代码是,使用 Crypt::Rijndael;我的 $crypted = pack("H*",加密的应用程序数据);我的 $key = pack("H*","4ffd099494d9cc0d0a6e238209038f27d56da73c8ce376e0b58678f1dd3d9656");我的 $iv = pack("H*", "6907fd4a18bacd7bbfb0bf61b28cd37c");我的 $cipher = Crypt::Rijndael->new($key, Crypt::Rijndael::MODE_CBC()); $cipher->set_iv($iv);我的 $plaintext = $cipher->decrypt($crypted); #my $hex = 解压 "H*",$plaintext;打印 $plaintext;
  • MAC 一般长于 16 字节。 SHA-256 应该产生一个 32 字节的 MAC。您能否编辑您的问题以显示您对前 32 个字节的期望以及您实际得到的内容。这将有助于诊断问题。
  • 我正在从 Wireshark 获取加密数据并尝试解密。MAC 密钥长度为 20 个字节。问题是直接在加密数据上使用加密密钥不会解密我的前 16 个字节显示一些垃圾 16 位的应用程序数据。这里 MAC 的用途是什么。是因为 MAC 的前 16 个字节没有正确解密吗?
  • @rossum 实际上,我正在加密我的消息并将其发送到服务器,而没有在密文中添加 IV。 IV 附加到有效负载,但不是密文。其次,当我从服务器获取数据并对其进行解密时,它给了我 16 个字节的错误。请帮忙。
最近更新 更多