def test_prefix_aes_ecb_decryption(self): """Challenge 14""" prefix = Crypto.gen_random_key(18) target = "This is the target" quote = lambda text: text oracle, _, _ = Crypto.generate_aes_oracle(prefix, target, AES.MODE_ECB, quote) self.assertEqual(target, Crypto.decrypts_aes_ecb_byte_wise(oracle)) target = "A" * 16 oracle, _, _ = Crypto.generate_aes_oracle(prefix, target, AES.MODE_ECB, quote) self.assertEqual(target, Crypto.decrypts_aes_ecb_byte_wise(oracle))
def test_aes_ecb_decryption(self): """Challenge 12""" data = Crypto.get_lines('data/12.txt')[0] target = base64.b64decode(data) quote = lambda text: text oracle, _, _ = Crypto.generate_aes_oracle('', target, AES.MODE_ECB, quote) text = Crypto.decrypts_aes_ecb_byte_wise(oracle) self.assertEqual(target, text)
def test_break_aes_ctr_fixed_nonce2(self): """Challenge 20""" block_size = 16 quote = lambda t: t counter = lambda: chr(25)*block_size aes_ctr, _ = Crypto.generate_aes_oracle( '', '', AES.MODE_CTR, quote, block_size, counter) texts = [base64.b64decode(l) for l in open('data/20.txt').readlines()] ciphers = [aes_ctr(text) for text in texts] expected = FrequencyAnalyzer.get_repeating_xor( ciphers[0], texts[0])[:block_size] actual = Crypto.break_aes_ctr_with_fixed_nonce(ciphers, block_size) self.assertEquals(expected, actual)
def test_cbc_bit_flipping(self): """Challenge 16""" prefix = "comment1=cooking%20MCs;userdata=" suffix = ";comment2=%20like%20a%20pound%20of%20bacon" oracle, key, _ = Crypto.generate_aes_oracle(prefix, suffix, AES.MODE_CBC, urllib.quote) def has_admin(cipher): """Checks if cipher has admin.""" text = Crypto.decrypt_aes(cipher, key, AES.MODE_CBC) return text.find(';admin=true;') != -1 self.assertTrue(Crypto.flip_cipher_to_add_admin(oracle, has_admin))
def test_break_aes_ctr_fixed_nonce2(self): """Challenge 20""" block_size = 16 quote = lambda t: t counter = lambda: chr(25) * block_size aes_ctr, _ = Crypto.generate_aes_oracle('', '', AES.MODE_CTR, quote, block_size, counter) texts = [base64.b64decode(l) for l in open('data/20.txt').readlines()] ciphers = [aes_ctr(text) for text in texts] expected = FrequencyAnalyzer.get_repeating_xor(ciphers[0], texts[0])[:block_size] actual = Crypto.break_aes_ctr_with_fixed_nonce(ciphers, block_size) self.assertEquals(expected, actual)
def test_ctr_bit_flipping(self): """Challenge 26""" prefix = "comment1=cooking%20MCs;userdata=" suffix = ";comment2=%20like%20a%20pound%20of%20bacon" counter = Crypto.gen_aes_stream_counter_mt19973(3453243); oracle, key = Crypto.generate_aes_oracle( prefix, suffix, AES.MODE_CTR, urllib.quote, 16, counter=counter) def has_admin(cipher): """Checks if cipher has admin.""" counter = Crypto.gen_aes_stream_counter_mt19973(3453243); text = Crypto.decrypt_aes(cipher, key, AES.MODE_CTR, counter=counter) return text.find(';admin=true;') != -1 self.assertTrue(Crypto.flip_cipher_to_add_admin_ctr(oracle, has_admin))
def test_break_aes_padding_leak(self): """Challenge 17""" quote = lambda text: text _, key, init_vector = Crypto.generate_aes_oracle( '', '', AES.MODE_CBC, quote) def has_valid_padding(cipher, init_vector): """Checks if cipher has valid padding.""" try: Crypto.decrypt_aes(cipher, key, AES.MODE_CBC, init_vector) except ValueError: return False return True lines = [base64.b64decode(l) for l in open('data/17.txt').readlines()] for line in lines: cipher = Crypto.encrypt_aes(line, key, AES.MODE_CBC, init_vector) self.assertEqual(line, Crypto.break_aes_using_padding_leak( cipher, init_vector, has_valid_padding))
def test_break_aes_padding_leak(self): """Challenge 17""" quote = lambda text: text _, key, init_vector = Crypto.generate_aes_oracle( '', '', AES.MODE_CBC, quote) def has_valid_padding(cipher, init_vector): """Checks if cipher has valid padding.""" try: Crypto.decrypt_aes(cipher, key, AES.MODE_CBC, init_vector) except ValueError: return False return True lines = [base64.b64decode(l) for l in open('data/17.txt').readlines()] for line in lines: cipher = Crypto.encrypt_aes(line, key, AES.MODE_CBC, init_vector) self.assertEqual( line, Crypto.break_aes_using_padding_leak(cipher, init_vector, has_valid_padding))
def test_ctr_bit_flipping(self): """Challenge 26""" prefix = "comment1=cooking%20MCs;userdata=" suffix = ";comment2=%20like%20a%20pound%20of%20bacon" counter = Crypto.gen_aes_stream_counter_mt19973(3453243) oracle, key = Crypto.generate_aes_oracle(prefix, suffix, AES.MODE_CTR, urllib.quote, 16, counter=counter) def has_admin(cipher): """Checks if cipher has admin.""" counter = Crypto.gen_aes_stream_counter_mt19973(3453243) text = Crypto.decrypt_aes(cipher, key, AES.MODE_CTR, counter=counter) return text.find(';admin=true;') != -1 self.assertTrue(Crypto.flip_cipher_to_add_admin_ctr(oracle, has_admin))