cts = ['120, 84, 25, 1, 15, 17, 42, 21, 9, 12, 3, 49, 8, 29, 82, 31, 87, 118, 88, 92, 93',
'125, 87, 44, 7, 31, 41, 6, 8, 17, 51, 14, 17, 42, 27, 86, 19, 66, 92, 88, 86, 7',
'123, 84, 16, 28, 9, 10, 4, 2, 31, 55, 7, 6, 13, 61, 91, 62, 89, 91, 83, 87, 86'
]
target = '120, 84, 25, 1, 15, 17, 42, 21, 9, 12, 3, 49, 8, 29, 82, 31, 87, 118, 88, 92, 93'
def strxor(a, b): # xor two strings of different lengths
if len(a) > len(b):
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a[:len(b)], b)])
else:
return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b[:len(a)])])
def random(size=16):
return open("/dev/urandom").read(size)
def encrypt(key, msg):
c = strxor(key, msg)
print
print c.encode('ascii')
return c
def get_key_from_col(col):
max_conflicts = 0
suspected = '\x00'
for c in col:
conflicts = 0
for cc in col:
if 0x3f < (ord(c) ^ ord(cc)): # letters are nice to each other
conflicts += 1
if conflicts > max_conflicts:
max_conflicts = conflicts
suspected = c
if max_conflicts < 6: return '\x00'
return chr( 0x20 ^ ord(suspected) )
def get_col(cts, i):
col = ''
for c in cts: col += c[i*2 : (i+1)*2].decode('ascii')
return col
def get_key(cts, l):
key = ''
for i in range(l/2):
col = get_col(cts, i)
k = get_key_from_col(col)
if k == '\x00': print '%ith seems not to be decoded' % i
key += k
return key
def decipher(s, k):
return strxor(s.decode('ascii'), k)
def correct_key(k, in_cts_num, at_pos, right_letter_is):
def strsetat(s, pos, c):
return s[0:pos] + c + s[pos+1:]
col = get_col(cts, at_pos)
corrected = ord(col[in_cts_num]) ^ ord(right_letter_is)
return strsetat(k, at_pos, chr(corrected))
if __name__ == '__main__':
pass
CgpjdHMgPSBbJzEyMCwgODQsIDI1LCAxLCAxNSwgMTcsIDQyLCAyMSwgOSwgMTIsIDMsIDQ5LCA4LCAyOSwgODIsIDMxLCA4NywgMTE4LCA4OCwgOTIsIDkzJywgCicxMjUsIDg3LCA0NCwgNywgMzEsIDQxLCA2LCA4LCAxNywgNTEsIDE0LCAxNywgNDIsIDI3LCA4NiwgMTksIDY2LCA5MiwgODgsIDg2LCA3JywKJzEyMywgODQsIDE2LCAyOCwgOSwgMTAsIDQsIDIsIDMxLCA1NSwgNywgNiwgMTMsIDYxLCA5MSwgNjIsIDg5LCA5MSwgODMsIDg3LCA4NicKCl0KCnRhcmdldCA9ICcxMjAsIDg0LCAyNSwgMSwgMTUsIDE3LCA0MiwgMjEsIDksIDEyLCAzLCA0OSwgOCwgMjksIDgyLCAzMSwgODcsIDExOCwgODgsIDkyLCA5MycKCgoKZGVmIHN0cnhvcihhLCBiKTogICAgICMgeG9yIHR3byBzdHJpbmdzIG9mIGRpZmZlcmVudCBsZW5ndGhzCiAgICBpZiBsZW4oYSkgPiBsZW4oYik6CiAgICAgICAgcmV0dXJuICIiLmpvaW4oW2NocihvcmQoeCkgXiBvcmQoeSkpIGZvciAoeCwgeSkgaW4gemlwKGFbOmxlbihiKV0sIGIpXSkKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuICIiLmpvaW4oW2NocihvcmQoeCkgXiBvcmQoeSkpIGZvciAoeCwgeSkgaW4gemlwKGEsIGJbOmxlbihhKV0pXSkKCmRlZiByYW5kb20oc2l6ZT0xNik6CiAgICByZXR1cm4gb3BlbigiL2Rldi91cmFuZG9tIikucmVhZChzaXplKQoKZGVmIGVuY3J5cHQoa2V5LCBtc2cpOgogICAgYyA9IHN0cnhvcihrZXksIG1zZykKICAgIHByaW50CiAgICBwcmludCBjLmVuY29kZSgnYXNjaWknKQogICAgcmV0dXJuIGMKCmRlZiBnZXRfa2V5X2Zyb21fY29sKGNvbCk6CiAgICBtYXhfY29uZmxpY3RzID0gMAogICAgc3VzcGVjdGVkID0gJ1x4MDAnCiAgICBmb3IgYyBpbiBjb2w6CiAgICAgICAgY29uZmxpY3RzID0gMAogICAgICAgIGZvciBjYyBpbiBjb2w6CiAgICAgICAgICAgIGlmIDB4M2YgPCAob3JkKGMpIF4gb3JkKGNjKSk6ICMgbGV0dGVycyBhcmUgbmljZSB0byBlYWNoIG90aGVyIAogICAgICAgICAgICAgICAgY29uZmxpY3RzICs9IDEKICAgICAgICBpZiBjb25mbGljdHMgPiBtYXhfY29uZmxpY3RzOiAKICAgICAgICAgICAgbWF4X2NvbmZsaWN0cyA9IGNvbmZsaWN0cwogICAgICAgICAgICBzdXNwZWN0ZWQgPSBjCiAgICAKICAgIGlmIG1heF9jb25mbGljdHMgPCA2OiByZXR1cm4gJ1x4MDAnCiAgICByZXR1cm4gY2hyKCAweDIwIF4gb3JkKHN1c3BlY3RlZCkgKQoKZGVmIGdldF9jb2woY3RzLCBpKToKICAgIGNvbCA9ICcnCiAgICBmb3IgYyBpbiBjdHM6IGNvbCArPSBjW2kqMiA6IChpKzEpKjJdLmRlY29kZSgnYXNjaWknKQogICAgcmV0dXJuIGNvbAoKZGVmIGdldF9rZXkoY3RzLCBsKToKICAgIGtleSA9ICcnCiAgICBmb3IgaSBpbiByYW5nZShsLzIpOgogICAgICAgIGNvbCA9IGdldF9jb2woY3RzLCBpKQogICAgICAgIGsgPSBnZXRfa2V5X2Zyb21fY29sKGNvbCkKICAgICAgICBpZiBrID09ICdceDAwJzogcHJpbnQgJyVpdGggc2VlbXMgbm90IHRvIGJlIGRlY29kZWQnICUgaQogICAgICAgIGtleSArPSBrCiAgICByZXR1cm4ga2V5CgpkZWYgZGVjaXBoZXIocywgayk6CiAgICByZXR1cm4gc3RyeG9yKHMuZGVjb2RlKCdhc2NpaScpLCBrKQoKZGVmIGNvcnJlY3Rfa2V5KGssIGluX2N0c19udW0sIGF0X3BvcywgcmlnaHRfbGV0dGVyX2lzKToKICAgIGRlZiBzdHJzZXRhdChzLCBwb3MsIGMpOgogICAgICAgIHJldHVybiBzWzA6cG9zXSArIGMgKyBzW3BvcysxOl0KICAgIAogICAgY29sID0gZ2V0X2NvbChjdHMsIGF0X3BvcykKICAgIGNvcnJlY3RlZCA9IG9yZChjb2xbaW5fY3RzX251bV0pIF4gb3JkKHJpZ2h0X2xldHRlcl9pcykKCiAgICByZXR1cm4gc3Ryc2V0YXQoaywgYXRfcG9zLCBjaHIoY29ycmVjdGVkKSkKCmlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICBwYXNz