我目前正在学习有关加密的知识,我希望能够对我学到的内容有更多的了解。
假设使用aes-128-cbc和随机IV加密消息“100美元应从账户123456移至555555”。我的教授说可以改变加密文本,这样当它再次被解密时,消息显示“900美元应该从账户123456移到555555”。你是怎么做的?
我尝试通过生成自己的密钥来自行计算,然后加密消息,然后将其转换为十六进制字符。从那里我可以换出一些字符然后解密?我试着玩这个,但似乎总是出错。
我们正在使用基本的linux命令行。
任何帮助或解释都会很棒!
答案 0 :(得分:3)
假设使用一次性密码对字符串进行加密,得到的密文为“B8B7D8CB9860EBD0163507FD00A9F923D45 ...”。我们知道明文的第一个字节,即数字1,具有ASCII码0x31。密文的第一个字节是0xB8。如果k0表示密钥的第一个字节,则0x31 xor k0 = 0xB8。解码一次性密钥只是用密钥对密文进行解密。因此,解码的人获得明文的第一个字节为0x31 = 0xB8 xor k0。如果我们用m0 xor密文的第一个字节,那么解码密文的人将获得(0xB8 xor m0)xor k0。但这只是(0xB8 xor k0)xor m0,因为xor是可交换的和关联的。最后一个表达式可以减少到0x31 xor m0。现在我们要将结果字节更改为0x39,即数字9的ASCII代码。因此我们需要求解0x31 xor m0 = 0x39。但这很简单只是xor,双方都是0x31。
使用CBC模式时也适用相同的原则。您可以通过类似的方式修改IV以更改已解码的消息。
答案 1 :(得分:1)
@ user515430上面的推理是基于这样一个事实,即每个密文C都与明文P线性相关(从C = P ⊕ K
开始)。
实际上,正如@polettix让我们注意到的那样,在CBC 加密中我们有,例如对于某个文本的第6个块,C₆ = E(P₆ ⊕ C₅, K)
,给出一个密钥K;如果E(·)是一个很好的加密函数,我们就会松散这种线性。
但是,在CBC 解密中,第6个明文块将作为P₆ = D(C₆, K) ⊕ C₅
获得,因此它将线性地不依赖于C₆,而是来自C5。
重写,如果你想在CBC中更改明文块,只需更改以前的chiphertext块。
另请参阅https://crypto.stackexchange.com/q/30407/36884(对于记录,Cryptography StackExchange是此类问题的正确站点。)