1

在 AES 中加密数据时,我很难理解 IV(初始化向量)的正确使用。

准确地说,我不确定将随机生成的 IV 存储在哪里:在我的脚本中,数据将被加密,然后保存到文件中,然后程序将终止。在下一个会话期间,必须解密先前保存的数据。如果我对 IV 的理解是正确的,我必须使用与加密相同的 IV 进行解密(但每个加密过程都使用另一个随机 IV)。因此,我必须将 IV 存储在某个地方——有些人建议将其添加到加密数据之前,但如果我做对了,那在我的情况下将不起作用,因为我需要 IV才能解密它。

这是正确的还是我误解了什么?我想避免在一些未加密的纯文本设置文件或其他内容中保存加密/散列密钥和 IV(即使本身已散列)。

4

1 回答 1

1

IV 本身不是敏感数据;它只是用来加扰第一个密文块的状态,并且不能从 IV 本身恢复加扰(密钥添加在“秘密”因素中)。

对于“正确”的链接模式,IV 与密文是分开的(加密和解密都需要初始 IV),并且必须单独存储并单独传递给加密库 API。加密后,您可以随心所欲地存储 IV - 只是不要丢失它;)。

您当然可以在密文中“添加”/“添加”,因此您只需要存储一个数据块 - 但您只需在解密之前将其拆分,因为这是 API 所期望的。

执行 IV 的“不正确”方式(例如,如果您的加密库 API 不支持原生 IV,但支持链接)只是在加密之前将单个随机数据块添加到纯文本中。在这种情况下,没有任何 IV 可以单独存储 - 您只需加密整个 IV+消息二进制对 - 然后您只需在解密后删除第一个数据块。您预先添加的“随机数据”具有与真实 IV 相同的约束(不要使用相同的密钥重用相同的随机数据等)。

这两种方法在 API 级别在语义上有所不同,但对实际加密的影响是相同的(无法预测地对实际有效负载的第一个块进行扰码)。

就 IV 的使用方式而言 - 有许多可能的方案。请参阅此处有关块链的维基百科文章,以方便的图片显示当 IV 真正单独存储时如何在各种链模式下使用。

https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation

于 2016-08-03T14:32:33.917 回答