BJDCTF2020/BUUCTF-Crypto:这是base??
引用官方WP:
这里提一下base64的加密流程:
1、将待转换的字符串每三个字节分为一组,每个字节占8bit,那么共有24个二进制位。
2、将上面的24个二进制位每6个一组,共分为4组。
3、在每组前面添加两个0,每组由6个变为8个二进制位,总共32个二进制位,即四个字节。
4、最后再根据码表进行编码简单来说转换关系就是先将明文的字符串的ASCII码转换为8位的二进制编码,然后在将这串得到的二进制编码按6位为一组(64是2的6次方),
然后将划分好的二进制数转换成10进制数并对照上方编码表进行加密。而相对的解密就是将这编码在按8位为一组划分,再将划分好的二进制数转成10进制的ASCII码,然后根据ASCII码表恢复明文。
Ps.这里我们可以看到转成的二进制数的长度必须是6和8的公倍数,对于那些长度不够的要进行补齐操作
说一哈思路吧:
1.根据给的字典,将密文字符串换成一一对应的键名。比如‘F’对应‘16’。 2.把转换后的字符串变成每个六位二进制,不足位填充。 3.上个步骤得到的字符串八位一组进行分割,得到的二进制转为ascii字符拼起来就是flag。
dict1 = {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: '='} #反转字典 dict2 = {v: k for k, v in dict1.items()} chipertext = "FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw" value = [] final = [] flag = "" for i in chipertext: value.append(dict2[i]) for i in value: i = bin(i) if(len(i[2:])<6): i = "0"*(6-len(i[2:]))+i[2:] else: i = i[2:] flag += i step = 8 splitt = [flag[i:i+step] for i in range(0,len(flag),step)] for i in splitt: final.append(i) for i in final: print(chr(int(i,2)),end="")