def breakSingleByteXOR(byteStr): strings = [] for key in range(256): strings.append(xor(byteStr, bytearray([key] * len(byteStr)))) return max(strings, key=lambda s: s.count(' '.encode('utf-8')))
def decryptAES_ECB_CBC(ciphertext, key, iv): plaintext = bytearray(len(ciphertext)) for n in range(0, len(ciphertext), AES.block_size): plaintext[n: n+AES.block_size] = xor(decryptAES_ECB(ciphertext[n: n+AES.block_size], key), iv) iv = ciphertext[n: n+AES.block_size] return plaintext
def hammingDistance(string1, string2): xorString = ''.join(format(x, '08b') for x in xor(string1, string2)) distance = 0 for num in xorString: if num == "1": distance += 1 return distance
def encryptAES_ECB_CBC(plaintext, key, iv): plaintext = addPKCS7Padding(plaintext, AES.block_size) ciphertext = bytearray(len(plaintext)) for n in range(0, len(plaintext), AES.block_size): ciphertext[n: n+AES.block_size] = encryptAES_ECB(xor(plaintext[n: n+AES.block_size], iv), key) iv = ciphertext[n: n+AES.block_size] return ciphertext
def breakSingleByteXOR(encryptedText): keys = [] strings = [] for key in range(256): keys.append(chr(key)) strings.append( xor(encryptedText, bytearray([key] * len(encryptedText)))) bestString = max(strings, key=lambda s: s.count(' '.encode('utf-8'))) for i in range(len(strings)): if bestString == strings[i]: return keys[i]
def repeatingKeyXOR(text, key): assert len(text) >= len(key) if not len(text) % len(key): return xor(text, key * (len(text) / len(key))) else: count = 0 encoded = bytearray() for char in range(len(text)): encoded += bytearray([text[char] ^ key[count]]) if count == len(key) - 1: count = 0 else: count += 1 return encoded