cryptopals

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

commit 82e6fb6b919162dcc0b801d7a8094fa18bde5228
parent 2c14f2e2a1a97bba3f48503feb90661ec9a5876e
Author: mpizzzle <michael.770211@gmail.com>
Date:   Mon, 30 Oct 2017 17:56:26 +0000

temp commit for challenge 17

Diffstat:
Aset3/cbc_padding_oracle.py | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aset3/files/17.txt | 10++++++++++
2 files changed, 78 insertions(+), 0 deletions(-)

diff --git a/set3/cbc_padding_oracle.py b/set3/cbc_padding_oracle.py @@ -0,0 +1,68 @@ +from Crypto.Cipher import AES +from Crypto import Random +from Crypto.Random import random + +key = Random.new().read(AES.block_size) +iv = Random.new().read(AES.block_size) + +with open('files/17.txt') as f: + split_file = f.read().splitlines() + +def pkcs7_padding_validator(msg): + if ord(msg[len(msg) - 1]) > AES.block_size or ord(msg[len(msg) - 1]) == 0: + return False + for c in msg[:len(msg) - ord(msg[len(msg) - 1]) - 1 : -1]: + if c != msg[len(msg) - 1]: + return False + return True + +qwer = random.randint(0, 9) +def encryption_oracle(): + plaintext = split_file[3] + pad_len = AES.block_size - (len(plaintext) % AES.block_size) + return AES.new(key, AES.MODE_CBC, iv).encrypt(plaintext + ''.join([chr(pad_len) for i in range(pad_len)])) + +def decrypt_and_validate_padding(ciphertext): + return pkcs7_padding_validator(AES.new(key, AES.MODE_CBC, iv).decrypt(ciphertext)) + +ct1 = iv + encryption_oracle() +blocks = [ct1[i:i + AES.block_size] for i in range(0, len(ct1), AES.block_size)] +pt = "" + +for block in blocks[::-1][:len(blocks) - 1]: + + b = list(block)#list(blocks[len(blocks) - 2]) + blep = [] + + for i in range(AES.block_size): + ignore = b[AES.block_size - (i + 1)] + br = False + + for j in range(0xff): + if chr(j) != ignore: + b[AES.block_size - (i + 1)] = chr(j) + + blocks[len(blocks) - 2] = ''.join(b) + + if decrypt_and_validate_padding(''.join(blocks)): + pt += chr(j ^ ord(ignore) ^ (i + 1)) + print list(chr(j ^ ord(ignore) ^ (i + 1))) + blep.append(j) + + for k in range(i + 1): + b[AES.block_size - (k + 1)] = chr(blep[k] ^ (k + 1) ^ (i + 2)) + + br = True + break + + if not br: + blep.append(ord(ignore)) + + for k in range(i + 1): + b[AES.block_size - (k + 1)] = chr(blep[k] ^ (k + 1) ^ (i + 2)) + print list("br" + chr(i + 1)) + pt += chr(i + 1) + +print pt[::-1] +print split_file[3] +print pt[::-1].decode("base64") diff --git a/set3/files/17.txt b/set3/files/17.txt @@ -0,0 +1,10 @@ +MDAwMDAwTm93IHRoYXQgdGhlIHBhcnR5IGlzIGp1bXBpbmc= +MDAwMDAxV2l0aCB0aGUgYmFzcyBraWNrZWQgaW4gYW5kIHRoZSBWZWdhJ3MgYXJlIHB1bXBpbic= +MDAwMDAyUXVpY2sgdG8gdGhlIHBvaW50LCB0byB0aGUgcG9pbnQsIG5vIGZha2luZw== +MDAwMDAzQ29va2luZyBNQydzIGxpa2UgYSBwb3VuZCBvZiBiYWNvbg== +MDAwMDA0QnVybmluZyAnZW0sIGlmIHlvdSBhaW4ndCBxdWljayBhbmQgbmltYmxl +MDAwMDA1SSBnbyBjcmF6eSB3aGVuIEkgaGVhciBhIGN5bWJhbA== +MDAwMDA2QW5kIGEgaGlnaCBoYXQgd2l0aCBhIHNvdXBlZCB1cCB0ZW1wbw== +MDAwMDA3SSdtIG9uIGEgcm9sbCwgaXQncyB0aW1lIHRvIGdvIHNvbG8= +MDAwMDA4b2xsaW4nIGluIG15IGZpdmUgcG9pbnQgb2g= +MDAwMDA5aXRoIG15IHJhZy10b3AgZG93biBzbyBteSBoYWlyIGNhbiBibG93