def encrypt_CBC(key, text): block_size = 16 text_blocks = generate_blocks(pad(text), block_size) initialisation_vector = b'\x00' * block_size cipher_blocks = [initialisation_vector] for i in range(len(text_blocks)): xor = fixed_xor(cipher_blocks[i], text_blocks[i]) cipher_blocks.append(encrypt_ECB(key, xor, add_padding=False)) return "".join(cipher_blocks[1:])
def decrypt_CBC(key, text): block_size = 16 cipher_blocks = generate_blocks(text, block_size) initialisation_vector = b'\x00' * block_size cipher_blocks.insert(0, initialisation_vector) text_blocks = [] for i in range(len(cipher_blocks) - 1): decrypted = decrypt_ECB(key, cipher_blocks[i + 1], strip_padding=False) text_blocks.append(fixed_xor(cipher_blocks[i], decrypted)) return unpad("".join(text_blocks))
def repeating_key_xor(key, text): return "".join([fixed_xor(text[i], key[i%len(key)]) for i in range(len(text))])