给定加密后的密文
给定keylength的范围
给定key中每个数的大小
求出原文?
本以为两次加密强度应该更高 没想到 也是一样的容易被破解啊
其原因在于第一次的base64加密得到的字符集是确定的
即’a’-‘z’ ‘A’-‘Z’ 0-9 +/=
so 可以根据这个暴力得出key的可能解 答案就显然了
代码中的注释是我一步步得到结果之后方便自己看而注释掉的
import base64
cipher='xxxxxxxxxxxxxxxxxxx'
first = base64.b64decode(cipher.encode())
print (first)
num = []
for i in range(len(first)):
num.append(int(first[i]))
"""
xor = []
charset = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/="
for i in range(len(num)):
t = []
for j in range(len(charset)):
temp = num[i]^ord(charset[j])
t.append(temp)
t = list(set(t))
xor.append(t)
key = []
for i in range(2,14):
st = []
for q in range(i):
st.append([])
for q in range(i):
flag = 0
for j in range(len(xor)):
index = j%i
if j%i==q:
if flag==0:
st[j%i] = list(xor[j])
flag += 1
else:
st[index]=list(set(st[index]).intersection(set(xor[j])))
mykey = [[65, 66], [220], [104, 108], [184, 188, 189], [245], [246], [203], [74]]
for i in range(len(mykey[0])):
for j in range(len(mykey[1])):
for q in range(len(mykey[2])):
for k in range(len(mykey[3])):
for l in range(len(mykey[4])):
for m in range(len(mykey[5])):
for n in range(len(mykey[6])):
for o in range(len(mykey[7])):
"""
ans = [[65,220,104,184,245,246,203,74],[65,220,104,188,245,246,203,74],[65,220,104,189,245,246,203,74],[65,220,108,184,245,246,203,74],[65,220,108,188,245,246,203,74],[65,220,108,189,245,246,203,74],[66,220,104,184,245,246,203,74],[66,220,104,188,245,246,203,74],[66,220,104,189,245,246,203,74],[66,220,108,184,245,246,203,74],[66,220,108,188,245,246,203,74],[66,220,108,189,245,246,203,74]]
def xxor(text,key):
new_text=list(text)
for i in range(len(text)):
new_text[i]=key[i%len(key)]^text[i]
return bytes(new_text)
def decode_base64(data):
miss = 4 - len(data)%4
if miss:
data += b'=' * miss
return base64.decodestring(data)
for i in range(len(ans)):
temp = xxor(num,ans[i])
temp = decode_base64(temp)
temp = xxor(temp,ans[i])
print (temp)