cryptopals

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit c8c259bee7c5effa7917c42bf3317522529277be
parent ed6e472c272093e1fbc331faf037c79522fc32e4
Author: mpizzzle <michael.770211@gmail.com>
Date:   Sat, 21 Oct 2017 17:16:24 +0100

harder ecb crack done where len of prepended randon bytes is known

Diffstat:
Aset2/byte_at_a_time_ecb_decryption_harder.py | 42++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+), 0 deletions(-)

diff --git a/set2/byte_at_a_time_ecb_decryption_harder.py b/set2/byte_at_a_time_ecb_decryption_harder.py @@ -0,0 +1,42 @@ +import sys +from Crypto.Cipher import AES +from Crypto import Random +from Crypto.Random import random + +pt1 = "Um9sbGluJyBpbiBteSA1LjAKV2l0aCBteSByYWctdG9wIGRvd24gc28gbXkg\n" +pt2 = "aGFpciBjYW4gYmxvdwpUaGUgZ2lybGllcyBvbiBzdGFuZGJ5IHdhdmluZyBq\n" +pt3 = "dXN0IHRvIHNheSBoaQpEaWQgeW91IHN0b3A/IE5vLCBJIGp1c3QgZHJvdmUg\n" +pt4 = "YnkK" + +key = Random.new().read(AES.block_size) +plaintext = str(pt1 + pt2 + pt3 + pt4).decode("base64") # no peeking! +randbuffer = Random.new().read(55) + +def encryption_oracle(msg): + return AES.new(key, AES.MODE_ECB).encrypt(randbuffer + msg + plaintext + ''.join(['\x04' for i in range(AES.block_size - (len(randbuffer + msg + plaintext) % AES.block_size))]) if len(randbuffer + msg + plaintext) % AES.block_size != 0 else randbuffer + msg + plaintext) + +def find_len_of_random_prefix(): + prefix_len = 0 + a = encryption_oracle('') + b = encryption_oracle('a') + + a_blocks = [a[i:i + AES.block_size] for i in range(0, len(a), AES.block_size)] + b_blocks = [b[i:i + AES.block_size] for i in range(0, len(b), AES.block_size)] + + for block_a, block_b in zip(a_blocks, b_blocks): + if block_a == block_b: + prefix_len += AES.block_size + + return prefix_len + + +prefix_len = 55#find_len_of_random_prefix() +mod = AES.block_size - prefix_len % AES.block_size +aaa = "AAAAAAAAAAAAAAA" +buf = aaa + ''.join("A" for i in range(mod)) + +for i in range(len(encryption_oracle('')) - prefix_len): + dict = {encryption_oracle(''.join("A" for i in range(mod)) + aaa[i:] + chr(j))[prefix_len + mod : prefix_len + mod + AES.block_size] : chr(j) for j in range(0xff)} + cipher = encryption_oracle(buf[i % AES.block_size:]) + aaa += dict[cipher[prefix_len + mod + (AES.block_size * (i / AES.block_size)) : prefix_len + mod + (AES.block_size * ((i + AES.block_size) / AES.block_size))]] +print aaa[AES.block_size - 1:]