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