
AES暗号をPythonで実装する|共通鍵で安全にデータを暗号化する
2026-09-10 ・ 実践
保存データや通信を守る主役が、共通鍵暗号 AES です。この記事ではPythonで、改ざん検知までできる AES-GCM を実装します。暗号の基礎の"実装版"。同じ鍵で暗号化・復号する仕組みを手を動かして理解します。
AES-GCMを選ぶ理由
AESには複数の「使い方(モード)」があります。中でも GCM は暗号化と同時に改ざん検知もしてくれる「認証付き暗号(AEAD)」。今どきの推奨はこれ一択です。
準備
pip install cryptography
① 鍵とnonceを用意して暗号化
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
key = AESGCM.generate_key(bit_length=256) # 256bitの共通鍵
aesgcm = AESGCM(key)
nonce = os.urandom(12) # 毎回ランダムな12バイト
plaintext = b"社外秘: 新製品は3月発表"
aad = b"context-v1" # 認証だけする付加データ(任意)
ciphertext = aesgcm.encrypt(nonce, plaintext, aad)
print("暗号文(hex):", ciphertext.hex()[:48], "...")
② 復号する
decrypted = aesgcm.decrypt(nonce, ciphertext, aad)
print("復号:", decrypted.decode()) # 社外秘: 新製品は3月発表
同じ鍵・nonce・aadがそろって初めて復号できます。
③ 改ざんは検知される
暗号文を1バイトでも書き換えると、復号は例外で拒否されます。
from cryptography.exceptions import InvalidTag
tampered = bytearray(ciphertext); tampered[0] ^= 1 # 1ビット改ざん
try:
aesgcm.decrypt(nonce, bytes(tampered), aad)
except InvalidTag:
print("改ざん検知!復号を拒否しました")
出力は 改ざん検知!復号を拒否しました。GCMは暗号化と改ざん検知を同時に担うので、「復号できたのに中身が偽物」という事故を防げます。
nonceは使い回さない
同じ鍵で同じnonceを2回使うと、GCMの安全性は崩壊します。nonceは**毎回ランダム(またはカウンタで一意)**にすること。鍵はもちろん秘密に、環境変数やシークレット管理で扱います。
まとめ
- AES-GCMは暗号化と改ざん検知を同時に行う認証付き暗号
- 共通鍵(送受で同じ鍵)+毎回ランダムなnonceで暗号化
- 鍵・nonce・aadがそろわないと復号できない
- 改ざんは
InvalidTagで拒否される。nonce使い回しは厳禁
もう少し詳しく(背景と理論)
AES は2001年に NIST が標準化した共通鍵暗号で、公募で選ばれた Rijndael が実体です(FIPS 197)1。ブロック長128bit、鍵長は128/192/256bit。ここで使った GCM モードは、暗号化と改ざん検知を同時に行う認証付き暗号(AEAD)で、その方式は NIST SP 800-38D で規定されています2。実装上の最重要ポイントは nonce(IV)を鍵ごとに絶対に再利用しないこと——GCM で nonce を使い回すと認証鍵が漏れ、機密性・完全性が同時に崩壊します3。素の AES(ECB/CBC 単体、認証なし)はパディングオラクル等の攻撃対象になりうるため、現代は AEAD が推奨です。
次の一歩 🌸
鍵をどう共有するかはディフィー・ヘルマン鍵交換、暗号の全体像は暗号の基礎、鍵の保管はシークレット管理へどうぞ。
Footnotes
-
NIST FIPS 197 (2001, 2023改訂). "Advanced Encryption Standard (AES)." Rijndael(Daemen & Rijmen)をベースに標準化。 ↩
-
NIST SP 800-38D. "Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC." 認証タグで改ざんを検知する AEAD。 ↩
-
GCM の nonce 再利用は致命的(Joux の "forbidden attack")。ランダム96bit nonce か、確実に一意なカウンタを使う。鍵はシークレット管理で厳重に扱う。 ↩