【问题标题】:Is it possible to NOT use the IV when implementing Rijndael decryption?实施 Rijndael 解密时是否可以不使用 IV?
【发布时间】:2011-09-05 13:17:11
【问题描述】:

我正在使用 Rijndael 算法对密文进行解密。不幸的是,我无法访问数据的加密,并且只提供了一个密码(用于生成密钥)和算法类型。

我没有盐(这似乎没问题),我也没有静脉注射。现在,我的问题是我是否绝对必须拥有 IV 才能执行解密?我怀疑编写加密的开发人员没有使用盐或 IV(如果这可能的话)。

我尝试将 IV 设置为 null,但没有成功,生成 Rijndael 实例会创建一个默认 IV,这会在解密后扭曲我明文的前 16 个字符。

有什么方法可以抵消IV的影响吗?或者是否需要尝试获取加密中使用的 IV?

【问题讨论】:

  • 也许你的密码的前 16 个字符 IV?
  • @GregS 在这种情况下我不这么认为。前 16 个字符只是垃圾,它们替换了我明文的前 16 个字符。从 char 17 开始的字符在正确的位置被正确解密。
  • 另一种可能性是 IV 始终为零。当不确定加密安全注意事项的人实施它时,有时会发生这种情况。此外,一些实现默认使用全零的 IV。在这种情况下,我会尝试 16 个零的 IV(二进制,而不是 ASCII)。
  • 是的,这正是发生的事情。与他们联系后,他们告诉我 IV 是用零生成的。感谢您的输入!对于任何感兴趣的人,这是用零填充 IV 的代码:myRijndael.IV = new byte[myRijndael.IV.Length];

标签: c# encryption rijndael


【解决方案1】:

如果密码已用于在 CBC 模式下加密(is the default),那么您必须知道 IV,没有办法绕过它。

但是,由于 IV 的用途与密码的用途不同,有时您会发现 IV 会添加到加密数据的前面(以便接收者在解密时可以轻松获取它以使用它)。

【讨论】:

  • 感谢您的回复。我不认为在这种情况下 IV 是前置的,但我可能会建议他们这样做。
【解决方案2】:

您可以使用 ECB 模式,它会忽略 IV。不过,对于 CBC 等其他模式,您需要 IV。

【讨论】:

  • ECB 模式不安全。 CTR 模式是安全的,不需要 IV,但您需要用于加密的 nonce。
【解决方案3】:

如果它是用 IV 加密的,那么是的,您需要 IV 才能正确解密。

根据您对前 16 个字符的描述,听起来您正在使用 CBC 模式。请参阅此处的图表了解您需要 IV 的原因:http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29

【讨论】:

  • @Henk:不,IV 只影响第一个块。第二个区块的 IV 等价于第一个区块的密文。
  • @Oli 感谢您的链接。他们更清楚地了解了 IV 实际在做什么。
猜你喜欢
  • 2017-08-02
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-08
  • 1970-01-01
相关资源
最近更新 更多