-
[Python] AES CBC모드 암호화 및 복호화Python 2023. 10. 28. 19:59728x90반응형
AES CBC모드 암호화 및 복호화 코드를 남겨보려한다.
이번에 사용한 암호화는 AES128인데 128은 128bits를 나타내고 이는 16bytes이다.
그리고 CBC모드는 간단하게 설명하자면 IV(Initialization Vector)와 key를 이용하여 Block(1byte = 1block) 단위로 암호화 복호화를 진행한다고 생각하면된다.
자세한 사항은 다른 페이지에 나와있으니 보면 될 것 같다.
그래서 이번 AES128 CBC모드는 16개의 블럭을 하나의 단위로 보고 암호화를 진행하는데
이 때, 16바이트의 배수가 아닐경우가 발생한다.
그렇기때문에 Padding이라는 것을 해주는데 이는 5바이트의 string이라면 11바이트를 추가적으로 붙여주는 방식이다.
코드는 다음과같다.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding as pad buffer = b"message" padder = pad.PKCS7(128).padder() pad_data = padder.update(buffer) pad_data += padder.finalize() iv = secrets.token_bytes(16) cipher = Cipher(algorithms.AES128(cipher_key),modes.CBC(iv)) encryptor = cipher.encryptor() encrypted_buf = encryptor.update(pad_data) + encryptor.finalize() enc_total_buf[:16] = iv enc_total_buf[16:] = encrypted_buf이렇게 진행하면 encryption 완성이다.
key 로드하는 부분은 이전 페이지에서 올렸으니 참고바라며
total buffer를 만든 이유는 IV를 decryption에 사용하기때문에 하나의 버퍼로 저장하는것이 일반적이라고한다.
그리고 decryption는 encryption과 반대의 과정으로 진행하면되는데
이 때, 놓치지 말아야할것은 padding을 진행했다면 unpadding도 진행해야한다는 사실!
왜냐하면 encryption은 padding한 바이트에대해 진행했기때문이다.
그렇게 decryption 코드는 다음과 같다.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.primitives import padding as pad iv = enc_buf[:16] cipher = Cipher(algorithms.AES128(cipher_key),modes.CBC(bytes(iv))) decryptor = cipher.decryptor() padded_buf = decryptor.update(bytes(enc_buf[16:])) + decryptor.finalize() unpadder = pad.PKCS7(128).unpadder() decrypted_buf = unpadder.update(padded_buf) + unpadder.finalize()이렇게하면 내가 암호화한 내용을 다시 볼 수 있다.
이렇게 암호화 과정 끝
728x90반응형'Python' 카테고리의 다른 글
Window Pyinstaller error '파일에 바이러스 또는 기타 사용자 동의없이 설치된 소프트웨어가 있기 때문에 작업이 완료되지 않았습니다' (0) 2024.01.05 [Python] HMAC SHA256 sign 및 verify (0) 2023.10.28 [Python] cryptography 라이브러리로 RSA encrypt와 sign하기 (0) 2023.10.25 [Python] cryptography 라이브러리로 RSA에 쓰일 .pem file 로드하기 (0) 2023.10.24 [Python] Pycrypto 'RSA.py' error (0) 2023.10.24