import struct import string def key_padding(key,msglen): orig_key = key result_key = '' block = (msglen / len(key)) left = msglen % len(key) for i in range(block): result_key += key result_key += key[:left] return result_key def HammingWeight(t): result = 0 for i in range(32): if (t>>i)&1 == 1: result+= 1 return result def GetKey(msg): if len(msg)%11 != 0: print "msg len is not multiple 11" return keyList = [] #create block list blockList = [] for i in range(11): blockList.append([]) #devide block j = 0 for tmp in msg: blockList[j%11].append(tmp) j += 1 for i in range(11): result = {blockList[i].count(x): x for x in blockList[i]} keyList.append(chr(ord(result[sorted(result).pop()])^ord(' '))) return keyList def main(): f = open("encrypted.txt","r") buf = f.read().decode('hex') f.close() ################### possible key len is 11######## for i in range(1,20): Ham = lambda (x,y): HammingWeight(ord(x)^ord(y)) result = map(Ham,zip(buf,buf[i:])) fham = filter(lambda x: x<6, result) print "[*]try key len %d " %i avg_ham = reduce(lambda x,y: x+y, result) avg_ham = avg_ham / len(result) print "[-]"+str(avg_ham) ################################################### # keyList = GetKey(buf) # keyList[3] = '\x76' # #print keyList # keyList = ''.join(i for i in keyList) # print "find key %s " %(keyList.encode('hex')) # pkey = key_padding(keyList,len(buf)) # decode = map(lambda (x,y): ord(x)^ord(y), zip(pkey,buf)) # decode = ''.join(chr(x) for x in decode) # print decode if __name__ == '__main__': main()