1.5 KiB
1.5 KiB
Challenge 12: Byte-at-a-time ECB decryption (Simple)
攻击思路
- 先填充随机字符,使得填充 + 未知明文刚好为16字节的倍数(即1个block的长度)。
检测方法为,逐步填充,当填充进去后,密文长度刚好比先前多16字节时,填充是刚好的。
Note
pkcs7的填充规则是,如果数据长度正好是块大小的倍数,仍然要添加一个完整的填充块。 此时最后一个块为全0x10
此时输入结构为:
[padding, unknown plaintext]
[16, 16, 16, ...,16]
- 此时开头加上一个猜解字节,然后加上pkcs7的padding。填充多一个字符。 此时输入结构为:
[some byte, 15, 15, ...,15]
[padding, unknown plaintext]
[last byte of unknown plaintext, 15, 15, ...,15]
通过对比第一个block的密文和最后一个block的密文,即可知道一个字节。
- 对于第二个字节,同样操作,padding需要加多一byte:
[some byte, known byte, 14, 14, ..., 14]
[padding, unknown plaintext]
[unknown byte, known byte, 14, 14, ..., 14]
- 在破解完一个block之后,需要利用到已破解的部分:
[some byte, known byte]
[known byte, padding]
[padding, unknown byte]
[some byte, known byte]
[known byte, 15, 15, ..., 15 ]
此时比较第一个block和倒数第2个block
- 在破解开始前,可通过总长度-填充长度,计算出未知明文的长度。 在破解长度与未知明文长度相同时,所得就是未知明文。