def genKys(length): length *= 8 key = [0] * length choice = int(floor.floor(random.random() * length)) for i in range(choice): key[int(floor.floor(random.random()) * (length - 1))] = 1 return key def enc(plain, key): length = len(key) cipher = [None] * length for i in range(length): cipher[i] = 1 if key[i] == plain[i] else 0 return cipher def getBts(plain): length = len(plain) bits = [None] * length * 8 for i in range(length): for j in range(8): bits[8 * i + 7 - j] = (int)(ord(plain[i]) / pow(2, j)) % 2 return bits def getBytes(bits): length = len(bits) data = [] byte = 0 for i in range((int)(length / 8)): for j in range(8): byte += pow(2, 7 - j) * bits[8 * i + j] data.append(byte) byte = 0 return data def toString(bytes): size = len(bytes) output = "" for i in range(size): output += chr(bytes[i]) return output def attack(i, key, size): if i == size - 1: dec(key) return for j in range(1, size - i): attack(i + j, key, size) key2 = key[:] key2[i + j] = 1 attack(i + j, key2, size) def dec(key): deciphered = enc(bits, key) txt = toString(getBytes(deciphered)) if isLatin(txt): if txt == plainText: print("Found!") exit() def isLatin(txt): size = len(txt) for i in range(size): if (ord(txt[i]) < 97) | (ord(txt[i]) > 122): return False return True