cryptopals

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

commit 4817ae8c1c653a71670777ad47d5fddb13f41c75
parent d770e4e07826a278ef15573a6bcade4936bf39e8
Author: mpizzzle <michael.770211@gmail.com>
Date:   Mon, 30 Oct 2017 20:19:21 +0000

Set 3 Challenge 17 complete kind of, fucks up randomly

Diffstat:
Mset3/cbc_padding_oracle.py | 83+++++++++++++++++++++++++++++++++++++++++--------------------------------------
1 file changed, 43 insertions(+), 40 deletions(-)

diff --git a/set3/cbc_padding_oracle.py b/set3/cbc_padding_oracle.py @@ -8,6 +8,14 @@ iv = Random.new().read(AES.block_size) with open('files/17.txt') as f: split_file = f.read().splitlines() +def encryption_oracle(): + plaintext = split_file[random.randint(0, 9)] + 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)) + def pkcs7_padding_validator(msg): if ord(msg[len(msg) - 1]) > AES.block_size or ord(msg[len(msg) - 1]) == 0: return False @@ -16,51 +24,46 @@ def pkcs7_padding_validator(msg): 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 pkcs7_padding_stripper(msg): + if ord(msg[len(msg) - 1]) > AES.block_size or ord(msg[len(msg) - 1]) == 0: + raise Exception("invalid pkcs7 padding") + for c in msg[:len(msg) - ord(msg[len(msg) - 1]) - 1 : -1]: + if c != msg[len(msg) - 1]: + raise Exception("invalid pkcs7 padding") + return msg[:len(msg) - ord(msg[len(msg) - 1])] -def decrypt_and_validate_padding(ciphertext): - return pkcs7_padding_validator(AES.new(key, AES.MODE_CBC, iv).decrypt(ciphertext)) +ciphertext = iv + encryption_oracle() +plaintext = "" -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]: -#for x in reversed(range(len(blocks) - 2)): -for x in range(len(blocks) - 1): - blocks = [ct1[i:i + AES.block_size] for i in range(0, len(ct1), AES.block_size)] - blocks_copy = blocks - block = list(blocks_copy[len(blocks_copy) - (x + 2)]) - blep = [] +for b_idx in reversed(range((len(ciphertext) / AES.block_size) - 1)): + blocks = [ciphertext[i : i + AES.block_size] for i in range(0, len(ciphertext), AES.block_size)] + block = list(blocks[b_idx]) + padding = [] for i in range(AES.block_size): - ignore = block[AES.block_size - (i + 1)] - br = False + byte = block[AES.block_size - i - 1] + found = False for j in range(0xff): - if chr(j) != ignore: - block[AES.block_size - (i + 1)] = chr(j) - blocks_copy[len(blocks) - (x + 2)] = ''.join(block) - - if decrypt_and_validate_padding(''.join(blocks_copy[:len(blocks_copy) - x])): - pt += chr(j ^ ord(ignore) ^ (i + 1)) - print list(chr(j ^ ord(ignore) ^ (i + 1))) - blep.append(j) - for k in range(i + 1): - block[AES.block_size - (k + 1)] = chr(blep[k] ^ (k + 1) ^ (i + 2)) - br = True - break - - if not br: - blep.append(ord(ignore)) + if chr(j) != byte: + block[AES.block_size - i - 1] = chr(j) + blocks[b_idx] = ''.join(block) + + if decrypt_and_validate_padding(''.join(blocks[:b_idx + 2])): + plaintext += chr(j ^ ord(byte) ^ (i + 1)) + padding.append(j) + + for k in range(i + 1): + block[AES.block_size - k - 1] = chr(padding[k] ^ (k + 1) ^ (i + 2)) + + found = True + break + + if not found: + plaintext += chr(i + 1) + padding.append(ord(byte)) + for k in range(i + 1): - block[AES.block_size - (k + 1)] = chr(blep[k] ^ (k + 1) ^ (i + 2)) - print list("br" + chr(i + 1)) - pt += chr(i + 1) + block[AES.block_size - k - 1] = chr(padding[k] ^ (k + 1) ^ (i + 2)) -print pt[::-1] -print split_file[3] -#print pt[::-1].decode("base64") +print pkcs7_padding_stripper(plaintext[::-1]).decode("base64")