break_random_access_read_write_aes_ctr.py (746B)
1 from Crypto.Cipher import AES 2 from Crypto import Random 3 from Crypto.Util import Counter 4 5 key = Random.new().read(AES.block_size) 6 7 def encrypt(plaintext): 8 return AES.new(key, AES.MODE_CTR, counter=Counter.new(128)).encrypt(plaintext) 9 10 def xor(a, b): 11 return "".join([chr(ord(x) ^ ord(y)) for (x, y) in zip(a, b)]) 12 13 def edit(ciphertext, offset, newtext): 14 plaintext = encrypt(ciphertext) 15 return encrypt(plaintext[:offset] + newtext + plaintext[offset + len(newtext):]) 16 17 ciphertext = encrypt(open('files/25.txt').read()) 18 injected = ''.join(['A' for i in range(len(ciphertext))]) 19 modified_ciphertext = edit(ciphertext, 0, injected) 20 21 deciphered_plaintext = xor(injected, xor(ciphertext, modified_ciphertext)) 22 print deciphered_plaintext