一 在做题之前我们先了解一下什么是base64编码
base64编码类似ASCLL编码
ASCLL使用7个二进制位来表示一个字符,7个二进制位刚好可以表示128个不同的字符,如图
而base64编码使用6个二进制位表示一个字符
6个二进制位可以表示64个不同的字符,如图
现在我们来解释base64编码,我们先将一个对象先由ascii码转化为二进制(7个二进制一组),然后再将它们以6个为一组(不足用0补齐),然后转化为十进制,再通过十进制的数字和base64的码值表相互转换得到对应的字符,最后的base64的结果需要是4的倍数,不足用=补齐。
二 解题
由题目可知这里重新定义了base64,(如这里的0表示j,而原本的0表示A)
所以通过base64的原理写出代码:
import base64 dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='} a = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=' #标准表 c='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw' ds='' #把dict转换成字符串方便处理 for i in range(65): ds+=dict[i] l=[] for i in range(len(c)): l.append(ds.index(c[i])) #无论换不换表,base64变换本身产生的6位二进制数对应的十进制数是不变的,这里就是找到密文c的每个字符在dict表中键值 #print(l) #l中存的是索引值(下标数字) m1='' for ll in l: m1+=a[ll] #找到l中所存的每个数字在标准的base64加密表中所对应的字符 print(m1) #m1是标准base64表编码结果 m2=base64.b64decode(m1) #直接调用函数恢复出明文 print(m2)
得到结果
将BJD换为flag即可。