题目传送门在此。
题目中英语漫漫长,就以吾等这英语水平,只能表示不明觉厉了。
最后大概总结出来,这题就是要选择明文攻击,然后HINT1也说了The 'random' generator has a limited number of bits, and is periodic,那这就好办了。
首先我们尝试明文:
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
得到对应密文:
EICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXY
很明显可以看出是循环的,循环节长度为30。
然后尝试明文:
BBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
得到密文:
FJDUEHYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXYCPFUEOCKRNEICTDGYIYZKTHNSIRFXY
发现只有前6个字母变了,那么看来应该是一位只会影响对应的一位,那么我们直接枚举每一位为A-Z的情况,分别加密,然后拿我们的加密了的password来对比,即可得到password的原文了。
程序如下:
import subprocess ans = [] for i in xrange(26): fp = open('/tmp/kry/foo', 'w') fp.write(chr(i + ord('A')) * 30) fp.close() ret = subprocess.call(['/krypton/krypton6/encrypt6', '/tmp/kry/foo', '/tmp/kry/bar']) fp = open('/tmp/kry/bar', 'r') ans.append(fp.read()) fp.close() s = 'PNUKLYLWRQKGKBE' plain = '' for i in xrange(len(s)): for j in xrange(26): if s[i] == ans[j][i]: plain += chr(j + ord('A')) print(plain)
至此,整个krypton得以解决,不得不说,krypton感觉就是入门级的题,没有什么难度。