暗号
ノンス
別称: 一度限りの数, 暗号学的ノンス
定義
暗号アルゴリズムに与える一度しか使ってはならない値で、新鮮性を保証し、リプレイや鍵・IV の再利用を防ぐ。
ノンス(nonce)は、同じ鍵の有効期間中に決して重複してはならない入力であり、対称暗号、AEAD モード、署名方式、認証プロトコルなどで、各操作を一意に保つために使用されます。AES-GCM や ChaCha20-Poly1305 のような AEAD では、ノンスは通常 96 ビットで、乱数または決定的なカウンターとして生成されます。AES-GCM で同じ鍵下にノンスを再利用すると、機密性と認証性が同時に崩壊します。ノンスは TLS ハンドシェイク、OAuth/OIDC のチャレンジ、Bitcoin のブロックヘッダー、ECDSA などの署名方式でも使われ、ECDSA でノンスを再利用すると秘密鍵が漏れます。ベストプラクティスは十分な長さの乱数ノンスか厳密に単調増加するカウンターを使うこと、衝突を否定できない場合は AES-GCM-SIV や XChaCha20-Poly1305 など誤用耐性モードへ移行することです。
例
- TLS 1.3 は、シーケンス番号と方向別 IV を XOR してレコードごとの AEAD ノンスを生成する。
- 2010 年に PlayStation 3 の ECDSA 秘密鍵が回復されたのは、Sony が署名時のノンスを再利用したため。
関連用語
初期化ベクトル(IV)
ブロック暗号モードに与えるランダムな初期値で、同じ鍵で同じ平文を暗号化しても異なる暗号文になるようにする。
対称鍵暗号
暗号化と復号に同じ秘密鍵を使う暗号方式で、鍵を安全に共有できれば高速で強力な機密性を提供する。
ChaCha20
Daniel J. Bernstein が設計した現代的ストリーム暗号で、256 ビット鍵と 96 ビットナンスを用いる。Poly1305 と組み合わせた AEAD「ChaCha20-Poly1305」として広く使われる。
AES(Advanced Encryption Standard)
NIST が標準化した 128 ビットブロック暗号で、鍵長は 128・192・256 ビット。Daemen と Rijmen が設計し、世界で最も広く使われている対称暗号。
リプレイ攻撃
認証トークンや取引などの正規ネットワーク通信を捕捉し、後で再送信して送信者になりすます攻撃。
ECDSA
DSA の楕円曲線版で、FIPS 186 で標準化された電子署名アルゴリズム。短い署名長と、楕円曲線離散対数問題に基づく安全性が特徴。