假设有一个二进制文件在CBC模式下使用AES加密(即使用密钥和初始化向量)。如果知道密钥但不知道密钥,那么完全解密文件容易吗?

有多难?

评论

欢迎使用密码学堆栈交换。我稍微更改了标题和标签,因为与CBC一起使用时,您的问题(和答案)实际上适用于所有分组密码,而不仅是AES。

是的,从最后一个块回到第一个块。我将在下面编写一个演示。

#1 楼

在CBC(密码块链接)模式下,在加密之前,每个块都与前一个块的密文进行XOR运算,以随机化块密码的输入(并避免使用相同的密钥对相同的块加密两次)给出相同的输出,并告诉攻击者有关明文的内容。
由于第一个块没有上一个块,因此这里将使用初始化向量。

解密时,我们将将块密码应用于每个密文块,然后将结果与前一个密文块(或第一个块的初始化矢量)进行异或。

因为所有密文块都是已知的,所以我们有了密钥,即使没有给出或错误的初始化向量,我们也可以可靠地解密除第一个块之外的所有内容。

对于第一个块,实际上我们没有任何信息,没有初始化向量,除此之外,它具有与任何其他块相同的长度(AES为16字节):每16字节pla可以通过提供配件IV来达到要求。幸运的是(或不幸的是,取决于您的观点),在许多文件格式中,前几个字节是固定的(或几乎固定,或者可以根据文件的其余部分猜测)。

所以,在CBC模式下,如果攻击者知道密钥,则秘密初始化向量几乎不提供任何保护。

通常适用:协议依赖于密钥为秘密,而初始化向量通常可以是公开的,甚至经常与密文一起传输。

在CTR模式下,一个秘密的初始化向量(称为“ nonce”)实际上会更多地帮助保持明文的秘密-但是如果攻击者甚至可以猜测一个明文块(并具有相应的密文块),他可以(给定密钥)计算出相应的计数器值,并由此得出随机数。不要让攻击者拥有钥匙。

#2 楼

PaŭloEbermann的回答很明确。对于使用openssl的工作示例,请考虑以下密文,该密文已使用AES-128-CBC加密。使用的加密密钥为1AFFB43263983EE5C3DC75BC5FF76D06,但iv未知:表示一个密文块。没有iv,我们不能解密第一个块,但是我们可以解密所有剩余的块。为此,我们只需删除密文的第一个块,然后将该块用作iv:

7ea9fac5d627a27f7c3ec776cc059bd0
8219a48d3a9b6e0ed263d2d54f7953c8
025ca84b88574ce567af96482598a496
0e76394cbe347fd5ddbca644272979cb
6ee3287d3ccc02520bfdd53c93c4de5b
b85488940d97f8295139c445defefb73


结果纯文本为:

echo -n '8219a48d3a9b6e0ed263d2d54f7953c8025ca84b88574ce567af96482598a4960e76394cbe347fd5ddbca644272979cb6ee3287d3ccc02520bfdd53c93c4de5bb85488940d97f8295139c445defefb73' | xxd -p -r | openssl aes-128-cbc -d -K 1AFFB43263983EE5C3DC75BC5FF76D06 -iv 7ea9fac5d627a27f7c3ec776cc059bd0 


您能猜出第一段明文是什么吗?

#3 楼

尽管IV通常在现实世界中是公开的,但让我假设您不知道的唯一IV是第一个,因为用于其他块的IV是相应的先前块:

C2 = Encryption (K, C1⊕P2)P2 = C1 ⊕ Decryption (K, C2)

上面的表达式可用于计算所有后续块;第一个计算如下:

C1 = Encryption (K, IV⊕P1)P1 = IV ⊕ Decryption (K, C1)

对于第一个块,我可以从IV⊕P1获得Decryption (K, C1)的值,因为我知道KC1

评论


$ \ begingroup $
不要忘记记住Kerckhoffs的原则:即使密码系统中除密钥以外的所有内容都是公共知识,密码系统也应该是安全的。
$ \ endgroup $
–Maf
20年4月16日在15:26