「配枪朱丽叶。」

RootのCTF学习笔记。

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="")