def main(encrypt, input_file, output_file, block_cipher_mode, key_length): if encrypt: key = aes.random_key_generator(int(key_length)) if key_length == "128": AES = aes.AES(key, 128) elif key_length == "192": AES = aes.AES(key, 192) elif key_length == "256": AES = aes.AES(key, 256) if block_cipher_mode == "ECB": bcm = aes.ECB(AES) elif block_cipher_mode == "CBC": bcm = aes.CBC(AES, 16) elif block_cipher_mode == "CTR": bcm = aes.CTR(AES) bcm.cipher(input_file, output_file) print("Cipher Key:", key) write_key(key) else: key = read_key() if key == 1: print("File key.txt doesn't exists! Can't decrypt without key") exit(1) key_length = len(key) * 4 if key_length == 128: AES = aes.AES(key, 128) elif key_length == 192: AES = aes.AES(key, 192) elif key_length == 256: AES = aes.AES(key, 256) else: print("Key length not valid!") exit(1) if block_cipher_mode == "ECB": bcm = aes.ECB(AES) elif block_cipher_mode == "CBC": bcm = aes.CBC(AES, 16) elif block_cipher_mode == "CTR": bcm = aes.CTR(AES) bcm.decipher(input_file, output_file)
def padding_oracle(data): iv = data[:BLOCKSIZE] ct = data[BLOCKSIZE:] c = aes.CBC(KEY, iv) try: c.decrypt(ct) return True except ValueError: return False
def test_challenge_10_cbc(self): with open('10.txt') as f: data = b64decode(f.read()) c = aes.CBC(KEY, b'\x00' * 16) self.assertEqual(c.decrypt(data), PLAINTEXT)
def encrypt(): plain = random.choice(PLAINTEXTS) iv = os.urandom(BLOCKSIZE) c = aes.CBC(KEY, iv) return iv + c.encrypt(pkcs7pad(plain, BLOCKSIZE))
def test_challenge_10_twoway(self): e = aes.CBC(KEY, b'\x00' * 16) d = aes.CBC(KEY, b'\x00' * 16) x = e.encrypt(b"foobar" * 123) self.assertEqual(d.decrypt(x), b'foobar' * 123)