この記事は、 CAMPFIRE Advent Calendar 2025 の6日目の記事 の一部です。連載記事の全体は、「第0回 暗号技術の基礎を学ぶ連載記事一覧」を参照してください。
今回は暗号技術について学んでいく第1回目になります。第1回では、暗号技術の目的や種類、安全性に対する考え方について学んでいきます。
特に、安全性に対する考え方は暗号技術をしっかり学んだことがない場合には初めて知る内容になるかもしれません。ですが、暗号技術における安全性は非常に重要なポイントであり、どのように暗号技術の安全性が体系的に考えられているかは、非常に興味深い内容です。
はじめに
現代のインターネットは、暗号技術に支えられています。暗号技術がなければ、各種サイトに登録された個人情報やオンライン取引をする銀行口座の残高などが誰でも見られる状態になってしまいます。データが改ざんされたり、悪意ある攻撃者に悪用される可能性もあります。現代のディジタル社会は、暗号技術なしには成り立ちません。
しかし、量子コンピュータの実用化が進むにつれ、現在の暗号技術に新たな課題が生じています。2025年のノーベル物理学賞は量子コンピュータの基礎技術を発見した3名の研究者に授与されました。これは量子技術が実用化に向けて着実に進んでいることを示しています。
量子コンピュータは特定の数学的問題を従来のコンピュータより圧倒的に高速に解くことができ、現在の公開鍵暗号の安全性を脅かしています。この課題に対応するため、量子コンピュータに対しても安全な次世代暗号技術(耐量子暗号)の研究開発が活発に進められており、本連載の後半でもこれらの新しい技術について解説します。
暗号技術がどのような目的で使われ、どのように安全性を保証しているのでしょうか。具体的な暗号技術を学ぶ前に、この土台を理解しておく必要があります。安全性のセクションは理論的な内容も多くなりますが、暗号技術が理論的にどう設計されているかを知る良い機会となります。
※この記事は、文章案の作成や表現の調整、内容の検証や修正のサポート等に生成AIを利用しています。
目次
1.1 はじめに:なぜ暗号が必要か
1.2 現代暗号の分類
1.3 安全性モデルの基本的な考え方
1.4 暗号論的疑似乱数生成器
1.5 暗号技術と計算困難性
1.6 安全性モデルの限界とその他の安全性評価
1.7 現実世界での応用例
1.8 まとめ
1.1 はじめに:なぜ暗号が必要か
現代のディジタル社会では、情報の保護が不可欠です。暗号といえば、機密情報を隠すことが真っ先に思いつきますが、暗号技術は情報セキュリティの4つの基本目的を達成するための技術として位置づけられています。
機密性(Confidentiality) は、許可されたユーザー以外が情報を利用できないようにすることです。例えば、メッセージや文書の内容を暗号化により隠蔽します。オンラインバンキングで送金する場合には、送金額や口座番号が暗号化され、銀行以外の第三者には内容が分からなくなっています。
完全性(Integrity) は、データが改ざんされていないことを確認できることです。送信者の送ったデータと受信者の受け取ったデータが同一であることを保証します。ソフトウェアをダウンロードする場合には、ファイルが途中で改ざんされていないことをハッシュ値で確認できます。
認証(Authentication) は、情報や通信相手、データの送信者が本物であることを確認することです。なりすましを防ぐ重要な機能です。Webサイトにアクセスする場合には、そのサイトが本当に正規のサイトであることをSSL証明書で確認しています。
否認防止(Non-repudiation) は、データの送信者などが「自分が行った」ことを後から否定できないようにすることです。主にディジタル署名により実現されます。電子契約書にディジタル署名を付けることで、後から「自分は署名していない」といった主張はできなくなります。
各暗号技術の目的と各技術
情報セキュリティの4つの基本目的と、それぞれを実現する暗号技術の関係を以下の表にまとめました。
| 基本目的 | 実現する暗号技術 | 具体的な用途例 |
|---|---|---|
| 機密性 | 共通鍵暗号(AES、DES) 公開鍵暗号(RSA、ECC) ハイブリッド暗号 |
HTTPS通信 メール暗号化 ファイル暗号化 |
| 完全性 | ハッシュ関数(SHA-256) メッセージ認証符号(HMAC) ディジタル署名 |
ソフトウェア配布 ファイル転送 データベース整合性 |
| 認証 | ディジタル署名 ディジタル証明書 認証プロトコル |
Webサイト認証 ユーザー認証 デバイス認証 |
| 否認防止 | ディジタル署名 タイムスタンプ 監査ログ |
電子契約 金融取引 法的文書 |
インターネットやアプリケーション等における様々な技術に暗号技術の様々な目的に合わせた技術が組み合わせられて使われていることがわかります。現代の暗号技術は単一の目的を達成するだけでなく、複数の技術を組み合わせて包括的な情報セキュリティを実現しています。
1.2 現代暗号の分類
現代暗号技術は、その目的と仕組みに応じて大きく5つの種類に分類できます。それぞれが異なる役割を持ち、組み合わせることで包括的なセキュリティを実現しています。
1. 共通鍵暗号(Symmetric-key encryption)
送信者と受信者が同じ秘密鍵を事前に共有し、その鍵でデータを暗号化・復号する方式です。一般的に暗号化・復号の処理が高速で、大容量のデータ処理に適しています。代表的なアルゴリズムにはAESやDESがあります。
その一方で、送信者と受信者の間で事前に秘密鍵の共有が必要なため、鍵の安全な配布が課題となります。また、機密性を担保したい送信者と受信者の組み合わせごとに個別の鍵を生成する必要があります。
Wi-Fi接続では、ルーターとデバイスは同じパスワード(秘密鍵)を使って通信を暗号化しています。この暗号化は高速で、動画ストリーミングなどの大量の通信データを効率的に保護できます。Wi-Fiの暗号化やハードディスクの暗号化など、私たちの身近なところで使われています。
共通鍵暗号の詳細については 第2回で解説します。
2. 公開鍵暗号(Asymmetric-key encryption)
数学的に関連する2つの鍵(公開鍵と秘密鍵)のペアを使用する暗号方式です。公開鍵は誰でもアクセス可能で、秘密鍵は所有者のみが管理します。暗号化と復号に異なる鍵を使用するため、共通鍵暗号の鍵配布問題を解決できます。RSA暗号、ElGamal暗号、楕円曲線暗号(ECC)などが代表的です。
処理速度は一般的に共通鍵暗号より遅いため、主に共通鍵の交換や小さなデータの暗号化、ディジタル署名の基盤として使われます。
HTTPS通信でのWebサイトへのアクセスでは、ブラウザはそのサイトの公開鍵(公開鍵証明書)を使って共通鍵を暗号化して送信します(TLSハンドシェイク)。サイトは自分の秘密鍵で復号して共通鍵を取得し、その後は共通鍵暗号で高速に通信します。HTTPS通信の初期段階やメール暗号化(PGP:共通鍵暗号とのハイブリット暗号)で使われています。
公開鍵暗号の詳細については、第4回および、第5回で解説します。
3. ディジタル署名(Digital signature)
データの送信者が自分の秘密鍵で「署名」を生成し、受信者が対応する公開鍵で署名を検証する仕組みです。手書きの署名と同様に、データの作成者の証明と改ざん検知を同時に実現し、認証・完全性確認・否認防止に使われます。RSA署名、DSA、ECDSAなどが代表的です。
MicrosoftがWindowsの更新プログラムを配布するとき、そのファイルにディジタル署名を付けます。Windows PCはMicrosoftの公開鍵で署名を検証し、本当にMicrosoftが配布したファイルであることを確認してからインストールします。ソフトウェアの配布署名、電子契約、SSL証明書などで使われています。
ディジタル署名の詳細については、第4回、第5回、第6回、第7回で、各技術の特性に合わせて紹介します。
4. ハッシュ関数(Hash function)
どんなサイズの入力データでも、固定長のハッシュ値(「データの指紋」のようなもの)を生成する一方向関数(ある変換処理は簡単だが、その逆の実行は非常に難しい関数)です。元のデータにわずかな変更があっても、まったく異なるハッシュ値が生成されるため、データの完全性確認に使われます。
任意長のデータを固定長のハッシュ値に変換する性質があり、データの完全性確認、ディジタル署名との組み合わせ、パスワード保存に使われます。MD5、SHA-256、SHA-3などが代表的です(MD5は現在非推奨)。
Linuxディストリビューションをダウンロードするとき、配布サイトにはファイルのハッシュ値が表示されています。ダウンロード後、PCで同じハッシュ値を計算し、一致すればファイルが改ざんされていないことが確認できます。ファイルのダウンロード確認、Gitのコミット管理、パスワード認証などで使われています。
ハッシュ関数の詳細については、第3回で紹介します。
5. 秘密分散(Secret sharing)
1つの秘密情報(鍵やパスワードなど)を複数の断片(シェア)に分割し、一定数以上の断片が揃わないと元の秘密を復元できないようにする技術です。単一障害点を回避し、セキュリティと可用性を両立できます。
秘密情報を複数の断片に分割して保管する性質があり、重要な鍵の管理、冗長性確保、リスク分散に使われます。Shamirの秘密分散、しきい値暗号などが代表的です。
企業の重要なデータベースの暗号化鍵を3つの断片に分割し、CEO、CTO、CFOがそれぞれ1つずつ保管する、といった使い方ができます。鍵を復元するには3人全員の協力が必要で、1人が鍵を紛失しても他の2人で復元できます。銀行の金庫(複数の鍵が必要)や仮想通貨ウォレットのマルチシグなどで使われています。
秘密分散については、連載記事の中でも深く掘り下げは行いませんが、第4回にて、分散署名とShamirの秘密分散法について軽く触れます。
複数の暗号技術の利用
これらの暗号技術は、単独で使われることもあれば、組み合わせて使われることもあります。例えば、TLS/HTTPSでは公開鍵暗号・共通鍵暗号・ハッシュ関数・ディジタル署名が組み合わせられて動作します。
暗号技術の安全性をどう評価するか
こうした暗号技術の安全性を統一的に評価することは非常に難しい問題です。攻撃者は様々な方法で暗号を破ろうと試みるからです。実際に、暗号技術に対する様々な攻撃手法が考えられ、これまで安全とされていた暗号技術が安全ではなくなることも多々あります。暗号学では、この複雑な問題を体系的に扱うため、安全性モデルという概念を使います。
1.3 安全性モデルの基本的な考え方
安全性モデルとは
安全性モデルは、暗号技術が「本当に安全か」を評価するための枠組みです。暗号の安全性は、攻撃者の能力(どのような攻撃を想定するか)と安全性の目標(何を達成したいか)の2つの要素を組み合わせて数学的に定義します。「攻撃者が任意の平文を暗号化できる」という攻撃者の能力を想定し、「攻撃者が2つの平文の暗号文を区別できない」という安全性の目標を設定すれば、暗号の安全性を厳密に評価できます。
暗号技術によって、重視される安全性の観点が異なります。以下では、暗号、ディジタル署名、ハッシュ関数の3つの分野における安全性の基本的な考え方を説明します。
安全性の数学的な意味
暗号技術で「安全」とは、攻撃の成功確率がnegligible(無視できるほど小さい) であることを示します。
negligibleとは、あるパラメータに対してある関数が、任意の多項式の逆数よりも速く0に近づく数学的性質を持つことです。暗号技術では、セキュリティパラメータ(鍵長など)が大きくなるにつれて、攻撃の成功確率がnegligibleになることを要求します。
セキュリティパラメータ $n$ は暗号の強度を決めるパラメータで、通常は鍵長(ビット数)を指します。例えば、128ビット鍵の場合は $n = 128$ です。
暗号の安全性は、このセキュリティパラメータ $n$ が十分に大きいとき、攻撃成功確率が指数関数的に減少すること(例えば $2^{-n}$ のように)で保証されます。このような指数関数的な減少は、多項式的な減少(例えば $\frac{1}{n^2}$ や $\frac{1}{n^{100}}$ など)よりもはるかに速く0に近づきます。つまり、攻撃成功確率はnegligibleとなります。
直感的に言えば、鍵長が十分大きいとき、攻撃成功確率が指数関数的に減少します。128ビット鍵の場合、成功確率は約 $2^{-128}$ ≈ $3 \times 10^{-39}$ となり、現実的な時間・資源では攻撃が成功しないことを意味します。
暗号の安全性
暗号の安全性の目標は、暗号文から平文の情報が漏れないことです。
前提:ケルクホフスの原理
すべての安全性モデルの前提となる重要な原理があります。ケルクホフスの原理は、「暗号の安全性が暗号アルゴリズム自体の秘密ではなく、鍵の秘密のみに依存するべきである」というものです。つまり、攻撃者が暗号アルゴリズムを知っていても、鍵さえわからなければ安全であるべきということです。
攻撃者の能力(攻撃モデル)
暗号に対する攻撃者の能力を段階的にモデル化します。攻撃者の能力が強くなるほど、より現実的な攻撃を想定することになります。
CPA(選択平文攻撃) は、攻撃者が任意の平文を暗号化させることができる攻撃モデルです。公開鍵暗号では誰でも公開鍵で暗号化できるため、この攻撃は常に可能となります。
CCA1(選択暗号文攻撃) は、攻撃者が解読対象の暗号文を受け取る前に、任意の暗号文を復号させることができる攻撃モデルです。
CCA2(適応的選択暗号文攻撃) は、攻撃者が解読対象の暗号文を受け取った後も、任意の暗号文を復号させることができる最も強力な攻撃モデルです。実際のネットワーク攻撃に近い状況をモデル化しています。
暗号の攻撃モデルの関係性は、$\text{CPA} < \text{CCA1} < \text{CCA2}$ の順で強くなります。現代暗号では、最も強力なCCA2攻撃に耐えることを目標とします。
暗号における安全性の目標
暗号が達成すべき安全性の目標を段階的に定義します。
OW(一方向性) は、攻撃者が暗号文から元の平文を復元できない性質です。最も基本的な安全性要件です。
IND(識別不可能性) は、攻撃者が2つの異なる平文から生成された暗号文を区別できない性質です。暗号文からは元の平文に関する情報が一切漏洩しないことを意味しています。現代暗号における標準的な秘匿性の定義となっています。攻撃者が「はい」と「いいえ」の暗号文を受け取っても、どちらがどちらか分からないような強さです。
NM(非展性) は、攻撃者が暗号文を改変して、元の平文と関連性のある別の平文に対応する有効な暗号文を作成できない性質です。送金額「1000円」の暗号文を「9000円」の暗号文に書き換えるような攻撃を防ぎます。
暗号の各安全性目標の関係性は、$\text{OW} < \text{IND} \leqq \text{NM}$の順で強くなります。現代暗号では、安全性目標としてINDを目指します。より強いNMではなくINDを目指す理由は後述します。
組み合わせ安全性定義
攻撃者の能力と安全性の目標を組み合わせることで、暗号の安全性を定義します。
IND-CPA(識別不可能性・選択平文攻撃耐性) は、公開鍵暗号の基本的な安全基準です。攻撃者が任意の平文を暗号化できる状況でも、2つの平文の暗号文を区別できません。
IND-CCA2(識別不可能性・適応的選択暗号文攻撃耐性) は、現代暗号のゴールドスタンダードとされる最も強い安全性です。攻撃者が復号オラクルにアクセスできる状況でも安全性を保ちます。
補足として「問い合わせをすると、求めた結果を返してくれる何か」のことをオラクルと呼びます。そのため、復号オラクルは「任意の暗号文について問い合わせると復号した結果を返してくれる何か」です。
SSL/TLSの古いバージョンに存在したパディングオラクル攻撃では、攻撃者が暗号文を改変してサーバーに送信し、エラーメッセージの違いから通信内容を解読できてしまいました。IND-CCA2安全な暗号ではこのような攻撃を防げます。
IND-CCA2安全性を満たす暗号は自動的に非展性(NM)も満たすことが数学的に証明されています。加えて、NMよりもINDのほうが数学的に扱いやすいため、現代の暗号設計ではIND-CCA2を最重要目標として設計されています。
ディジタル署名の安全性
ディジタル署名の安全性の目標は、攻撃者が有効な署名を偽造できないことです。
署名に対する攻撃モデル
KMA(既知メッセージ攻撃) は、攻撃者はいくつかのメッセージとその署名のペアを知っている状態における攻撃モデルです。公開された文書やソフトウェアの署名を収集して、署名アルゴリズムの弱点を探ります。
CMA(選択メッセージ攻撃) は、攻撃者が任意のメッセージの署名を取得できる攻撃モデルです。最も現実的な攻撃モデルです。
ディジタル署名の攻撃モデルの関係性は、$\text{KMA} < \text{CMA}$の順に強くなります。現代暗号では、最も強力なCMA攻撃に耐えることを目標とします。
署名における安全性の目標
SUF(選択的偽造困難性) は、攻撃者が攻撃開始前に指定した特定のメッセージに対する有効な署名を作成できない性質です。最も基本的な安全性レベルです。
EUF(存在偽造困難性) は、攻撃者が新しいメッセージに対する有効な署名を作成できない性質です。ディジタル署名における標準的な安全性定義です。
sEUF(強存在偽造困難性) は、攻撃者が既知のメッセージ・署名ペアに対する新しい署名を作成できない性質です。EUFよりも強い安全性を提供します。既知のメッセージに対する新しい署名も偽造できない性質です。マルチシグネチャやブロックチェーンなどで必要となります。
ディジタル署名の安全性目標の関係性は、$\text{SUF} < \text{EUF} < \text{sEUF}$の順で強くなります。現代暗号では、EUFを最低限、より高い安全性を目指す場合はsEUFを目指します。
組み合わせ安全性定義
EUF-CMA(存在偽造困難性・選択メッセージ攻撃耐性) は、ディジタル署名における標準的な安全性モデルで、攻撃者が任意のメッセージの署名を取得できる状況でも、新しいメッセージに対する有効な署名を作成できないことを保証します。実用的な署名方式の標準的な安全性要件とされています。
sEUF-CMA(強存在偽造困難性・選択メッセージ攻撃耐性) は、EUF-CMAよりも強い安全性で、既知のメッセージ・署名ペアに対する新しい署名の作成も防ぎます。より厳格なセキュリティが必要な場合に使用されます。
ハッシュ関数の安全性
ハッシュ関数の安全性の目標は、同じハッシュ値を持つ異なるデータを見つけられないことです。
ハッシュ関数に対する攻撃と安全性
ハッシュ関数では、攻撃モデルと安全性の目標が一対一に対応しています。
原像攻撃は、攻撃者が与えられたハッシュ値 $y$ に対応する入力 $x$ を見つける攻撃です。原像攻撃に対応する安全性目標として、一方向性(OW) があり、これはハッシュ値から元の入力を計算的に求めることが困難であることを目標とします。
第二原像攻撃は、攻撃者が与えられた入力 $x_1$ と異なる入力で、同じハッシュ値を生成する $x_2$ を見つける攻撃です。第二原像攻撃に対する安全性目標として、第二原像計算困難性(SPR) があります。これは与えられた入力と異なる入力で同じハッシュ値を生成することが困難であることです。
衝突攻撃は、攻撃者が異なる2つの入力 $x_1, x_2$ で同じハッシュ値を生成する攻撃です。衝突攻撃に対応する安全性目標は、衝突耐性です。異なる2つの入力で同じハッシュ値を生成することが困難であることを目標とします。
安全性モデルの関係性まとめ
暗号の安全性階層
| 攻撃モデル \ 安全性目標 | OW | IND | NM | ||
|---|---|---|---|---|---|
| CPA | OW-CPA | < | IND-CPA | < | NM-CPA |
| ∧ | ∧ | ∧ | |||
| CCA1 | OW-CCA1 | < | IND-CCA1 | < | NM-CCA1 |
| ∧ | ∧ | ∧ | |||
| CCA2 | OW-CCA2 | < | IND-CCA2 | = | NM-CCA2 |
- 攻撃の強さ:CPA < CCA1 < CCA2(下に行くほど強い攻撃)
- 安全性の強さ:OW < IND ≤ NM(右に行くほど強い安全性)
- 現代の標準:IND-CCA2安全性が最重要目標
ディジタル署名の安全性階層
| 攻撃モデル \ 安全性目標 | SUF | EUF | sEUF | ||
|---|---|---|---|---|---|
| KMA | SUF-KMA | < | EUF-KMA | < | sEUF-KMA |
| ∧ | ∧ | ∧ | |||
| CMA | SUF-CMA | < | EUF-CMA | < | sEUF-CMA |
- 攻撃の強さ:KMA < CMA(下に行くほど強い攻撃)
- 安全性の強さ:SUF < EUF < sEUF(右に行くほど強い安全性)
- 現代の標準:EUF-CMAが実用的な標準要件、sEUF-CMAがより厳格な要件
ハッシュ関数の安全性階層
| 攻撃 | 安全性 | 計算量 | 主な用途 |
|---|---|---|---|
| 原像攻撃 | OW(一方向性) | $O(2^n)$ | パスワード保存、認証 |
| 第二原像攻撃 | SPR(第二原像耐性) | $O(2^n)$ | 文書の完全性保証 |
| 衝突攻撃 | CR(衝突耐性) | $O(2^{n/2})$ | 証明書、ブロックチェーン |
- 安全性の強さ:OW < SPR < CR(下に行くほど強い安全性)
- 現代の標準:CR(衝突耐性)
実用的な安全性要件
| システム | 必要な安全性 |
|---|---|
| TLS/HTTPS | IND-CCA2安全な暗号 + EUF-CMA安全な署名 + CR安全なハッシュ関数 |
| ディジタル証明書 | EUF-CMA安全な署名 + CR安全なハッシュ関数 |
| パスワード保存 | OW安全なハッシュ関数(ソルト付き) |
これらの安全性モデルにより、「現実的な攻撃に対して暗号が十分に強い」ことを理論的に保証できます。
1.4 暗号論的疑似乱数生成器
暗号技術における乱数の重要性
これまで学んだ暗号技術の安全性は、「真の乱数」が利用可能であることを前提としている場合が多くあります。しかし、現実のコンピュータでは真の乱数を必要なときに必要なだけ生成することは困難です。そのため、暗号技術では暗号論的疑似乱数生成器(Cryptographically Secure Pseudorandom Number Generator, CSPRNG) が重要な役割を果たします。
疑似乱数
疑似乱数とは、数学的なアルゴリズムによって生成される、真の乱数に近い性質を持つ数列のことです。真の乱数と異なり、初期値(シード)が同じであれば同じ数列が生成されるという決定論的な性質を持ちます。同じシードから同じ数列を生成するため再現可能ですが、統計的性質は真の乱数と区別が困難です。
非暗号論的疑似乱数と暗号論的疑似乱数
非暗号論的疑似乱数(通常の疑似乱数)
一般的なプログラミング言語のrand()関数などが生成する疑似乱数です。統計的な性質は真の乱数に近いものの、暗号学的な安全性は考慮されていません。シミュレーション、ゲームのランダム要素、統計的サンプリングなどで使われます。
暗号論的疑似乱数(CSPRNG) は、暗号学的な安全性を満たす疑似乱数生成器です。攻撃者が生成された数列の一部を観測しても、次の値を予測することが困難なことが保証されています。暗号鍵の生成、初期化ベクトル(IV)の生成、ディジタル署名における乱数の生成、認証トークンの生成などで使われます。
暗号論的疑似乱数の安全性
暗号論的疑似乱数生成器の安全性は、以下の要素によって構成されます。
エントロピー源は、真の乱数性を提供する物理的な現象やプロセスです。ハードウェア乱数生成器(熱雑音、量子効果)、オペレーティングシステム(マウス移動、キーボード入力、ネットワークパケットの到着時間)、専用の乱数生成チップなどが代表的なエントロピー源です。
疑似乱数アルゴリズムは、エントロピー源から得られた真の乱数性を、より長い疑似乱数列に拡張します。予測困難性(生成された疑似乱数の一部を観測しても次の値を予測困難)と状態の不可逆性(出力された疑似乱数から内部状態を復元困難)という重要な性質を持ちます。
バックトラック困難性は、攻撃者が現在の内部状態を取得しても、過去に生成された疑似乱数を推測することが困難という性質です。システムの一時的な侵害から過去の鍵を保護します。
予測困難性は、攻撃者が現在の内部状態を取得しても、将来生成される疑似乱数を予測が困難という性質です。システムの一時的な侵害から将来の鍵を保護します。
暗号論的疑似乱数の重要性
暗号論的疑似乱数生成器は、現代暗号技術の安全性の基盤となる重要な要素です。たとえ暗号アルゴリズムが数学的に安全であっても、乱数の品質が低ければ全体の安全性が損なわれます。
2008年のDebian OpenSSL事件では、DebianのOpenSSLパッチでエントロピー源が削除され、予測可能な鍵が生成される脆弱性が発生しました。2013年のAndroid Bitcoin Wallet事件では、Androidの乱数生成器の脆弱性により、Bitcoinウォレットの秘密鍵が予測可能になりました。また、2010年には、ソニーのPlayStation3において、ディジタル署名に利用する秘密鍵を生成するのに本来固定すべきでない乱数を固定してしまい、秘密鍵が容易に特定できることが発覚しました。これらの事例からも、暗号論的疑似乱数生成器の重要性と、その実装における注意点が理解できます。
実用的な暗号論的疑似乱数生成器
/dev/urandom(Linux/Unix)
/dev/urandomは、Linux/Unixシステムで提供される暗号論的疑似乱数生成器です。カーネルレベルで実装されており、複数のエントロピー源を統合して高品質な乱数性を提供します。
# 32バイトの暗号論的疑似乱数を生成
#(※出力に制御文字が含まれる可能性があるので注意)
dd if=/dev/urandom bs=32 count=1
CryptGenRandom(Windows)
CryptGenRandomは、Windows APIで提供される暗号論的疑似乱数生成器です。Windows CryptoAPIの一部として提供され、ハードウェア乱数生成器を利用可能で、アプリケーションレベルで利用できます。
OpenSSLのRAND_bytes()
RAND_bytes()は、OpenSSLライブラリで提供される暗号論的疑似乱数生成機能です。クロスプラットフォーム対応で、複数のエントロピー源を統合した高品質な実装となっています。
1.5 暗号技術と計算困難性
計算困難性
公開鍵暗号の安全性は、 計算困難性 に基づいています。つまり、暗号を破るために必要な計算量が現実的な時間・資源では実行不可能なほど大きいことに依存します。
代表的な計算困難問題
素因数分解問題(RSA暗号の基盤)
大きな合成数を素因数に分解する問題です。
例:15 = 3 × 5(簡単)
2048ビットの合成数の分解は現在のコンピュータでは事実上不可能
離散対数問題(DH鍵交換、ElGamal暗号の基盤)
$ \mod p $ での指数の逆算問題です。
例: $ 5^x ≡ 18\ \pmod {23} $ の $x$ を求める問題
小さな数では解けるが、大きな素数では困難
具体的な計算困難性による安全性
計算困難性は、コンピュータの進化によって変化します。設計当時、安全であった56ビットDESは、1990年代に1日未満で破られるようになりました。128ビットAESは現在のスーパーコンピュータでも宇宙の年齢より長い時間が必要ですが、量子コンピュータの実用化がされると同様の安全性を持たせるには鍵長を2倍にする必要があります。
公開鍵暗号の2048ビットRSAは現在の技術では安全ですが、量子コンピュータ上で実行可能な計算困難性を破るアルゴリズムが知られており、安全ではなくなります。
1.6 安全性モデルの限界とその他の安全性評価
ここまで、数学的に暗号理論の安全性を安全性モデルを通して理解してきました。しかし、現実の暗号技術を実装する際の安全性の担保においては、単にこれまで説明した安全性モデルを満たすだけでは不足しています。
計算量的安全性と情報理論的安全性
これまで説明した計算困難性に基づく安全性は、計算量的安全性(Computational Security)と呼ばれます。攻撃者の計算資源が有限なことを前提としており、攻撃者が十分な計算資源を持てば理論上は破られる可能性があります。
一方、情報理論的安全性(Information-Theoretic Security)または無条件安全性(Unconditional Security)は、攻撃者の計算資源が無限と仮定しても安全性が保証される性質です。困難性の仮定に依存せず、情報理論的な性質に基づいて安全性が成立します。
完全秘匿性とワンタイムパッド
ここで情報理論的安全性についての詳細を例を交えて簡単に説明をします。ただし、情報理論的安全性は現実においてほとんどの場合利用されませんが、安全性に対する理解を深めるためにここで紹介しておきます。
情報理論的安全性の代表的な概念が、完全秘匿性(Perfect Secrecy)です。これは、暗号文を観測しても平文に関する情報が一切漏洩しないという性質です。
数学的には、以下のように表現されます。
完全秘匿性は、暗号文 $c$ を観測しても、平文 $m$ の事後確率が事前確率と変わらない性質のことです。
$$\forall m, c \text{ (ただし } \Pr[C=c] > 0 \text{)} : \quad \Pr[M=m \mid C=c] = \Pr[M=m]$$
$\Pr[A]$ は事象 $A$ が起こる確率、$\Pr[A \mid B]$ は事象 $B$ が起きたという条件のもとで事象 $A$ が起こる条件付き確率、$M$ は平文を表す確率変数、$C$ は暗号文を表す確率変数、$\forall$ は「すべての」を意味する記号(全称量化子)です。
これは、「どんな平文 $m$ と暗号文 $c$ の組み合わせでも、暗号文 $c$ を見た後で平文が $m$ である確率($\Pr[M=m \mid C=c]$)は、暗号文を見る前の確率($\Pr[M=m]$)と同じである」ことを示しています。つまり、暗号文から平文に関する情報が一切得られないということです。
完全秘匿性を達成する暗号方式の代表例がワンタイムパッド(One-Time Pad, OTP)です。平文と同じ長さの真にランダムな鍵を用いてXOR演算で暗号化します($c = m \oplus k$)。ワンタイムパッドが完全秘匿性を満たすには、鍵が一様分布で生成され、平文と独立で、平文と同じ長さであり、同じ鍵を2回以上使用しないことが必要です。鍵を再利用すると完全秘匿性は即座に崩壊します。
ただし、ワンタイムパッドは実用上の制約が大きく(鍵配送・管理のコストが高い)、一般的な用途では計算量的安全性を持つ暗号が使われます。ワンタイムパッドは、超高機密通信や限定的な用途でのみ検討されます。
ブラックボックスモデルとグレーボックスモデル、ホワイトボックスモデル
これまで議論した安全性モデルは、主にブラックボックスモデルとなっています。これは攻撃者が基本的に「入力」と「出力」のみしか見ることができません。
いっぽうで、グレーボックスモデルと呼ばれる、攻撃者が暗号処理中の中間状態についての情報の一部を取得できることを想定するモデルもあります。こうしたモデルは物理的な情報漏えいを扱うため、一般的な形式的証明が難しいという特徴があります。多くの場合、特定の漏えいの仮定(例:有限量の情報しか漏れない、観測はノイズを含む、など)に基づいて個別に議論されます。グレーボックスモデルの攻撃の例としてはサイドチャネル攻撃と呼ばれるものや侵襲攻撃と呼ばれるものがあります。
さらに強い想定として、攻撃者が実装や鍵にほぼ完全にアクセスできるホワイトボックスモデルもあります。
グレーボックスモデルやホワイトボックスモデルは、これまで議論してきた安全性モデルと比べて、個々の暗号方式の理論的な安全性よりも、多くは暗号の実装や運用上の安全性に関する議論として扱われます。
証明可能安全性と発見的安全性
これまで議論したような数学的な問題に帰着して安全性の証明が可能なものを証明可能安全性と呼びます。他方、数学的な問題として安全性の証明が難しい暗号アルゴリズムも存在します(AESなどが有名な例です)。こうした暗号に対して信頼するためには、発見的安全性と呼ばれる安全性を用います。発見的安全性は暗号解析者が攻撃を一定の期間試みたが失敗したという事実をもって安全の信頼を得る手法です。
量子コンピュータによる計算困難性の崩壊
量子コンピュータが登場すると、これまで計算困難であったいくつかの問題が、効率的に計算できるようになることがすでにわかっています。現在利用されている一部の暗号技術でも、量子コンピュータが実用化されると、現実的な計算資源で解読されてしまいます。こうした技術進化や解読手法発見などによりこれまで安全とされていた暗号技術が安全でなくなることを 危殆化 と呼びます。
そこで、現在急ピッチで量子コンピュータであっても、現実的な計算資源では解読不可能な暗号技術(耐量子暗号、PQC)の開発、実用化が進められています。また、複数のサービスやアプリケーション、ライブラリでも利用可能な暗号として、耐量子暗号のオプションが提供されるようになってきています。
耐量子暗号についての詳細は、第7回を参照してください。
最新の安全な暗号方式と鍵長(セキュリティパラメータ)
コンピュータの性能向上や特定暗号方式に対する脆弱性の発見、量子コンピュータの実用化など、様々な要因で安全性を保証できる暗号方式や鍵長は変化します。
CRYPTRECでは電子政府での推奨暗号リストや暗号強度要件が公開されています。
NISTでも、標準化されている暗号方式がFIPS(連邦情報処理標準)としてまとめられています。
NIST SP 800-57 で、各方式に応じた鍵の寿命管理についても触れられています。
こうした政府機関の情報や、脆弱性の発見などの情報をもとに適切に暗号方式や鍵長のアップデートをしていく必要があります。
1.7 現実世界での応用例
TLS/HTTPS
Webブラウザとサーバー間の通信では、複数の暗号技術が組み合わせて使われます。ハンドシェイク段階では、ディジタル署名でサーバーが自分の身元を証明(認証・否認防止)し、公開鍵暗号で共通鍵を安全に共有(機密性)し、ハッシュ関数で通信内容の完全性を確認(完全性)します。データ転送段階では、共通鍵暗号で大量データを高速に暗号化(機密性)し、メッセージ認証符号でデータの完全性を確認(完全性)します。
Git
Gitでは、すべてのコミット・ファイル・ディレクトリがSHA-1ハッシュ値で管理されています。コミット内容(親コミット、ファイル内容、メッセージなど)をすべてハッシュ化し、そのハッシュ値がコミットIDとして使用されます。改ざんがあると即座に検知できるため、完全性 が保証されます。
クラウドストレージ
大手クラウドサービスでは、ユーザーデータを複数の暗号技術で保護しています。共通鍵暗号(AES)でデータを暗号化(機密性)し、秘密分散でデータを複数拠点に分散保存(可用性)し、ディジタル署名でデータの完全性を確認(完全性)します。これにより、機密性・完全性・可用性 が同時に保証されます。
1.8 まとめ
この記事では暗号技術の基礎を幅広く扱いました。現代暗号が単なる「秘密を隠すだけの技術」ではなく、機密性・完全性・認証・否認防止という4つの目的を達成するための体系的な技術であることを紹介しました。また、実際のシステムでは目的に応じて複数を組み合わせて使われます。
安全性に関して体系的に扱う安全性モデルと、安全性モデルでは扱えない各種安全性の議論について説明しました。これらの安全性に対する一貫した保証と探索的な安全性に対する調査、研究により、暗号の安全性が保証されています。
暗号の実装に重要な役割を持つ暗号論的疑似乱数について、その不適切な扱いによる具体的な脆弱性の事例も含めて紹介しました。
ここまでで、現代の暗号技術全体についてを概観しました。
次回からは、具体的な個々の暗号技術の仕組みに入っていきます。理論的な基盤を理解したうえで個別の技術を学ぶことで、それぞれの暗号方式がなぜそのように設計されているのか、どのような脅威に対抗しているのかがよりわかりやすくなると思います。
特に暗号技術の安全性については、暗号技術のアルゴリズムや構造などとともに、全体を通して重要な観点となっていきます。
次回
次回(第2回)では、「 共通鍵暗号と暗号モード 」について学びます。共通鍵暗号の基礎、DESやAES暗号の仕組み、データを安全に暗号化するための暗号モード(ECB、CBC、GCM等)の違いと使い分けを解説し、実際のTLSやVPNでの暗号化がどのように実現されているかを見ていきます。
参考文献
書籍
- 現代暗号理論 (岩波数学叢書)(高木 剛 著 | 岩波書店)
- 暗号技術のすべて(IPUSIRON 著 | 翔泳社)
- 安全な暗号をどう実装するか 暗号技術の新設計思想(Jean-Philippe Aumasson 著、Smoky 翻訳、IPUSIRON、 藤田亮 監訳 | マイナビ出版)






