共通鍵暗号
共通鍵暗号とは
共通鍵暗号とは、暗号化と復号に同一の秘密鍵(共通鍵)を用いる暗号方式である。公開鍵暗号と比べて計算が高速であり、大容量データ(通信・ファイル・ストレージ)の保護に適する。一方で、鍵の生成・配布・保管・更新(鍵管理)が安全性の成否を大きく左右する。
共通鍵暗号の分類:ブロック暗号とストリーム暗号
共通鍵暗号は大別して、ブロック暗号とストリーム暗号に分類される。ブロック暗号は固定長ブロック単位で平文を変換する方式であり、代表例はAESである。ストリーム暗号は多くの場合疑似乱数列(キーストリーム)を生成し、平文とXORして暗号化する方式であり、代表例はChaCha20である。暗号化だけでは改ざん検出(完全性)を提供しないため、必要に応じてAEAD(認証付き暗号)として利用することが多い。
ブロック暗号の基礎:代表例(DES、3DES)と現代標準(AES)
DES:歴史的に重要だが、現在は安全性が不十分である
DES(Data Encryption Standard)は、かつて標準として広く用いられたブロック暗号である。しかし、鍵長が実質56ビットであり、現代の計算能力の下では総当たり(brute force)に対する安全性が不足するため、標準としては撤回され、歴史的資料として扱われる。
3DES(TDEA):DESを重ねた方式であり、現在は段階的に非推奨へ向かう
3DES(Triple DES、TDEA)は、DESを3回適用して強度を高めるために設計されたブロック暗号である。DES単体より強い一方、ブロック長が64ビットであるという制約を持ち、利用量が増えると衝突に起因する問題(birthday boundに基づく衝突リスク、いわゆるSweet32攻撃等)が顕在化し得るなどの理由から、近年は利用を縮小する方向で整理されている。体系的には「過渡期を支えた方式」と位置づけられ、現代標準としてはAESが中心となる。
AES:最も広く使われる共通鍵ブロック暗号
AES(Advanced Encryption Standard)は代表的な共通鍵ブロック暗号である。AESはブロック長が128ビットで固定され、鍵長は128/192/256ビットを用いる。AESそのものは「ブロック暗号」であり、暗号化するには暗号利用モードと組み合わせて用いる必要がある。
ストリーム暗号の代表例(ChaCha20、KCipher-2)
ストリーム暗号は、多くの場合、鍵とNonce等から疑似乱数列(キーストリーム)を生成し、平文とXORして暗号化する方式である。ブロック暗号の暗号利用モードとは異なり、ストリーム暗号は暗号プリミティブ自体としてキーストリーム生成を内包する。一般に、同一鍵の下でNonce等を不適切に再利用すると安全性が破綻し得るため、仕様が要求する性質(一意性など)を満たす必要がある。
RC4:歴史的なストリーム暗号であり、TLS等では使用禁止とされる
RC4は歴史的に広く使われたストリーム暗号であるが、偏り等に起因して安全性上の問題が指摘され、少なくともTLSにおいては暗号スイートとして交渉・使用してはならないと規定されている。したがって、体系上は「過去の代表例」として理解すべきであり、現代の推奨構成には含めないのが原則である。
ChaCha20(現代的代表例)
ChaCha20は現代的なストリーム暗号であり、TLS等で用いられる代表的なAEADであるChaCha20-Poly1305の構成要素として広く知られる。設計としてはキーストリームを生成してXORする方式であり、Nonce等の入力の扱いが安全性上重要となる。
KCipher-2(日本発の代表例)
KCipher-2は日本で設計されたストリーム暗号であり、CRYPTREC暗号リストにストリーム暗号として掲載されている。仕様はCRYPTRECの仕様書として公開されており、暗号方式としての構造・入出力・鍵/IV(またはNonce)等の取り扱いが定義されている。
暗号利用モード(Mode of Operation):ECB、CBC、CTRの性質
暗号利用モードとは、ブロック暗号を部品として用い、任意長データの秘匿(機密性)を実現するための構成(construction)である。ここでは代表的なECB、CBC、CTRの性質を整理する。いずれも基本的には機密性のための構成であり、改ざん検出(完全性)を自動的には提供しない。
ECB(Electronic Codebook)
ECBは平文ブロックを独立に暗号化する方式であり、IVを用いない。同一の平文ブロックは同一の暗号文ブロックになるため、平文のパターンが暗号文に現れ得る。したがって、機密性を目的とする一般的用途では通常不適切である。
CBC(Cipher Block Chaining)
CBCは前の暗号文ブロックを次の暗号化に連鎖(chaining)させる方式である。最初のブロックのためにIVが必要であり、IVの性質は安全性に強く影響する。構造上、暗号化は順序依存であり、一般に並列化しにくい。CBCは機密性を提供し得るが、CBC単体では改ざん検出を提供しないため、完全性が必要な場合はMACやAEAD等と組み合わせる必要がある。
CTR(Counter)
CTRはカウンタ(Counter)をブロック暗号に入力して得た出力をキーストリームとして用い、平文とXORする方式である。性質としては「ブロック暗号からストリーム暗号を構成する」ものと捉えられる。CTRは処理を並列化しやすい一方で、同一鍵の下でカウンタ(Nonce/IVを含む入力ブロック)を再利用すると安全性が破綻する危険がある。また、CTR単体では改ざん検出を提供しないため、完全性が必要な場合はMACやAEAD等と組み合わせる必要がある。
認証付き暗号(AEAD)
暗号化は機密性を与えるが、暗号文が改ざんされても検出できない場合がある。これを防ぐため、暗号化と認証(改ざん検出)を同時に提供する方式としてAEAD(Authenticated Encryption with Associated Data)が用いられる。AEADは暗号化対象のデータに加え、暗号化はしないが改ざんされてはならない付随データ(AAD)も認証の対象にできる。AES-GCM、AES-CCM、ChaCha20-Poly1305等が代表的である。TLS 1.3では、共通鍵暗号はAEADに限定され、AES-GCMやChaCha20-Poly1305等が採用されている。
Nonce/IVの取り扱い
多くのモードやAEADは、Nonce(ナンス)やIV(初期化ベクトル)の性質に強く依存する。特に、同一鍵の下でNonce/IVを再利用すると安全性が破綻する危険がある。従って、仕様が要求する一意性・ランダム性・長さ等を満たし、再利用が起きないよう設計(カウンタ管理、乱数、永続化、並行処理の競合回避)することが重要である。Nonce再利用に対して耐性を持つAEADも存在するが、一般的なAEADでは再利用は避ける必要がある。
鍵生成・鍵管理
共通鍵暗号の安全性は、アルゴリズム選択に加えて鍵生成と鍵管理に強く依存する。鍵は十分なエントロピーを持つ乱数から生成されるべきであり、推測可能な値を用いてはならない。また、鍵の保管、アクセス制御、ローテーション、失効、バックアップ時の扱いも含め、運用設計が必要である。
salt/pepper/ストレッチング
パスワードを直接暗号鍵として用いることは不適切である。パスワードは探索空間が小さくなりやすく、辞書攻撃・総当たり攻撃に弱いからである。このため、saltやストレッチング(反復回数)を適切に設定する必要がある。
saltとは、パスワード(またはそのハッシュ)に付加するランダムな値であり、同じパスワードでも導出結果(ハッシュや鍵)が同一にならないようにするために用いられる。saltは通常、ユーザーごとに異なる値を用い、秘密にする必要はないが、十分にランダムであることが重要である。saltにより、攻撃者が事前計算した辞書(レインボーテーブル等)を流用しにくくなる。
ストレッチングとは、鍵導出やハッシュ計算を反復して計算コストを上げ、総当たり攻撃の試行回数あたりの負担を増やす考え方である。反復回数(コスト)は環境の性能や求める耐用年数等に応じて設定する。
pepper(ペッパー)とは、saltとは別に用いる秘密の追加値であり、攻撃者がデータベース(saltやハッシュ等)を入手してもpepperが漏えいしていなければ攻撃が成立しにくくなることを狙う。pepperはシステム共通またはユーザー単位の秘密値として扱われることが多く、秘密情報であるため、データベースとは分離して管理する必要がある。ただし、pepperは補助的なものであり、pepperを用いる場合でもsaltとストレッチングを適切に設定する必要がある。
CRYPTREC暗号リスト
CRYPTREC暗号リストが電子政府および公的システムにおける推奨暗号方式の参照枠組みとして位置づけられている。
CRYPTREC「CRYPTREC暗号リスト」
CRYPTREC「CRYPTREC暗号リスト(LS-0001-2022R1)」
参考資料
CRYPTREC「CRYPTREC暗号リスト」
IPA「その暗号モジュールは大丈夫?」~安心して使える暗号モジュールとは~