首先分析加密过程,密文每个字节都是 当前明文字节异或下一个明文字节
原题:
from random import randint
from secret import flag
flag+="^"
cipher=[]
for i in range(len(flag)-1):
cipher.append(ord(flag[i])^ord(flag[i+1]))
print(cipher)
#[72, 63, 38, 12, 8, 30, 30, 6, 82, 4, 84, 88, 92, 7, 79, 29, 8, 90, 85, 26, 25, 87, 80, 10, 20, 20, 9, 4, 80, 73, 31, 5, 82, 0, 1, 92, 0, 0, 94, 81, 4, 85, 27, 35]
通过原题可以倒推出:
倒数第一个字节的明文为 35异或94(94是^符号的ASCII值)
倒数第二个字节的明文为 27异或上一个得到的值(即35异或94的结果:125)
......
通过这个规律,解密脚本如下:
#密文列表
cipher=[72, 63, 38, 12, 8, 30, 30, 6, 82, 4, 84, 88, 92, 7, 79, 29, 8, 90, 85, 26, 25, 87, 80, 10, 20, 20, 9, 4, 80, 73, 31, 5, 82, 0, 1, 92, 0, 0, 94, 81, 4, 85, 27, 35]
xor=94 # ^的ASCII码
flag_list=[] #flag列表(存储flag的数字)
for i in range(len(cipher)-1,-1,-1): #逆序解密
#print(cipher[i],xor,cipher[i]^xor)
xor=cipher[i]^xor #当前的异或密钥是 密文异或之前的异或密钥
flag_list.append(xor) #添加本次的异或结果,此结果既为本次的明文,也为下一次循环的异或密钥
print(flag_list) #输出数字表示 (逆序)
flag = ''.join([chr(flag_list[i]) for i in range(len(flag_list)-1,-1,-1)])
print(flag) #输出字符结果 (正序)