[Python3] AES

Alexandria·2024년 3월 3일

Python3 Advanced

목록 보기
6/27
post-thumbnail

1. 암호화

블록 알고리즘이기 때문에 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('

2. 복호화

블록 알고리즘이기 때문에 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
profile
IT 도서관

0개의 댓글