根据题意,我们要尽量猜测每个字符的可能性,首先字符最少有大写/小写可能性,部分字符有额外的数字可能性,记得看密文长度(不是4的整倍数)故补 =(记得在字典里把等号也映射上)
密文可以一起暴力跑递归也可以4个一段逐段解析
import base64
# 密文
m = 'QWIHBLGZZXJSXZNVBZW='
# 解密映射字典
d = {
'Q': ['Q', 'q', '9'], 'W': ['W', 'w'], 'I': ['I', 'i', '1'],
'H': ['H', 'h'], 'B': ['B', 'b', '8'], 'L': ['L', 'l', '1'],
'G': ['G', 'g', '9'], 'Z': ['Z', 'z', '2'], 'X': ['X', 'x'],
'J': ['J', 'j'], 'S': ['S', 's', '5'], 'N': ['N', 'n'],
'V': ['V', 'v'],'=':['=']
}
# 用于存储有效的base64解码结果
v = []
# 递归函数,尝试递归所有可能性并base64解码
def f(i, c):
# 当前索引超出密文长度,尝试解码
if i == len(m):
try: # 尝试base64解码
b = base64.b64decode(c)
s = b.decode('utf-8')
#解码成功,则记录结果
if s.isprintable():
v.append(s)
except: # 解码失败,忽略这个组合
pass
return
# 获取当前密文字符对应的所有可能字符
p = m[i]
r = d[p]
# 遍历可能的字符,并递归处理
for a in r:
f(i + 1, c + a)
# 递归解码
f(0, '')
# 打印结果
print("结果:")
for e in v:
print(e)