PythonでAES-GCMを暗号化・復号化する
適切なノンス管理を伴う認証付き暗号化を実装します。
「PythonでAES-GCMを暗号化・復号化する」はCoddyKit上の無料Cryptology Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCryptology Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Cryptology Academyコースには全4レッスンが含まれています。
AES-GCMを使用する理由
AES-GCMはAuthenticated Encryption with Associated Data (AEAD)方式です。機密性(AES-CTR)と完全性・真正性(GHASH MAC)を1回の処理で提供する、現代の暗号化における標準方式です。
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)Additional Authenticated Data (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)はノンス誤用耐性を備えています。ノンスを再利用すると、2つの平文が同一であることは漏えいしますが、真正性が破られることはありません。ノンスの一意性を保証するのが難しい場合は、こちらを優先してください。
暗号化前の鍵導出
生のパスワードを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を使用しています。100 MBを超えるファイルには、低レベルのCipher APIを使ったチャンク単位のストリーミングを使用してください。
理解度チェック
同じ鍵でAES-GCMの同じノンスを2回使用すると、何が起こりますか?
学習内容のまとめ
AES-GCMは、1回の処理で認証付き暗号化を提供します。暗号化ごとに新しい96ビットのランダムなノンスを使用してください。保存時にはノンスを暗号文の先頭に付加します。AADによって暗号文をコンテキストに関連付けます。AES-GCM-SIVはノンスの誤用に耐性があります。鍵はHKDFで導出し、生のパスワードは決して使用しないでください。
よくある質問
「PythonでAES-GCMを暗号化・復号化する」レッスンは無料ですか?
はい。「PythonでAES-GCMを暗号化・復号化する」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Cryptology Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Cryptology Academyコースには全4レッスンが含まれています。
「PythonでAES-GCMを暗号化・復号化する」で何を学びますか?
適切なノンス管理を伴う認証付き暗号化を実装します。 ブラウザで直接実行するハンズオンコードでCryptology Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Cryptology Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCryptology Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「PythonでAES-GCMを暗号化・復号化する」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCryptology Academyレッスンでコードを書いて実行できますか?
はい。すべてのCryptology Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Python cryptographyライブラリの概要
- PythonでAES-GCMを暗号化・復号化する
- PythonでRSAとECDSAの鍵ペアを扱う
- Python暗号でよくある落とし穴と安全なパターン