AES(Advanced Encryption Standard)는 대칭 키 암호화 알고리즘으로, 데이터의 기밀성을 보장하기 위해 널리 사용됨.
이 중 AES-256은 256비트 키를 사용하여 가장 높은 수준의 보안을 제공합니다.
이번 글에서는 AES-256 CTR(카운터) 모드에 대해 설명하고, 이를 Python 코드로 구현.
AES-256 CTR 모드란?
CTR 모드는 AES의 여러 운영 모드 중 하나로, 암호화 및 복호화 과정에서 카운터 값을 사용합니다. 이 모드의 주요 장점은 병렬 처리가 가능하다는 것입니다. 이를 통해 성능을 크게 향상시킬 수 있습니다.
CTR 모드의 작동 방식은 다음과 같습니다:
- 초기화 벡터(IV)와 카운터를 결합하여 입력 블록을 생성합니다.
- 이 입력 블록을 AES 암호화 하여 암호화된 카운터 블록을 얻습니다.
- 이 블록을 평문 블록과 XOR 연산하여 암호문 블록을 생성합니다.
- 복호화 과정에서는 동일한 절차를 통해 암호문을 평문으로 변환합니다.
CTR 모드는 동일한 키와 IV를 사용하면 동일한 카운터 블록을 생성하기 때문에, 항상 서로 다른 IV를 사용하는 것이 중요합니다.
Python 코드 예제
다음은 Python을 사용하여 AES-256 CTR 모드 암호화를 구현하는 예제입니다. cryptography 라이브러리를 사용하여 쉽게 구현할 수 있습니다.
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import padding
from cryptography.hazmat.backends import default_backend
import os
# 암호화 함수
def encrypt_aes_256_ctr(key, plaintext):
iv = os.urandom(16) # IV는 16바이트 길이로 무작위 생성
cipher = Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend())
encryptor = cipher.encryptor()
# 패딩 추가 (옵션)
padder = padding.PKCS7(algorithms.AES.block_size).padder()
padded_data = padder.update(plaintext) + padder.finalize()
ciphertext = encryptor.update(padded_data) + encryptor.finalize()
return iv + ciphertext
# 복호화 함수
def decrypt_aes_256_ctr(key, ciphertext):
iv = ciphertext[:16] # IV는 암호문의 처음 16바이트
actual_ciphertext = ciphertext[16:]
cipher = Cipher(algorithms.AES(key), modes.CTR(iv), backend=default_backend())
decryptor = cipher.decryptor()
padded_plaintext = decryptor.update(actual_ciphertext) + decryptor.finalize()
# 패딩 제거 (옵션)
unpadder = padding.PKCS7(algorithms.AES.block_size).unpadder()
plaintext = unpadder.update(padded_plaintext) + unpadder.finalize()
return plaintext
# 예제 사용
key = os.urandom(32) # 256비트 키 생성
plaintext = b"This is a secret message."
# 암호화
ciphertext = encrypt_aes_256_ctr(key, plaintext)
print("Ciphertext:", ciphertext)
# 복호화
decrypted_text = decrypt_aes_256_ctr(key, ciphertext)
print("Decrypted text:", decrypted_text)
(ChatGPT,, Thank you)
코드 설명
- 키 생성: os.urandom(32)을 사용하여 256비트(32바이트) 키를 생성
- 암호화:
- IV를 생성하고(os.urandom(16)), AES-256 CTR 모드로 암호화기를 초기화
- 평문에 패딩을 추가하여 블록 크기를 맞춘 후 암호화
- 최종 암호문은 IV와 암호문을 결합한 것
- 복호화:
- 암호문에서 IV를 추출하고, AES-256 CTR 모드로 복호화기를 초기화
- 복호화된 텍스트에서 패딩을 제거하여 원래의 평문을 얻