如何通过CBC或ECB模式检测消息是否加密?
我制作了一个函数,它在AES 128 CBC或ECB中随机加密,我在明文和密文之间进行切换,但接缝与密码模式无关。
如何检测分组密码模式?
提前感谢
问题陈述中几乎给出了答案:
请记住,欧洲央行的问题在于它是无国籍的确定性;相同的16字节明文块将始终产生相同的16字节密码文本。
因此,假设一些重复的明文块出现在相同的密文块偏移处,我们可以简单地继续寻找不同长度的重复密文块。
我正在做同样的问题集,刚刚完成了这个问题(使用clojure)。
我的第一个提示是,如果您使用的语言支持第一类函数/lambdas,那么您需要做什么将更加清楚。
无论如何,让我们把问题分解一下:
首先,只需编写一个函数,验证blackbox是否正在使用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
根据密码文本%16、24或32计算块大小,其中==0
hamming距离应该由密码块1和其他密码块完成
如果我们使用浮点算术对每个字节求平均值,如果值低于某个阈值,那么它就是ECB。
我知道你正在做的确切练习,我现在正在自己做。我建议对加密的字符串进行频率分析(不要忘记字符串可能是base64'd或hex)。如果你得到的频率分布与你编码的字符串的语言相匹配,那么可以放心地假设它在ECB中,否则它可能是CBC。
我不知道这是否真的有效,因为我现在只是在做练习,但这只是一个开始。
编辑:
我匆忙地回答了这个问题,觉得我应该多解释一下。如果它是在ECB模式下加密的,那么频率分析应该显示正态分布样式,而不管所用字符串和密钥的开始/结束是否有任何填充。CBC模式下的加密应该具有非常随机且可能是平坦的分布。