ecb_cbc_detection_oracle.py (1002B)
1 from Crypto.Cipher import AES 2 from Crypto import Random 3 from Crypto.Random import random 4 from sets import Set 5 6 def random_key(): 7 return Random.new().read(AES.block_size) 8 9 def encryption_oracle(msg): 10 plaintext = msg 11 ciphertext = "" 12 13 for i in range(random.randint(5, 10)): 14 plaintext = 'x00' + plaintext 15 for i in range(random.randint(5, 10)): 16 plaintext += 'x00' 17 18 pad_len = AES.block_size - (len(plaintext) % AES.block_size) 19 plaintext += ''.join([chr(pad_len) for i in range(pad_len)]) 20 21 if random.randint(0, 1): 22 ciphertext = AES.new(random_key(), AES.MODE_ECB).encrypt(plaintext) 23 print True 24 else: 25 ciphertext = AES.new(random_key(), AES.MODE_CBC, random_key()).encrypt(plaintext) 26 print False 27 28 return ciphertext 29 30 ciphertext = encryption_oracle(open('files/10_decrypted.txt').read()) 31 32 blocks = [ciphertext[i:i + AES.block_size] for i in range(0, len(ciphertext), AES.block_size)] 33 34 print len(blocks) != len(Set(blocks))