手を振るまもるくんゆるふわサイバーセキュリティ
監視中のまもるくん

AES暗号をPythonで実装する|共通鍵で安全にデータを暗号化する

2026-09-10実践

#AES#暗号化#共通鍵#Python#実践

保存データや通信を守る主役が、共通鍵暗号 AES です。この記事ではPythonで、改ざん検知までできる AES-GCM を実装します。暗号の基礎の"実装版"。同じ鍵で暗号化・復号する仕組みを手を動かして理解します。

AES-GCMを選ぶ理由

AESには複数の「使い方(モード)」があります。中でも GCM は暗号化と同時に改ざん検知もしてくれる「認証付き暗号(AEAD)」。今どきの推奨はこれ一択です。

💡

共通鍵 = 同じ鍵で暗号化も復号も

AESは送り手も受け手も同じ秘密鍵を持ちます(公開鍵暗号とは別物)。鍵をどう安全に共有するかが課題で、そこは鍵交換や公開鍵暗号が担います。

準備

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

  1. NIST FIPS 197 (2001, 2023改訂). "Advanced Encryption Standard (AES)." Rijndael(Daemen & Rijmen)をベースに標準化。

  2. NIST SP 800-38D. "Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC." 認証タグで改ざんを検知する AEAD。

  3. GCM の nonce 再利用は致命的(Joux の "forbidden attack")。ランダム96bit nonce か、確実に一意なカウンタを使う。鍵はシークレット管理で厳重に扱う。

🔥 この分野の最新トレンドをチェック →

あわせて読みたい