0Pricing
Cryptology Academy · 강의

Python에서 AES-GCM 암호화 및 복호화

논스를 올바르게 관리하며 인증 암호화를 구현합니다.

Python에서 AES-GCM 암호화 및 복호화은(는) CoddyKit의 무료 Cryptology Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Cryptology Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

AES-GCM을 사용하는 이유

AES-GCM은 연관 데이터가 있는 인증 암호화(Authenticated Encryption with Associated Data, AEAD) 방식입니다. 한 번의 처리로 기밀성(AES-CTR)과 무결성 및 인증성(GHASH MAC)을 제공합니다. 따라서 현대 암호화의 표준으로 사용됩니다.

GCM 구성 요소: CTR + GHASH

AES-GCM은 카운터 모드의 AES(암호화)와 GHASH 다항식 MAC(인증)을 결합한 것입니다. 128비트 인증 태그는 암호문과 선택적인 추가 인증 데이터(Additional Authenticated Data, AAD)를 모두 포함합니다.

논스 요구 사항

96비트 논스는 같은 키와 함께 절대로 재사용해서는 안 됩니다. 논스를 재사용하면 GCM의 보안이 완전히 무너집니다. 공격자가 인증 키를 복구하고 암호문을 위조할 수 있습니다. 무작위 논스를 사용하거나 키를 교체하면서 카운터를 사용하십시오.

Python에서 AES-GCM으로 암호화하기

hazmat 계층을 사용합니다.

import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

# Generate a 256-bit key
key = AESGCM.generate_key(bit_length=256)
aesgcm = AESGCM(key)

# Fresh 96-bit nonce per encryption
nonce = os.urandom(12)

plaintext = b"sensitive payload"
aad = b"user_id=42"  # authenticated but not encrypted

ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("Nonce:", nonce.hex())
print("Ciphertext+tag:", ciphertext.hex())

Python에서 AES-GCM으로 복호화하기

복호화하면 태그가 자동으로 검증되며, 검증에 실패하면 InvalidTag가 발생합니다.

from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.exceptions import InvalidTag

# key, nonce, ciphertext, aad from previous step
try:
    recovered = aesgcm.decrypt(nonce, ciphertext, aad)
    print("Decrypted:", recovered)
except InvalidTag:
    print("Authentication failed — ciphertext tampered!")

논스와 암호문 저장하기

저장하기 전에 논스를 암호문 앞에 붙이십시오. 복호화할 때는 바이트 12를 기준으로 분리합니다.

def encrypt_blob(key: bytes, data: bytes, aad: bytes = b"") -> bytes:
    aesgcm = AESGCM(key)
    nonce = os.urandom(12)
    ct = aesgcm.encrypt(nonce, data, aad or None)
    return nonce + ct  # prepend nonce

def decrypt_blob(key: bytes, blob: bytes, aad: bytes = b"") -> bytes:
    aesgcm = AESGCM(key)
    nonce, ct = blob[:12], blob[12:]
    return aesgcm.decrypt(nonce, ct, aad or None)

추가 인증 데이터(AAD)

AAD는 인증되지만 암호화되지는 않습니다. 이를 사용해 암호문을 컨텍스트에 연결하십시오. 예를 들어 사용자 ID, 레코드 ID, API 버전을 연결할 수 있습니다. 그러면 공격자가 유효한 암호문을 다른 컨텍스트로 옮기는 것을 방지할 수 있습니다.

저수준 Cipher API 사용하기

스트리밍 암호화 또는 제자리 암호화를 수행하려면 GCM 모드와 함께 Cipher API를 직접 사용하십시오.

from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

key = os.urandom(32)
nonce = os.urandom(12)
cipher = Cipher(algorithms.AES(key), modes.GCM(nonce))
encryptor = cipher.encryptor()
encryptor.authenticate_additional_data(b"aad-value")
ct = encryptor.update(b"hello world") + encryptor.finalize()
tag = encryptor.tag
print("Tag:", tag.hex())

논스 오용 저항성: AES-GCM-SIV

AES-GCM-SIV(RFC 8452)는 논스 오용에 강합니다. 논스를 재사용하면 두 평문이 동일하다는 정보가 유출되지만 인증을 NOT 깨뜨리지는 않습니다. 논스의 고유성을 보장하기 어려울 때 우선 사용하십시오.

암호화 전 키 파생

원시 비밀번호를 AES 키로 절대 사용하지 마십시오. Argon2 또는 HKDF를 사용해 키를 파생하십시오.

from cryptography.hazmat.primitives.kdf.hkdf import HKDF
from cryptography.hazmat.primitives import hashes
import os

master_secret = b"shared_secret_from_ECDH"
salt = os.urandom(16)
kdf = HKDF(algorithm=hashes.SHA256(), length=32, salt=salt, info=b"aes-gcm-key")
aes_key = kdf.derive(master_secret)
print("Derived AES key:", aes_key.hex())

성능 고려 사항

AES-NI 하드웨어 가속을 사용하면 AES-GCM은 매우 빠르게 동작합니다(최신 CPU에서 약 1~4 GB/s). Python cryptography는 AES-NI를 활용하는 OpenSSL을 사용합니다. 100MB보다 큰 파일에는 저수준 Cipher API를 사용한 청크 단위 스트리밍을 적용하십시오.

이해도 확인

같은 키에서 AES-GCM에 동일한 논스를 두 번 사용하면 어떻게 됩니까?

학습 내용 복습

AES-GCM은 한 번의 처리로 인증된 암호화를 제공합니다. 암호화할 때마다 새로운 96비트 무작위 논스를 사용하십시오. 저장할 때는 논스를 암호문 앞에 붙이십시오. AAD는 암호문을 컨텍스트에 연결합니다. AES-GCM-SIV는 논스 오용을 견딥니다. HKDF로 키를 파생하고 원시 비밀번호는 절대 사용하지 마십시오.

자주 묻는 질문

“Python에서 AES-GCM 암호화 및 복호화” 강의는 무료인가요?

네 — “Python에서 AES-GCM 암호화 및 복호화” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Cryptology Academy 강의 전체를 잠금 해제할 수 있습니다. Cryptology Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“Python에서 AES-GCM 암호화 및 복호화”에서 뭘 배우나요?

논스를 올바르게 관리하며 인증 암호화를 구현합니다. 브라우저에서 직접 실행하는 실습 코드로 Cryptology Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Cryptology Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Cryptology Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.

“Python에서 AES-GCM 암호화 및 복호화” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Cryptology Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Cryptology Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Python 암호화 라이브러리 개요
  2. Python에서 AES-GCM 암호화 및 복호화
  3. Python의 RSA 및 ECDSA 키 쌍
  4. 흔한 Python 암호화 실수와 안전한 패턴
← Cryptology Academy(으)로 돌아가기