def test_padding_bytes_will_be_size_of_padding_when_padding_one_byte(self): pt = bytearray("YELLOW SUBMARIN") blocksize = 16 padded = pkcs7_pad(pt, blocksize) self.assertEquals(1, padded[-1])
def test_padding_should_work_with_one_byte_to_pad(self): pt = bytearray("YELLOW SUBMARIN") blocksize = 16 padded = pkcs7_pad(pt, blocksize) self.assertEquals(16, len(padded))
def test_padding_multiple_of_blocksize_should_have_correct_padding_bytes(self): pt = bytearray("XXXX----XXXX----YELLOW SUBMARIN") blocksize = 16 padded = pkcs7_pad(pt, blocksize) self.assertEquals(1, padded[-1])
def create_encrypted_response(self, headers, code, reason, body, aes): response = 'HTTP/1.1 {0} {1}'.format(code, reason) response += '\r\n' + str(headers) + '\r\n\r\n' + body payload = aes.encrypt(utils.pkcs7_pad(response)) return payload
def test_padding_should_work_when_padding_a_block_of_right_length(self): pt = bytearray("YELLOW SUBMARINE") blocksize = 16 padded = pkcs7_pad(pt, blocksize) self.assertEquals(32, len(padded))
def test_padding_multiple_of_blocksize_should_have_correct_padding_bytes( self): pt = bytearray("XXXX----XXXX----YELLOW SUBMARIN") blocksize = 16 padded = pkcs7_pad(pt, blocksize) self.assertEquals(1, padded[-1])
def test_when_padding_two_bytes_they_should_have_value_of_3(self): pt = bytearray("YELLOW SUBMAR") blocksize = 16 padded = pkcs7_pad(pt, blocksize) self.assertEquals(3, padded[-1]) self.assertEquals(3, padded[-2]) self.assertEquals(3, padded[-3])
def oracle(plain): random.seed(1337) aes_key = ''.join(chr(random.randint(0, 255)) for _ in range(16)) prefix_nbr = random.randint(0, 50) # random count of bytes prefix = ''.join(chr(random.randint(0, 255)) for _ in range(prefix_nbr)) p = prefix + plain + UNKNOWN p_pad = pkcs7_pad(p, 16) c = aes_encrypt_ecb(p_pad, aes_key) return c
def create_payload(self, headers, method, uri, body, pubkey): rng = Random.new() key = rng.read(32) iv = rng.read(16) a = AES.new(key, AES.MODE_CBC, iv) request = '{0} {1} HTTP/1.1'.format(method, uri) request += '\r\n' + str(headers) + '\r\n\r\n' + body payload = a.encrypt(utils.pkcs7_pad(request)) return payload, pubkey.encrypt(key + iv, os.urandom(256)), a
def aes_encrypt(m, k, mode, iv = None): aes = AES.new(k, AES.MODE_ECB) c = "" # Add padding if len(m) % BLOCK_SIZE() != 0: m = m + pkcs7_pad(len(m), BLOCK_SIZE()) if mode == "CBC": if iv is None: raise ValueError("CBC mode requires an IV.") else: for i in range(0, len(m), BLOCK_SIZE()): block = xor(m[i:i + BLOCK_SIZE()], iv) iv = aes.encrypt(block) c = c + iv return c elif mode == "ECB": for i in range(0, len(m), BLOCK_SIZE()): c = c + aes.encrypt(m[i:i + BLOCK_SIZE()]) return c else: raise ValueError("Incorrect mode used: " + mode)
import utils print(b"YELLOW SUBMARINE\x04\x04\x04\x04" == utils.pkcs7_pad( b"YELLOW SUBMARINE", 20))