【问题标题】:How to make IvParameterSpec random but still decrypt如何使 IvParameterSpec 随机但仍解密
【发布时间】:2011-09-01 20:12:17
【问题描述】:

对于 Java 中的加密...http://cwe.mitre.org/data/definitions/329.html 上的文章指出,初始化向量每次都应该不同,但是如果我使用不同的 IV 来解密而不是使用加密的 IV,我会得到垃圾字符而不是我预期的数据。

在一台服务器上加密并在另一台服务器上解密而不必在服务器之间来回通信 IV 的正确方法是什么?

常见的技术似乎是硬编码一个字节数组,但据说这是不安全的???

【问题讨论】:

  • 您误解了这篇文章。每个加密消息的 IV 应该不同,但您必须使用相同的 IV 来解密用于加密它的给定消息。请参阅下面 Jon Skeet 的回答。

标签: java encryption


【解决方案1】:

相信 IV 就像盐一样 - 它不是秘密,它只是用来引入额外的随机元素,因此使用相同密钥加密的相同消息每次仍然会出现不同的结果.

因此,您可以将用于加密的 IV 作为加密值的一部分传输,就像您将盐与散列值一起存储一样。

当然,我可能完全不正确......

【讨论】:

  • 这是正确的,IV 与第一块纯文本异或,然后用密钥加密。剩余的块与前一个块进行异或。这称为密码块链接 (CBC)。您必须使用与加密相同的 IV 进行解密。这不是秘密,可以直接发送/存储。每次加密数据时都应该随机生成一个新的 IV。其目的是给加密数据增加随机性,所以同样的数据,用同样的密钥加密,会产生不同的密文。
  • 假设如果服务器加密明文,服务器必须将加密文本连同IV一起发送给客户端? IV 可以按原样以纯文本形式发送吗?
  • @kaze:不清楚你在说什么场景 - 但是是的,你可以将 IV 作为纯文本发送。
  • 因为 IV 用于加密期间(在服务器端),并且相同的 IV 再次用于该消息的解密(在客户端)。因此,服务器需要将加密消息和用于加密该消息的 IV 发送给客户端。如果我的理解是正确的,通过将 IV 作为纯文本发送给客户端(我们知道 CBC 是如何完成的)对安全性有任何危害吗?
  • @kaze:再一次,不,没关系。
猜你喜欢
  • 2022-01-23
  • 2020-03-20
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 2022-10-26
  • 2021-11-01
  • 2014-11-30
相关资源
最近更新 更多