feat: init books
This commit is contained in:
50
cryptopal_book/src/challenge_12.md
Normal file
50
cryptopal_book/src/challenge_12.md
Normal file
@@ -0,0 +1,50 @@
|
||||
# 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. 在破解开始前,可通过总长度-填充长度,计算出未知明文的长度。
|
||||
在破解长度与未知明文长度相同时,所得就是未知明文。
|
||||
Reference in New Issue
Block a user