结合了非常强大的运气,大神直觉的提示,才勉强做出来的。
一、准备工作
拿下题目的两个附件,一个是密文,一个是加密程序。
处理密文就不多说了,十六进制转换成值,Ctrl+C再到winhex中Ctrl+B就行了,就是密文文件,重命名为
newcode.txt
关键是KEY的分析:
#define KEY_LENGTH 2 // Can be anything from 1 to 13
unsigned char key[KEY_LENGTH] = {0x00, 0x00};
/* of course, I did not use the all-0s key to encrypt */
意思是,长度是1至13不确定,值是0x00-0x255不确定。
明文肯定是可见字符,字典来一个
for i in range(32,126,1):
dic=dic+chr(i)
第 1 步:确定密文长度
拿可见字符去与密文异或,就得到密钥的取值范围,然后在 for j in range(0,len(f),7) 中试出来,打印每次异或的取值范围,发现只有步长为7,取值范围最相近,然后,取出每一位可见字符的密钥的集合。
f=open('newcode.txt','r').read()
i0=[]
a0={}
l0=[]
l1=[]
times=0
for j in range(0,len(f),7):
times+=1
for i in range(32,126,1):
if ord(f[j])^i not in i0:
i0.append(ord(f[j])^i)
#else
else:
if ord(f[j])^i in a0:
a0[ord(f[j])^i]+=1
else:
a