
블록 알고리즘이기 때문에 key, iv와 암호화 대상의 크기는 블록 사이즈만큼 나뉘어 떨어져야 합니다. 그래서 나뉘어 떨어지지 않는 데이터에 대해서는 PKCS 패딩을 적용해야 합니다.
키의 길이가 128비트에 CBC 방식으로 암호화를 진행한다면 AES-128-CBC이고, 256비트에 CBC 방식으로 암호화를 진행한다면 AES-256-CBC라고 명명합니다.
from Cryptodome.Cipher import AES # pip3 install pycryptodomex
padding = lambda s: s + (AES.block_size - len(s.encode()) % AES.block_size) * chr(AES.block_size - len(s.encode()) % AES.block_size)
KEY = b"1234567812345678"
IV = b"abcdefghijklmnop"
PLAIN_TEXT = "Hello World"
cipher = AES.new(KEY, AES.MODE_CBC, IV)
cipher_text = cipher.encrypt(padding(PLAIN_TEXT).encode())
print(cipher_text) # b'\x89\xa2FT\xa4|b(\xe8\xf0\xc0\xcd6\xf7\x13('
블록 알고리즘이기 때문에 key, iv와 복호화 대상의 크기는 블록 사이즈만큼 나뉘어 떨어져야 합니다. 동시에 대칭키를 사용하는 암호이기 때문에 암호화에 사용했던 key, iv를 사용해야 정상적으로 복호화가 가능합니다.
복호화 후 PKCS 패딩이 적용된 상태이기 때문에 역으로 패딩을 없애줍니다.
from Cryptodome.Cipher import AES # pip3 install pycryptodomex
unpadding = lambda s: s[:-ord(s[len(s) - 1:])]
KEY = b"1234567812345678"
IV = b"abcdefghijklmnop"
CIPHER_TEXT = b'\x89\xa2FT\xa4|b(\xe8\xf0\xc0\xcd6\xf7\x13('
cipher = AES.new(KEY, AES.MODE_CBC, IV)
plain_text = unpadding(cipher.decrypt(CIPHER_TEXT)).decode()
print(plain_text) # Hello World