1
0
cryptopal/set2/challenge9.py
2023-09-30 14:01:57 +08:00

36 lines
1.1 KiB
Python

"""
PKCS#7 padding is a byte-padding scheme that pads the
input data to a specific block length by appending N
bytes of value N, where N is the number of bytes required
to reach the desired block size.
"""
def pkcs7_pad(data: bytes, block_size: int) -> bytes:
"""Apply PKCS#7 padding to the given data."""
padding_size = block_size - (len(data) % block_size)
padding = bytes([padding_size] * padding_size)
return data + padding
def pkcs7_unpad(data: bytes, block_size: int) -> bytes:
"""Remove PKCS#7 padding from the given data."""
padding_size = data[-1]
if padding_size > block_size or padding_size == 0:
raise ValueError('Invalid padding')
padding = bytes([padding_size] * padding_size)
if data[-padding_size:] != padding:
raise ValueError('Invalid padding')
return data[:-padding_size]
# Example usage:
data = b"Hello, world??"
block_size = 16
# Pad the data
padded_data = pkcs7_pad(data, block_size)
print(padded_data)
# Unpad the data
unpadded_data = pkcs7_unpad(padded_data, block_size)
print(unpadded_data)