Python을 활용한 AES-CBC 알고리즘 기반 암호화 및 복호화 구현

AES(Advanced Encryption Standard)는 대칭키 암호화 방식 중 하나로, 보안성이 뛰어나 현대 데이터 통신에서 널리 사용됩니다. 그중 CBC(Cipher Block Chaining) 모드는 블록 암호화 방식의 하나로, 각 블록을 암호화하기 전 이전 블록의 암호문과 XOR 연산을 수행하여 보안 강도를 높이는 것이 특징입니다.

환경 설정 및 라이브러리 설치

Python 환경에서 AES 기능을 사용하기 위해서는 환경에 따라 적절한 라이브러리를 설치해야 합니다. 일반적으로 pycryptodome 라이브러리가 널리 권장됩니다.

# Windows 및 최신 환경 (권장)
pip install pycryptodome

# Linux 기존 환경 (구형 라이브러리)
pip install pycrypto

AES-CBC의 핵심 구성 요소

AES-CBC 암호화를 구현할 때는 다음과 같은 필수 요소가 필요합니다.

  • Secret Key (비밀키): 16, 24, 또는 32바이트 크기여야 합니다 (각각 AES-128, AES-192, AES-256에 대응).
  • IV (Initialization Vector, 초기화 벡터): 첫 번째 블록을 암호화할 때 사용되는 16바이트 크기의 값입니다.
  • Padding (패딩): AES는 블록 단위(16바이트)로 동작하므로, 평문의 길이가 블록 크기의 배수가 아닐 경우 부족한 부분을 채워주는 작업이 필요합니다.

구현 예제 코드

다음은 클래스 구조를 활용하여 AES-CBC 암호화 및 복호화를 수행하는 Python 코드입니다. 데이터 전송 시 편의성을 위해 결과값은 Base64로 인코딩합니다.

import base64
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad

class CryptoManager:
    def __init__(self, secret_key: str, iv: str):
        # 16바이트(AES-128) 길이를 보장하기 위해 슬라이싱 처리
        self.key = secret_key[:16].encode('utf-8')
        self.iv = iv[:16].encode('utf-8')
        self.block_size = AES.block_size

    def encrypt_data(self, plain_text: str) -> str:
        """
        데이터를 암호화하고 Base64 문자열로 반환합니다.
        """
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        # PKCS7 스타일 패딩 적용
        padded_data = pad(plain_text.encode('utf-8'), self.block_size)
        encrypted_bytes = cipher.encrypt(padded_data)
        return base64.b64encode(encrypted_bytes).decode('utf-8')

    def decrypt_data(self, cipher_text: str) -> str:
        """
        Base64 암호화 문자열을 복호화하여 원본 데이터를 반환합니다.
        """
        cipher = AES.new(self.key, AES.MODE_CBC, self.iv)
        decoded_bytes = base64.b64decode(cipher_text)
        decrypted_padded = cipher.decrypt(decoded_bytes)
        # 패딩 제거 후 텍스트 변환
        return unpad(decrypted_padded, self.block_size).decode('utf-8')

if __name__ == '__main__':
    # 설정 키 및 초기화 벡터 (실제 환경에서는 환경 변수 등을 통해 안전하게 관리 필요)
    APP_KEY = "36o%SituationSIS"
    APP_IV = "36o%SituationSIS"
    
    manager = CryptoManager(APP_KEY, APP_IV)
    
    # 테스트 데이터: "사용자명 비밀번호" 형식
    original_message = "admin securePassword123"
    
    # 실행
    encrypted_result = manager.encrypt_data(original_message)
    print(f"Encrypted: {encrypted_result}")
    
    decrypted_result = manager.decrypt_data(encrypted_result)
    print(f"Decrypted: {decrypted_result}")

코드 상세 설명

위 코드의 동작 원리는 다음과 같습니다.

  1. 초기화: CryptoManager 클래스는 생성 시 키와 IV를 입력받아 내부적으로 바이트 객체로 변환합니다.
  2. 패딩 처리: Crypto.Util.Paddingpad 함수를 사용하여 평문 데이터를 AES 블록 크기인 16바이트의 배수로 맞춥니다.
  3. 암호화: AES.new를 통해 CBC 모드 객체를 생성하고 encrypt 메서드로 암호화를 수행합니다. 이후 결과값을 base64로 변환하여 텍스트 형태로 안전하게 전달할 수 있게 합니다.
  4. 복호화: 암호화의 역순으로 진행됩니다. base64 디코딩 후 decrypt를 수행하고, 마지막에 unpad를 통해 추가되었던 패딩을 제거하여 원본 텍스트를 복구합니다.

태그: python AES CBC Cryptography PyCryptodome

7월 29일 23:38에 게시됨