看到网上都是用二进制工具做的,就尝试代码跑一下
题目是一个密钥文件和一个密文文件。
根据题目名称猜测将两个文件中的字符串转化为二进制进行异或。
直接上代码
with open("E:/Text-Keep/3/key.txt","rb") as f:
tmp = f.read()
k = ''.join(format(byte, '08b') for byte in tmp)
_k = int(k,2)
with open("E:/Text-Keep/3/密文.txt","rb") as f:
tmp = f.read()
c = ''.join(format(byte,'08b')for byte in tmp)
_c = int(c,2)
res = _k ^ _c
rb = bin(res)[2:]
if len(rb)%8 != 0:
rb = '0' +rb
bytes_list = [rb[i:i+8] for i in range(0, len(rb), 8)]
m = bytes([int(b, 2) for b in bytes_list])
print(m)
b'flag{ea1bc0988992276b7f95b54a7435e89e}'
整个流程:
- 打开
key.txt
和密文.txt
并读取文件内容。 - 将读取到的内容转换为二进制字符串形式,每个字节使用 8 位二进制表示,将二进制字符串转换为整数
_k
,_c
- 将
_k
和_c
进行异或操作,得到结果res
,并转换为二进制字符串形式,并去掉开头的 ‘0b’ 标识。 - 如果二进制字符串的长度不是 8 的倍数,添加一个前缀 ‘0’,使其长度为 8 的倍数。
- 将二进制字符串切分为每个 8 位的子字符串,并 将每 8 位的二进制字符串转换为字节。
- 将字节数据
m
打印出来