1
0
Files
cryptopal_rs/cryptopal_book/src/challenge_12.md
2025-08-31 16:03:40 +08:00

1.5 KiB
Raw Blame History

Challenge 12: Byte-at-a-time ECB decryption (Simple)

攻击思路

  1. 先填充随机字符,使得填充 + 未知明文刚好为16字节的倍数即1个block的长度。 检测方法为逐步填充当填充进去后密文长度刚好比先前多16字节时填充是刚好的。

    Note

    pkcs7的填充规则是如果数据长度正好是块大小的倍数仍然要添加一个完整的填充块。 此时最后一个块为全0x10

此时输入结构为:

[padding, unknown plaintext]
[16, 16, 16, ...,16]
  1. 此时开头加上一个猜解字节,然后加上pkcs7的padding。填充多一个字符。 此时输入结构为:
[some byte, 15, 15, ...,15]
[padding, unknown plaintext]
[last byte of unknown plaintext, 15, 15, ...,15]

通过对比第一个block的密文和最后一个block的密文即可知道一个字节。

  1. 对于第二个字节同样操作padding需要加多一byte
[some byte, known byte, 14, 14, ..., 14]
[padding, unknown plaintext]
[unknown byte, known byte, 14, 14, ..., 14]
  1. 在破解完一个block之后需要利用到已破解的部分
[some byte, known byte]
[known byte, padding]
[padding, unknown byte]
[some byte, known byte]
[known byte, 15, 15, ..., 15 ]

此时比较第一个block和倒数第2个block

  1. 在破解开始前,可通过总长度-填充长度,计算出未知明文的长度。 在破解长度与未知明文长度相同时,所得就是未知明文。