ECB Mode
简介
ECB 通过将明文分成n个大小的块,将每个块单独加密,从而得到一个密文。如果明文不能被块大小整除,那
么ECB模式则会通过附加一些字节从而使其能够被整除
在ECB中,每个块是单独加密的,所以其相互独立
获取块的大小和明文的大小
获取块大小应为解决ECB问题的第一步,可以通过纯手动来求解块的字节和明文的字节,假如加密输出的长度为八个字节,我在明文中添加一个字节,加密输出的长度没改变,但是在添加三个字节的时候,密文的长度就发生了改变,那么块的字节数就是密文突变字节的长度,从而让我们得到了块的字节大小
以https://aes.cryptohack.org/ecb_oracle/题目作为示例

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

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

可以通过强行补充字节来暴力破解出明文,即一个个字符求解。即输入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
def t_to_hex(t): h = '' for i in t: h += str(hex(ord(i))[2:]) return h
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]
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
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
|
代码运行时间较长,待优化