ECB Mode


简介

​ ECB 通过将明文分成n个大小的块,将每个块单独加密,从而得到一个密文。如果明文不能被块大小整除,那

么ECB模式则会通过附加一些字节从而使其能够被整除

​ 在ECB中,每个块是单独加密的,所以其相互独立


获取块的大小和明文的大小

​ 获取块大小应为解决ECB问题的第一步,可以通过纯手动来求解块的字节和明文的字节,假如加密输出的长度为八个字节,我在明文中添加一个字节,加密输出的长度没改变,但是在添加三个字节的时候,密文的长度就发生了改变,那么块的字节数就是密文突变字节的长度,从而让我们得到了块的字节大小

https://aes.cryptohack.org/ecb_oracle

题目作为示例

image-20240711114040731

以十六进制形式输入12个a时,则认为输入了6个字节,此时返回的密文十六进制长度为64,即32个字节

继续尝试输入第7个字节:

image-20240711114300089

​ 很容易可以发现,此时的密文长度发生了突变,并且是从32字节突变为48字节,由此可以定义块的长度为16字节。而因为在输入第七个字节时才发生的突变,由此可见,明文的字节数应为26(26+6=32)

由上述过程我们得到了块的大小 16字节 明文大小 26字节

image-20240711122602870

可以通过强行补充字节来暴力破解出明文,即一个个字符求解。即输入15个字节时查看一次明文,然后遍历所有字符去得到明文的单个字节,从而依次求解得到明文

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
import requests


# 字符串转16进制
def t_to_hex(t):
h = ''
for i in t:
h += str(hex(ord(i))[2:])
return h


# 获取返回的16进制数据
def getCipher(s):
url1 = "http://aes.cryptohack.org/ecb_oracle/encrypt/"
url = url1 + t_to_hex(s) + "/"
re = requests.get(url)
return re.text[15:-3]


# 求第一部分前15字节
c1 = ''
for i in range(0, 15):
p = 'a' * (15 - i)
text0 = getCipher(p)[:32]
for j in range(32, 127):
p_j = p + c1 + chr(j)
if text0 == getCipher(p_j)[:32]:
c1 += chr(j)
print(c1)
break

# c1 = 'crypto{p3n6u1n5'
# 求第二部分剩余的字节
c2 = c1
for i in range(9, 15):
p = 'a' * (16 - i)
text0 = getCipher(p)[32:64]
for j in range(32, 127):
p_j = p + c2 + chr(j)
if text0 == getCipher(p_j)[32:64]:
c2 += chr(j)
print(c2)
if chr(j) == "}":
exit()
break

# Y3J5cHRve3AzbjZ1MW41X2g0NzNfM2NifQ==

代码运行时间较长,待优化