如何检测块密码模式

17

如何检测消息是由CBC还是ECB模式加密的?

我写了一个函数,可以随机使用AES 128 CBCECB进行加密,并对明文密文进行汉明距离计算,但似乎不关联密码模式

如何检测块密码模式

提前感谢您的回答。


如果只有您的代码执行加密和解密操作,那么您可以添加一个额外的字节,例如0或1(取决于密码模式),并在处理有效负载之前检查它。另一个选项是在解密时首先尝试CBC,如果失败则尝试ECB。 - Bimalesh Jha
1
很抱歉,如果明文或密文中没有可靠的区分元素,您将无法可靠地检测块密码模式。这些块应该与随机数据不可区分。幸运的是,通常情况下明文不会呈现出随机性。如果您确实使用了CBC模式,则应该使用IV,因此IV可以成为一个区分特征。话虽如此;你到底为什么要随机地使用CBC或ECB加密? - Maarten Bodewes
2
这是一个密码学练习。目标是检测密码模式,因此我编写了一个函数来随机使用CBC和ECB来测试我的检测函数。 - Xantra
4个回答

11

问题陈述中已经给出了答案:

请记住,ECB的问题在于它是无状态和确定性的;相同的16字节明文块将始终产生相同的16字节密文。

因此,假设某些重复的明文块出现在相同的密文块偏移量上,我们可以直接寻找各种长度的重复的密文块。


1
还有一件需要注意的事情是,AES-ECB 的密钥长度为 128 位(16 字节)。如果不知道这个(对某些人来说很明显)事实,你会像我一样绕来绕去! - tejaswi prakash

2
我正在做同一套问题集,刚刚完成了这个问题(使用Clojure)。
我的第一个提示是,如果您使用支持一级函数/lambda的语言,则需要做什么将更清晰。
无论如何,让我们稍微分解一下这个问题:
首先,只需编写一个函数,该函数验证黑盒是否使用ECB加密数据。 您会如何做到这一点?
它可能看起来像(下面是伪代码)
function boolean isEcbBlackbox(func f) 
{   //what input can I use to determine this?
    result = f("chosen input")
    if(result ...) {//what property of result should I look for?
        true
    } else {
        false
    }
}

记住,ECB的关键弱点是相同的明文块将被加密为相同的密文块。
编辑:挑战现在已经公开,所以我将链接到我的解决方案。

https://github.com/dustinconrad/crypto-tutorial/blob/master/src/crypto_tutorial/lib/block.clj#L118


2
我现在感觉真的很愚蠢...我想这个问题从来没有告诉你要加密什么类型的文本,输入某种类型的文本会使这个练习变得非常容易,我已经有一个函数可以做到这一点,当我做检测重复异或练习时就已经有了... - Garry Welding
据我理解,在这个挑战中,“黑盒函数”不能用任意输入进行评估。只有选定的预计算密文可用。因此,进行这种高阶函数评估并没有太大用处。 - crishoj
所以我有意将问题分解为一个更简单的子问题,以帮助他理解基本概念。一旦你掌握了这个概念,将其应用于固定输入就会更容易。我的感觉是,如果你被喂饱了结果,那么你学到的东西会少得多,即使路线有些迂回。 - RedDeckWins
@RedDeckWins 如果他正在逐一解决这些挑战,那么他已经实现了你的“提示”,因为那正是早期挑战之一... - fstd
挑战现在已经公开,因此我已在答案中链接了我的解决方案。 - RedDeckWins
显示剩余3条评论

0

根据密文%16或24或32计算块大小,使其等于0

汉明距离应由密码块1与其余密码块完成

如果我们使用浮点算术平均每个字节,如果该值低于某个阈值,则为ECB。


-2

我知道你正在做的练习,我现在也在做。我建议对加密字符串进行频率分析(不要忘记字符串可能是base64编码或十六进制编码)。如果你得到的频率分布与编码字符串的语言匹配,则可以安全地假设它是ECB模式,否则可能是CBC模式。

我不知道这是否真的有效,因为我现在只是在做练习,但这是一个开始。

编辑:

我有点匆忙回答了这个问题,感觉应该解释得更多一些。如果它是以ECB模式加密的,则无论字符串和密钥的填充如何,频率分析都应该显示出正常的分布样式。而以CBC模式加密的加密应该具有非常随机且可能是平坦的分布。


1
经过反思,我不太确定你的建议是否可行,因为块大小为16字节。如果输入块中的1位发生变化,则密码块将完全不同(在CBC和ECB中相同)。因此,对字节值频率进行频率分析没有意义!我是对还是错? - Xantra
抱歉,我上面说错了,应该是ECB而不是CBC。 - RedDeckWins
2
对不起,请忘记我的回答。我已经尝试过了,完全没用。我还尝试过使用卡方检验和蒙特卡罗方法来测试真正的随机性,但是由于它采用AES加密,所以毫不意外地通过了这两个测试。今天我给他们发了电子邮件请求帮助解决这个挑战。但是我收到了以下回复:“如果这不清楚,你可以选择输入到预言机。”...... 不用说,这根本没有帮助到我。 - Garry Welding
2
@GarryWelding,这是一个有用的提示。 - RedDeckWins
2
啊,现在我明白了,这真的很容易,我做了太复杂的研究,员工的答案非常有帮助。 - Xantra
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接