假设我有一个crypto provider,即:我给提供者一些明文字节,并得到加密的结果。
我不知道所使用的加密方法,但我知道它使用的是块密码,而块密码的操作方式类似于欧洲央行(每个块都是单独加密的=> 2相同的明文块,如果没有前缀的话,应该会导致两个相同的密文块),因此容易受到不同的填充攻击。
crypto provider可以在纯文本中添加前缀和后缀,但我不知道它们是否和多长。
我想对这个crypto provider执行不同的填充攻击(检测前缀和后缀长度,在线性时间内使用蛮力后缀,去掉预和后缀,.)。
实际上,一切都正常,但我需要知道crypto provider使用的填充方法是否在添加填充块(如果是length of the plaintext % blocksize == 0 )。否则,我计算前缀+后缀的长度可能是错误的。
给出所描述的情况,是否有一种方法可以检测到这一点,而不必测试确切使用的填充方案?
我做自动取款机:
要检测blocksize和prefix + suffix长度,首先对一个字节进行加密,获取cipertext (cipher_a)的长度,然后将一个字节添加到明文(plaintext_n)中,直到cipertext (cipher_n)的长度与第一个字节一样大。
现在我知道了:
blocksize = length(cipher_n) - length(cipher_a)
如果所使用的填充确实添加了一个空的填充块:
fixes_length = length(cipher_a) - length(plaintext_n)
否则:
fixes_length = length(cipher_a) - length(plaintext_n) -1
简短的例子,(希望)说明问题所在。
假设:blocksize = 3,prefix = "xx",suffix = "yy":
有一个空的填充块:
╔═══════╦═════════════╦═════════╗
║ Chars ║ Plaintext ║ Blocks ║
╠═══════╬═════════════╬═════════╣
║ 1 ║ xxa yy- ║ 2 ║
║ 2 ║ xxa ayy --- ║ 3 ║
╚═══════╩═════════════╩═════════╝在这种情况下,计算是正确的。
blocksize = 3
fixes_length = 6 - 2 = 4
没有空的填充块:
╔═══════╦═════════════╦═════════╗
║ Chars ║ Plaintext ║ Blocks ║
╠═══════╬═════════════╬═════════╣
║ 1 ║ xxa yy- ║ 2 ║
║ 2 ║ xxa ayy ║ 2 ║
║ 3 ║ xxa aay y-- ║ 3 ║
╚═══════╩═════════════╩═════════╝这个fixes_length是错的。
blocksize = 3
fixes_length = 6 - 3 = 3
我对密码学比较陌生,所以如果我的术语不对,请原谅。
发布于 2016-01-24 00:50:53
恐怕没有有效的方法来了解所部署的填充方法,除非它是由编写原始代码的人的描述提供的。您必须尝试强行使用填充方案来估计所使用的填充方案。
https://crypto.stackexchange.com/questions/32131
复制相似问题