def encrypt(self, pt: bytes) -> bytes: blks = [self.IV]+split_blocks(pkcs7_pad(pt, 16), 16) prev = blks[0] for i in blks[1:]: self.ct += [self.encrypt_ecb(xor(prev,i))] prev = self.ct[-1] return b''.join(self.ct)
def attack() -> bytes: ct = profile_for(b'*****@*****.**') atk = ct[:-16] + profile_for(b'a' * 10 + pkcs7_pad(b'admin', 16))[16:32] return bytes_2_dict(ecb_decrypt(atk, KEY))
#!/usr/bin/python3 from Cryptopals import pkcs7_pad, pkcs7_unpad if __name__ == '__main__': assert b'abc' == pkcs7_unpad(pkcs7_pad(b'abc'))
def black_box(pt: bytes) -> bytes: pt = pkcs7_pad(add(pt, b'\x00'), 16) if (randint(0, 1)): return ecb(pt, urandom(16)), 1 return cbc(pt, urandom(16), urandom(16)), 0
#!/usr/bin/python3 from Cryptopals import pkcs7_pad if __name__ == '__main__': assert pkcs7_pad(b"YELLOW SUBMARINE", 20) == b'YELLOW SUBMARINE\x04\x04\x04\x04'