AES 加密如何传输 IV

Posted

技术标签:

【中文标题】AES 加密如何传输 IV【英文标题】:AES encryption how to transport IV 【发布时间】:2012-02-06 22:35:35 【问题描述】:

我了解唯一 IV 在加密以防止频率分析等攻击方面很重要。问题:For AES CBC encryption, whats the importance of the IV? 有一个非常明确的答案,解释了 IV 的重要性。

以明文形式发送 IV 是否存在安全漏洞?或者是否需要使用用于发送对称密钥的相同公钥/私钥对其进行加密?

如果 IV 需要加密发送,那么为什么不每次都生成一个新的对称密钥并将 IV 视为密钥的一部分呢?生成对称密钥的成本是否太高?还是尽量减少传输的数据量?


Secret vs. Non-secret Initialization Vector 的最佳答案是:

典型的密钥建立协议将导致双方都参与计算一段数据,但只有他们自己知道。使用 Diffie-Hellman(或其任何椭圆曲线变体),所述共享数据块具有固定长度,并且它们无法控制其值(它们只是获得相同的看似随机的位序列)。

两个实体如何在没有共享信息的情况下得出“相同的看似随机的比特序列”?共享信息是加密发送的假设吗?而且,如果共享信息是加密发送的,为什么不直接发送 IV 加密呢?


由于应用程序需要安全地传输对称密钥,因此将 IV 与密钥本身分开似乎本质上是一种优化。还是我错过了什么?

【问题讨论】:

我过去使用的一个方案是每次生成一个随机密钥,并使用先前共享的公钥/私钥对加密密钥和 iv。我从来没有觉得这会显着增加 AES 有效负载(对于我的使用而言),但可能极其有限的通信协议可能对大小有更严格的要求 【参考方案1】:

以明文形式发送 IV 没有安全漏洞——这类似于以明文形式存储哈希值:只要攻击者无法控制 IV/salt,并且它是随机的,没有问题。

【讨论】:

【参考方案2】:

初始化向量和密钥之间的主要区别是密钥必须保密,而 IV 不必保密 - 它可以被攻击者读取,而不会对相关加密方案的安全性。

这个想法是您可以对多条消息使用相同的密钥,只为每条消息使用不同的(随机)初始化向量,因此纯文本之间的关系不会显示在相应的密文中。

也就是说,如果您正在使用像 Diffie-Hellman 这样的密钥协商方案,无论如何它都会为每个会话提供一个新的共享密钥,您也可以使用它来生成第一个初始化向量。与直接选择初始化向量并将其与消息一起发送相比,这并没有真正提供太多的安全优势,但可以节省一些带宽,以及来自随机源的一些熵。如果其中一个合作伙伴的随机性来源不好(尽管在这种情况下 DH 也不是真正安全的),它会使 IV 更加随机。

两个实体如何在没有共享信息的情况下得出“相同的看似随机的比特序列”? 共享信息是加密发送的假设吗?而且,如果共享信息是加密发送的, 为什么不直接发送加密的 IV?

Diffie-Hellman 基于群论问题:Eve 知道一个(循环)群 G 和生成器 g,并看到两个值 g^a(从 Alice 传输到 Bob)和 g^b (从 Bob 传输给 Alice),其中ab 是 Alice 和 Bob 选择的随机大整数,Eve 甚至其他伙伴都不知道)。然后共享密钥为(g^a)^b = g^(a·b) = (g^b)^a。显然 Bob(谁知道b)可以计算出秘密为(g^a)^b,而Alice(谁知道a)可以计算出(g^b)^a。 Eve 不知何故需要导出这个秘密来破解协议。

在某些组中,这(称为计算 Diffie-Hellman 问题)似乎是一个难题,我们在密码学中使用这些组。 (在原始 DH 中,我们使用一些大型有限素数域的乘法群的素数阶子群,在椭圆曲线 DH 中,我们使用有限域上的椭圆曲线群。其他群也有效(但其中一些是弱,例如在一个场的加法组中它是微不足道的)。)

然后 Alice 和 Bob 都使用密钥派生函数来派生实际的密钥材料(即双向加密密钥、MAC 密钥和起始 IV)。

【讨论】:

以上是关于AES 加密如何传输 IV的主要内容,如果未能解决你的问题,请参考以下文章

正确使用AES对称加密

正确使用AES对称加密

随机数在密码学中的作用

如何安全地为 AES CBC 加密生成 IV?

如何使用AES在一个程序中加密,在另一个程序中解密

AES_CBC_PKCS5Padding 加密