cryptopals

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

byte_at_a_time_ecb_decryption.py (1237B)


      1 from Crypto.Cipher import AES
      2 from Crypto import Random
      3 
      4 pt1 = "Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkgn"
      5 pt2 = "aGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBqn"
      6 pt3 = "dXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUgn"
      7 pt4 = "YnkK"
      8 
      9 key = Random.new().read(AES.block_size)
     10 plaintext = str(pt1 + pt2 + pt3 + pt4).decode("base64") # no peeking!
     11 
     12 def encryption_oracle(msg):
     13     pad_len = AES.block_size - (len(msg + plaintext) % AES.block_size)
     14     return AES.new(key, AES.MODE_ECB).encrypt(msg + plaintext + ''.join([chr(pad_len) for i in range(pad_len)]))
     15 
     16 def find_len_of_padding():
     17     for i in range(AES.block_size):
     18         if len(encryption_oracle(''.join('x00' for j in range(i)))) != len(encryption_oracle(''.join('x00' for j in range(i + 1)))):
     19             return i + 1
     20 
     21 aaa = buf = "AAAAAAAAAAAAAAA"
     22 
     23 for i in range(len(encryption_oracle('')) - find_len_of_padding()):
     24     dict = {encryption_oracle(aaa[i:] + chr(j))[:AES.block_size] : chr(j) for j in range(256)}
     25     cipher = encryption_oracle(buf[i % AES.block_size:])
     26     aaa += dict[cipher[AES.block_size * (i / AES.block_size) : AES.block_size * ((i + AES.block_size) / AES.block_size)]]
     27 
     28 print aaa[AES.block_size - 1:]