题目 买不到TI4的门票觉得人生好灰暗。。ACTF2014crypto200.tar ————割———— 解压以后是一个加密脚本,注意key是未知的,所以先研究算法想办法推出加密的key。 已知明文msg01和密文msg01.enc。 研究算法发现对明文加密时只用到上一位的密文以及key[i%len(key)]即key中的一个字符,并且是按位加密。 于是可以从msg01第一位开始遍历0-9a-zA-Z,与msg01.enc匹配就可以得到key的第一位,然后以此类推就能推出全部的key 代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| g2 = open('msg01.enc.ord', 'rb') key = '' c = '' str = '' t = chr(0) i = 0 find = 0 ckey = g2.read(1) realkey='' for p in f: for k1 in range(0, 256): k1 = chr(k1) find=0 c = chr(( ord(p) + (ord(k1) ^ ord(t)) + i**i ) & 0xff) if c == ckey: print 'get %d is %c' % (i, k1) realkey += k1 find = 1 break if find ==0: print 'cant find NO.', i break t = p i += 1 ckey = g2.read(1) print repr(realkey) g.close() 运行得到key  因为key是循环取的,所以key='DoNotTryToGuessWhatDoesD3AdCa7ThinkOf' 之后写一个解密脚本解密msg02.enc即可 g = open('msg02.enc', 'rb').read() f = open('msgtest02', 'wb') key = 'DoNotTryToGuessWhatDoesD3AdCa7ThinkOf' i = 0 t = chr(0) p = '' str = '' for c in g: p =chr( (ord(c) - i**i - (ord(key\[i % len(key)\]) ^ ord(t)) ) & 0xff ) t = p i += 1 str += p f.write(p) print str f.close()
|
