cryptopals

https://cryptopals.com/
Log | Files | Refs

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))