首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果您控制IV,您可以更改AES加密消息吗?

如果您控制IV,您可以更改AES加密消息吗?
EN

Cryptography用户
提问于 2020-10-24 19:51:52
回答 1查看 2K关注 0票数 2

假设攻击者拥有特定消息的明文、密文和IV。如果攻击者能够控制密文和IV,他能伪造有效的明文吗?假设消息比块大小短,只有几个字节。攻击者可以通过更改IV来更改明文的值吗?

EN

回答 1

Cryptography用户

发布于 2020-10-25 01:04:51

考虑使用AES-CBC-256加密明文消息attack at noon!!的情况,使用密钥7ac01f50605b8fcebd1c82ea6a6aacd6b112e8c9675b84cd77054b2f49668301和iv f822ee7b8c0a8ba40daa773b01d9485a

代码语言:javascript
复制
echo -n 'attack at noon!!' | openssl aes-256-cbc -e -nopad -K 7ac01f50605b8fcebd1c82ea6a6aacd6b112e8c9675b84cd77054b2f49668301 -iv f822ee7b8c0a8ba40daa773b01d9485a | xxd -p

明文消息的长度为一个块(16个字节),不使用填充,因此产生一个密码文本块:

代码语言:javascript
复制
8b2f9ede941cb6f3958d809510f579a5

当然,如果您使用相同的密钥和iv解密上面的密文,您将得到原始明文:

代码语言:javascript
复制
echo -n '8b2f9ede941cb6f3958d809510f579a5' | xxd -p -r |  openssl aes-256-cbc -d -nopad -K 7ac01f50605b8fcebd1c82ea6a6aacd6b112e8c9675b84cd77054b2f49668301 -iv f822ee7b8c0a8ba40daa773b01d9485a

生产:

代码语言:javascript
复制
attack at noon!!

现在,知道原始明文(attack at noon!!)、密文和iv的攻击者希望修改iv,以便解密时生成的明文是attack at dawn!!

要了解如何做到这一点,请参阅下面的图表(从https://en.wikipedia.org/wiki/Block_密码学_模式_的_操作复制):

考虑标记E. E的点是使用密钥对密文的第一个块(在这种情况下是唯一块)的AES解密。我们不知道钥匙,所以我们不能计算E.

或者我们可以吗?进一步看,第一个密文块是E XOR IV。XOR函数是唯一的:如果A XOR B= C,那么您可以按任何顺序重新排列A、B和C,表达式仍然成立--即A XOR C= B,B XOR C=A。所以:

代码语言:javascript
复制
Plaintext = E XOR IV
E = Plaintext XOR IV
IV = E XOR Plaintext

因此,知道原始明文(attack at noon!!)和IV (f822ee7b8c0a8ba40daa773b01d9485a),我们可以计算E。为此,我们使用E=明文XOR IV (上面)。首先,使用以下命令获取明文的底层ascii解码字节的十六进制表示:

代码语言:javascript
复制
echo -n 'attack at noon!!' | xxd -p

这就产生了:

代码语言:javascript
复制
61747461636b206174206e6f6f6e2121

现在,XOR --纯文本和IV --获得E,如下所示:

代码语言:javascript
复制
python3 -c "print (hex(0x61747461636b206174206e6f6f6e2121 ^ 0xf822ee7b8c0a8ba40daa773b01d9485a))"

这就产生了:

代码语言:javascript
复制
0x99569a1aef61abc5798a19546eb7697b

所以,E是99569a1aef61abc5798a19546eb7697b

现在,我们可以计算出IV应该是什么,这样当加密文本用我们巧尽心思构建的IV被AES-CBC解密,而E得到XOR与这个IV时,产生的明文将是我们想要的明文‘黎明时的攻击!’。为此,我们使用IV =E明文(上面)。首先,获取所需明文的底层ascii解码字节的十六进制表示形式,就像我们以前做的那样:

代码语言:javascript
复制
echo -n 'attack at dawn!!' | xxd -p

这就产生了:

代码语言:javascript
复制
61747461636b206174206461776e2121

现在,XOR使用E来获取我们需要的IV纯文本,如下所示:

代码语言:javascript
复制
python3 -c "print (hex(0x61747461636b206174206461776e2121 ^ 0x99569a1aef61abc5798a19546eb7697b))"

这就产生了:

代码语言:javascript
复制
0xf822ee7b8c0a8ba40daa7d3519d9485a

让我们看看它是否有效。让我们使用上面的解密命令来欺骗密文,使用iv f822ee7b8c0a8ba40daa7d3519d9485a代替f822ee7b8c0a8ba40daa773b01d9485a

代码语言:javascript
复制
echo -n '8b2f9ede941cb6f3958d809510f579a5' | xxd -p -r |  openssl aes-256-cbc -d -nopad -K 7ac01f50605b8fcebd1c82ea6a6aacd6b112e8c9675b84cd77054b2f49668301 -iv f822ee7b8c0a8ba40daa7d3519d9485a

毫无疑问,所产生的明文是:

代码语言:javascript
复制
attack at dawn!!

*特别感谢安热尔在问题下的评论中帮助我解决这个问题。

票数 3
EN
页面原文内容由Cryptography提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://crypto.stackexchange.com/questions/85785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档