レッスン 1-2
暗号が
読み終えたらnonce の
この頁の流れ
AES-GCM は、
出典を確かめた日 2026年10月27日
なぜ通るのか
会員の
この
共通鍵暗号、
AES-GCM が守る 2 つ
AES-GCM は、
| 部品 | 役目 |
|---|---|
| 鍵 | 秘密に |
| nonce | 秘密ではないが、 |
| 付け足すデータ | 暗号化しないが、 |
| タグ | 暗号文に |
復号の
nonce の使い回しで何が崩れるか
SP 800-38D は、
| 崩れる物 | 何が |
|---|---|
| 読まれないこと | 同じ |
| 書き | 改ざん検知に |
1 つ目は、
nonce を
鍵の置き場で崩れる
計算が
NIST の
脆いコードと直したコード
ラボの
nonce を固定するか、毎回作るか
Python
NONCE = b"\x00" * 12
def seal(key, data):
return AESGCM(key).encrypt(
NONCE, data, None)Python
def seal(key, data):
nonce = os.urandom(12)
ct = AESGCM(key).encrypt(
nonce, data, None)
return nonce + ct
def unseal(key, blob):
return AESGCM(key).decrypt(
blob[:12], blob[12:], None)脆い方は、
鍵をコードに置くか、外から渡して行と結び付けるか
Python
KEY = bytes.fromhex("8f1c...")
def save_card(db, user_id, card):
db[user_id] = seal(KEY, card)Python
def save_card(db, key, user_id, card):
nonce = os.urandom(12)
aad = user_id.encode()
ct = AESGCM(key).encrypt(
nonce, card, aad)
db[user_id] = nonce + ct
def load_card(db, key, user_id):
blob = db[user_id]
return AESGCM(key).decrypt(
blob[:12], blob[12:],
user_id.encode())直した
ログでの見え方と検知
直した
記録
cryptography.exceptions.InvalidTagこの
| 見る物 | なぜ効くか |
|---|---|
| コードの | 書いた |
| 同じ | nonce は |
| 復号の | ふだんは |
| 鍵の | 暗号期間と、 |
鍵
直し方と、直ったことの確かめ方
自分の
- 作業用の
フォルダに 仮想環境を 作り、 cryptography を 入れる - ラボ用の鍵を
AESGCM.generate_keyで作り、脆い sealで同じ 平文を 2 回暗号化して、 暗号文が まったく 同じに なる ことを 確かめる - 直した
sealに置き換え、 同じ 平文でも nonce と 暗号文が 毎回 変わる ことを 確かめる - 2 人分の
カード番号を save_cardで保存し、 2 つの 行の 暗号文を 入れ替えてから load_cardを呼び、InvalidTagで止まる ことを 確かめる - 下の
試験を 足し、 固定の nonce や、 付け足す データを 外した コードに 戻すと 試験が 落ちる ことも 確かめる - 終わったら、
仮想環境と 鍵を 作業用の フォルダごと消す
Python
def test_nonce_changes(key):
a = seal(key, b"same")
b = seal(key, b"same")
assert a[:12] != b[:12]
assert a != b
def test_swapped_rows_fail(key):
db = {}
save_card(db, key, "u1", b"4111")
save_card(db, key, "u2", b"5500")
a, b = db["u1"], db["u2"]
db["u1"], db["u2"] = b, a
with pytest.raises(InvalidTag):
load_card(db, key, "u1")試験は
あわせて、
関わる事例
マリオットは
コインチェックでは、
- 2023年6月15日、
クラウドメール・ Storm-0558 に認証基盤 よる 入口 2016年にMicrosoft Exchange Online 侵入 発行された 消費者向け(MSA)の 署名鍵が、 本来2021年3月に 失効する 予定だったが 延期されたまま 有効な 状態で 残っており、 何らかの 方法で 盗まれた - 2018年9月8日、
宿泊(ホテルチェーン) マリオット(スターウッド)予約 入口 2014年、データベース 侵害 Starwoodの IT システムの 装置に ウェブシェルが 設置されて 侵入されたが、 その 経路は 特定されていない。 侵入者は これを 足場に RAT(遠隔操作型 マルウェア)で 管理者権限を 奪い、 ネットワーク内を 動き回った。 - 2018年1月26日、
暗号資産交換業 コインチェック 仮想通貨NEM 入口 外部の流出事件 攻撃者が 従業員の 端末に マルウェアを 感染させ、 その 端末を 経由して 社内 ネットワークに 不正アクセスした
確認クイズ
1 問目
AES-GCM で、
答えだと思う選択肢を押すと、その場で正誤と理由が開きます。
答え ウ
nonce は
2 問目
カード番号を
答えだと思う選択肢を押すと、その場で正誤と理由が開きます。
答え イ
付け足す
説明課題
次の
- nonce の
使い回しが、 読まれない ことと 書き換えられない ことの 両方を 壊す理由
模範解答を見る
AES-GCM は、
一次資料
どれも
- SP 800-38D Recommendation for Block Cipher Modes of Operation Galois/Counter Mode (GCM) and GMAC (NIST、英語)。
nonce の 重なりを 2 の -32 乗以下に 抑える 約束、 ランダムな nonce の ときは 1 つの 鍵で 2 の 32 乗回まで、 付録 A の 改ざん検知が 実質的に 失われる説明 - Authenticated encryption (cryptography の
説明書、英語) 。AESGCM の nonce は 12 バイトで、 同じ 鍵で 使い回さないこと - SP 800-57 Part 1 Rev. 5 Recommendation for Key Management (NIST、
英語、 。2020年5月) 1 つの 鍵を 1 つの 目的に 使う こと、 暗号期間を 決めること - Marriott Announces Starwood Guest Reservation Database Security Incident (Marriott International、
米 SEC への 。提出書類、 英語、 2018年11月30日) カード番号が AES-128 で 暗号化されていた こと、 復号に 要る 2 つの 要素の 両方が 持ち出された 可能性を 否定できないこと - 仮想通貨NEMの
不正送金に 。関する ご報告と 対応に ついて (コインチェック、 日本語、 2018年3月8日) 送金の 時刻と 量、 秘密鍵を 盗んで 送金したと 想定される こと、 ホットウォレットで 管理していた ため 防げなかったこと
次へ
次の
