我有两段使用相同密钥的流密码加密的密文。
如何在不知道使用密钥的情况下恢复两个密文消息的明文?
我有两段使用相同密钥的流密码加密的密文。
如何在不知道使用密钥的情况下恢复两个密文消息的明文?
如果两条加密消息使用相同的流密码和相同的密钥,
C1 xor C2结果,M1 xor M2其中 C1 和 C2 是各自的密文,M1 和 M2 是相应的明文。
然后,您可以使用称为婴儿床拖动的技术恢复明文。您将可能出现在明文中的常见单词或短语(例如“ the”)与M1 xor M2. 如果其中一个明文具有婴儿床的文本(在我们的示例中为“ the ”),则异或的结果就是另一个明文在该位置的结果。如果两个明文都不包含婴儿床的文本,则异或的结果很可能只是胡言乱语。
您只需继续此技术,直到您恢复足够的明文以智能地填写其余部分。
这称为OTP 密钥重用攻击;你可以在这里找到答案(“cribtext drag”)。您拥有的消息越多(重复使用的密钥越多)越好。有了足够大的语料库,您甚至可能根本不需要 cribtext 拖动。
也就是说,您猜测可能出现在其中一个明文中的常用短语(针对 ASCII 英语的经典示例是 5 个字母“ the ”),并且对两个原始消息的异或异或进行异或地点。如果其中一个明文具有婴儿床的文本(在我们的示例中为“ the ”),那么异或的结果就是另一个明文在该位置的结果;如果明文都没有,那么异或的结果很可能只是胡言乱语。而且,一旦你有一个合理的短节,你可以扩展它(例如,如果你知道其中一个明文是“na**”,你可以浏览所有以“na”开头的单词的字典,使用那些作为婴儿床,看看哪个使其他明文有意义)。
当然,你只能使用几个消息的最短公共长度:如果你有一个 1500 字节,一个 1000 和一个 500,那么前 500 字节有一个三重用,后面 500 个有两个键,并且最后500不能被攻击。
除非 OTP也“及时”重用,即定期重用(它不再是 OTP,但有人可能会争辩说它一开始就不是,因为它正在被重用......)。这种错误是在一个品牌的加密硬盘上发生的,每个硬盘都有一个不同的 OTP 密钥,然后用于每个单独的扇区(包括归零的——一种极端形式的婴儿床),导致有效的加密强度为零。然后,如果原始 OTP 序列都包含在您有重复的消息中,您可以从这些消息中恢复密钥,然后愉快地继续解密其他所有内容。