1. デジタル署名とは
デジタル署名は、デジタルデータが「誰によって作成されたか」と「改ざんされていないか」を証明する技術である。現実世界の手書きサインや印鑑に相当するが、デジタルの世界ではコピーや偽造がより困難な数学的仕組みを使用する。
解決する課題
- 認証(Authentication): このメッセージは本当にAさんが送ったものか?
- 完全性(Integrity): メッセージが途中で改ざんされていないか?
例えば、メールで「100万円振り込んでください」という内容が届いた時、それが本当に正当な相手からのものか、金額が書き換えられていないかを確認する必要がある。
2. 公開鍵暗号の基礎知識
デジタル署名を理解するには、まず公開鍵暗号の仕組みを知る必要がある。
公開鍵暗号では、数学的に関連した2つの鍵を使用する。
- 公開鍵: 誰でも知ることができる鍵
- 秘密鍵: 本人だけが知っている鍵
重要な性質として、「秘密鍵で生成した署名は、対応する公開鍵でのみ検証できる」ということがある。これがデジタル署名の核心部分である。
3. 鍵生成時に選んでいるもの
OpenSSLやOpenSSHで鍵を生成するとき、選択しているのは「どの数学的構造を使うか」である。
- RSA: 大きな素数の積の因数分解が困難であることを利用
- ECDSA(楕円曲線): 楕円曲線上の離散対数問題が困難であることを利用
- Ed25519: 特定の楕円曲線(Curve25519)を使った署名専用設計
これらは「非対称鍵暗号」という大きなカテゴリに属するが、それぞれ異なる数学的基盤を持っている。
4. 非対称鍵暗号の体系図
非対称鍵暗号
├── RSA
│ ├── 暗号化/復号(機密性)← 可能
│ └── 署名生成/検証(認証)← 可能(数学的には暗号化と同じ操作)
│
├── 楕円曲線系
│ ├── ECDSA / Ed25519
│ │ └── 署名生成/検証のみ ← 暗号化機能なし
│ │
│ └── ECIES
│ └── 暗号化/復号のみ ← 署名機能なし
アルゴリズム比較表
| アルゴリズム | 数学的基盤 | 暗号化/復号 | 署名生成/検証 |
|---|---|---|---|
| RSA | 素因数分解困難性 | 可能 | 可能(同一計算式) |
| ECDSA | 楕円曲線離散対数問題 | 不可(別プロトコル) | 署名専用 |
| EdDSA | Edwards曲線 | 不可(別プロトコル) | 署名専用 |
| ECIES | 楕円曲線 | 暗号化専用 | 不可 |
5. デジタル署名の作成プロセス
Step 1: ハッシュ値の計算
まず、署名したいメッセージ(文書やファイル)からハッシュ値を計算する。
ハッシュ関数は、任意の長さのデータを固定長の値(ハッシュ値)に変換する一方向関数である。例えばSHA-256を使用すると、どんな長さの文書でも256ビット(32バイト)のハッシュ値になる。
元のメッセージ: "重要な契約書の内容..."
↓ SHA-256ハッシュ関数
ハッシュ値: a1b2c3d4e5f6...(32バイトの値)
ハッシュ関数の重要な性質
- 同じ入力からは常に同じハッシュ値が生成される
- わずかでも入力が変わると、ハッシュ値は大きく変わる
- ハッシュ値から元のデータを復元することは実質的に不可能
Step 2: 秘密鍵による署名生成
計算されたハッシュ値に対して、署名者の秘密鍵を使用して署名を生成する。この生成された値が「デジタル署名」となる。
ハッシュ値: a1b2c3d4e5f6...
↓ 秘密鍵で署名生成
デジタル署名: x9y8z7w6v5u4...
6. デジタル署名の検証プロセス
受信者がデジタル署名を検証する手順を説明する。
Step 1: 公開鍵の入手
まず、署名者の公開鍵を入手する。これは通常、デジタル証明書の形で配布される。
Step 2: ハッシュ値の再計算
受信したメッセージから、同じハッシュ関数を使用してハッシュ値を再計算する。
受信したメッセージ: "重要な契約書の内容..."
↓ SHA-256ハッシュ関数
再計算されたハッシュ値: a1b2c3d4e5f6...
Step 3: 署名の検証
署名者の公開鍵を使用して、受信したデジタル署名と再計算されたハッシュ値を検証アルゴリズムに入力する。アルゴリズムは署名が正当かどうかを判定する。
入力:
- デジタル署名: x9y8z7w6v5u4...
- 再計算されたハッシュ値: a1b2c3d4e5f6...
- 公開鍵
↓ 検証アルゴリズム
結果: 有効 または 無効
検証が成功すれば、認証と完全性が確認されたことになる。
7. 具体的な例で理解する
Alice が Bob に重要な文書を送信する場合を考えてみる。
署名作成(Alice側)
- Alice が文書「来月の予算は500万円です」を作成
- この文書のSHA-256ハッシュ値を計算:
abc123... - Aliceの秘密鍵でハッシュ値に対する署名を生成:
xyz789... - 元の文書とデジタル署名
xyz789...をBobに送信
署名検証(Bob側)
- Bobが文書とデジタル署名を受信
- 受信した文書「来月の予算は500万円です」のハッシュ値を計算:
abc123... - Aliceの公開鍵(事前に入手済み)を使い、署名
xyz789...とハッシュ値abc123...を検証 - 検証成功 → 署名有効
改ざんが検出される仕組み
もし途中で文書が「来月の予算は5000万円です」に改ざんされていた場合:
- 改ざんされた文書のハッシュ値:
def456... - このハッシュ値と受信した署名で検証 → 検証失敗
- 改ざんが検出される
8. RSAの特殊性
RSAが混乱を生む原因は、1つのアルゴリズムで2つの用途に使える点にある。
RSAの2つの用途
| 用途 | 目的 | 操作 |
|---|---|---|
| 暗号化用途 | 機密性の確保 | 公開鍵で暗号化 → 秘密鍵で復号 |
| 署名用途 | 認証と完全性 | 秘密鍵で署名生成 → 公開鍵で検証 |
数学的には両方とも「累乗と剰余」という同じ計算構造なので、「署名=秘密鍵で暗号化」という説明が成り立ってしまう。
RSAの鍵生成
- n = p × q(2つの大きな素数の積)
- e: 公開指数(通常65537)
- d: 秘密指数(eの逆元)
RSAの数学的操作
秘密鍵を使う操作(d乗)
署名生成: 署名 = ハッシュ^d mod n
復号: 平文 = 暗号文^d mod n
公開鍵を使う操作(e乗)
署名検証: ハッシュ = 署名^e mod n
暗号化: 暗号文 = 平文^e mod n
対応関係のまとめ
| 計算式 | 用途1 | 用途2 |
|---|---|---|
| データ^d mod n | 署名生成 | 復号 |
| データ^e mod n | 署名検証 | 暗号化 |
9. ECDSAの仕組み
ECDSAは署名専用に設計されている。RSAのような「逆操作」の関係がなく、署名生成と検証は全く別の式を使用する。
署名生成の手順
- ランダムなkを生成
- R = k × G(楕円曲線上の点)
- r = Rのx座標
- s = k⁻¹ × (ハッシュ + r × d) mod n
- 署名は(r, s)のペア
署名検証の手順
- u1 = ハッシュ × s⁻¹ mod n
- u2 = r × s⁻¹ mod n
- P = u1 × G + u2 × Q
- Pのx座標がrと一致すれば有効
署名生成と検証で使う計算式が全く異なることがわかる。そもそも「暗号化」に相当する操作が定義されていないため、「秘密鍵で暗号化」という表現が成立しない。
楕円曲線で暗号化したい場合
楕円曲線暗号で暗号化をしたい場合は、ECIES(Elliptic Curve Integrated Encryption Scheme)という別の仕組みを使う。署名と暗号化が完全に別のプロトコルである。
つまり、ECDSAの秘密鍵で「暗号化」という操作はそもそも定義されていない。だから「暗号化」とは呼べず、「署名生成」としか呼べない。
10. EdDSAの特徴
EdDSAはSchnorr署名をベースに、Edwards曲線という特殊な形式の楕円曲線を使って設計されている。ECDSAとは「同じ楕円曲線という道具を使う別の流派」である。
ECDSAとの違い
| 特性 | ECDSA | EdDSA |
|---|---|---|
| ベース | DSAの楕円曲線適用 | Schnorr署名ベース |
| ランダム値 | 毎回必要(脆弱性リスク) | 不要(決定論的) |
| ハッシュ関数 | 選択可能 | 固定(SHA-512) |
| 実装ミス耐性 | 低い | 高い |
Ed25519の設計思想
Ed25519は曲線(Curve25519)、ハッシュ関数(SHA-512)、その他のパラメータをすべて固定し、「これをそのまま使え」という設計。選択肢を減らすことで実装ミスや危険な組み合わせを防ぐ。
OpenSSHでssh-keygen -t ed25519とすると、すべてのパラメータが自動的に決まるのはこのためである。
11. JWTアルゴリズムとの対応
| JWT名 | 構成 | 備考 |
|---|---|---|
| RS256 | RSA + SHA-256 | 「秘密鍵で暗号化」理解でも動作 |
| ES256 | ECDSA + SHA-256 | 署名専用、暗号化概念なし |
| EdDSA | Ed25519(すべて固定) | 署名専用、パラメータ選択不可 |
RS256では「秘密鍵で暗号化」という理解でも動作するが、ES256やEdDSAではその理解が適用できない。だから統一的に「署名生成/署名検証」と呼ぶ方が正確である。
12. デジタル証明書との関係
実際の運用では、公開鍵の真正性を保証するためにデジタル証明書が使用される。
デジタル証明書に含まれる情報
- 証明書の所有者の情報
- 所有者の公開鍵
- 証明書の有効期限
- 認証局(CA)のデジタル署名
認証局は信頼できる第三者機関で、「この公開鍵は確かにAliceのものです」ということを自身のデジタル署名で保証する。これにより、公開鍵の偽造を防ぐことができる。
13. なぜ「署名生成/検証」という用語を使うべきか
RS256(RSA + SHA-256)を使う限り、「暗号化」という理解でも実装は動作する。しかし、ES256(ECDSA + SHA-256)やEdDSAに移行した際に「秘密鍵で暗号化して公開鍵で復号」というメンタルモデルが通用しなくなる。
「署名生成/署名検証」という抽象的な用語を使っておけば、どのアルゴリズムでも適用できる正確な理解となる。
まとめ
デジタル署名の本質
デジタル署名は、「秘密鍵で生成した署名は対応する公開鍵でのみ検証できる」という公開鍵暗号の性質と、「わずかな変更でも大きくハッシュ値が変わる」というハッシュ関数の性質を組み合わせた仕組みである。これにより、デジタルデータにおいても現実世界の署名と同様の法的効力を持つ認証手段を実現している。
アルゴリズムごとの特性
-
RSAは暗号化と署名が同じ数学的操作(累乗と剰余)で実現できる特殊なアルゴリズム
- 署名生成と復号が同一計算式(秘密鍵でd乗)
- 署名検証と暗号化が同一計算式(公開鍵でe乗)
- 暗号化用途(機密性)と署名用途(認証・完全性)の両方に対応
-
ECDSAは署名専用に設計され、暗号化機能を持たない
- 楕円曲線で暗号化したい場合はECIESという別プロトコルを使用
- EdDSA(Ed25519)はパラメータを固定し、実装ミスを防ぐ設計思想
用語の統一
統一的に「署名生成/署名検証」という用語を使うことで、アルゴリズムに依存しない正確な理解が可能となる。
活用場面
現在では、電子契約、ソフトウェアの配布、電子メール、JWT認証など、様々な場面でデジタル署名が活用されている。