附件中有两行密文,第一行无法解密,第二行缺少四个字符,题目提示为base加密,联想到base64的扩展:base64换表
第二行为密文换的表,但是缺失了四个字符
python脚本求缺失字符:(借鉴的大佬)
str="JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs****kxyz012789+/"
#定义字符串str
import string
#调用python标准库中的string模块,该模块包含字符串的处理和字符串的操作等函数
for i in string.ascii_letters+string.digits:
#for循环,用于遍历字符串string.ascii_letters和string.digits中的每个字符。
#string.ascii_letters包含26个英文字母(大小写都有)
#string.digits包含10个数字,即'0123456789'
#两个字符串中的所有字符依次赋值给变量i。在每次循环中,i的值会依次为'a'、'b'、'c'等,直到遍历完所有字符。
if i not in str:
#如果i不在str中,输出i
print(i)
结果:ju34,但是一共有24中不同的排列顺序
import binascii
#该模块提供了将字节对象转换为十六进制字符串、将十六进制字符串转换为字节对象等功能。这里是将十六进制字符串转换为字节对象
import itertools
#调用python标准库中的itertools模块,提供了一种生成各种迭代器的函数。
#itertools.permutations() 生成排列。
s=['j','u','3','4']
#定义字符串s
for i in itertools.permutations(s,4):
#itertools.permutations函数生成字符串`s`的所有可能的排列组合,并将结果存储在一个迭代器中。
#itertools.permutations函数接受两个参数:一个可迭代对象(如列表、元组等)和一个整数n,表示要生成排列组合的元素数量。
#在这个例子中,参数s是一个包含四个字符的列表,参数4表示要生成四个字符的排列组合。
#使用for循环遍历迭代器中的每个元素(生成的字符串),并将每个元素存储在一个名为i的变量中。
#i是一个元组,其中包含s中的四个字符的排列组合
ciper="MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbVD"
ss="JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs"+"".join(i)+"kxyz012789+/"
bins = ""
#使用`join`函数将`i`元组中的所有字符连接成一个字符串,连接后的字符串存储在名为`""`的变量中。
#代码将连接后的字符串与字符串`"JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs"+"".join(i)+"kxyz012789+/"`连接起来
#并将结果存储在名为`ss`的变量中
for j in ciper:
bins+=bin(ss.index(j))[2:].zfill(6)
print(binascii.unhexlify(hex(eval("0b"+bins))[2:-1]))
#这段代码首先定义了一个名为bins的空字符串,然后使用for循环遍历ciper列表中的每个元素j。
#在循环内部,bin(ss.index(j))[2:]将ciper列表中的每个元素转换为其在字符串ss中的索引,再转换为六位数填充零的字符串,添加到bins中。
#然后,使用eval()函数将bins字符串转换为十进制整数,并使用hex()函数将其转换为十六进制字符串。
#最后,使用binascii.unhexlify()函数将十六进制字符串转换为字节对象,并将其打印出来。