デジタル署名スキームの内部(RSA-PSS・ECDSA・EdDSA)
なぜ ECDSA の nonce 漏洩は秘密鍵全損につながり、EdDSA はそれを設計で封じたのか。存在的偽造不可能性から RSA-PSS・ECDSA・EdDSA の内部動作までを原理で比較し、選定の根拠が腑に落ちる。
- 1.署名の安全性ゴールは EUF-CMA(適応的選択文書攻撃下での存在的偽造不可能性)。攻撃者が任意の文書の署名を取れても、未署名の新しい文書の有効な署名を作れない、が満たすべき条件。
- 2.ECDSA は署名ごとに秘密の乱数 nonce k が要る。k が漏れる・再利用される・偏ると、連立方程式で秘密鍵 d が即座に復元される。PS3 ハックや一部 Bitcoin ウォレット流出はこれが原因。
- 3.EdDSA は nonce を「秘密鍵と文書のハッシュ」から決定論的に導く。乱数源に依存せず、同じ文書には同じ署名が出るため再利用事故が原理的に起きない。新規設計は Ed25519 が定石。
署名スキームが満たすべき安全性ゴール
デジタル署名は「秘密鍵を持つ本人だけが作れ、公開鍵を持つ誰もが検証できる」短いデータです。暗号の基礎 で触れたとおり、署名は完全性・認証・否認防止を一度に与えます。ただし「破られない」をきちんと定義しないと、どのスキームが安全かを論じられません。現代暗号の標準的なゴールが EUF-CMA(Existential Unforgeability under adaptive Chosen-Message Attack、適応的選択文書攻撃下での存在的偽造不可能性)です。
ゲームで表すと次のようになります。攻撃者は公開鍵を受け取り、自分の選んだ任意の文書について署名を作ってもらえる(署名オラクルへのアクセス)。それを好きなだけ、前の結果を見て次を選ぶ形(適応的)で繰り返してよい。それでもなお、一度も署名を要求していない新しい文書 m* に対する有効な署名 (m*, σ*) を作れないなら、そのスキームは EUF-CMA 安全です。
偽造の強さには段階があります。攻撃者が特定の意味のある文書を狙って偽造する(選択的偽造)よりも弱い条件が「存在的偽造」で、中身は何でもよいから、有効な署名がついた未署名の文書のペアを一つでも作れれば成功 とみなします。これを防げる(存在的偽造すら不可能)ことを要求するのが EUF-CMA で、最も弱い偽造すら許さない強い基準です。実用スキームはこれを目標に設計されます。
RSA-PSS:確率的パディングで安全性を証明可能に
RSA の数理 で見たとおり、素の RSA 署名 σ = m^d mod n には準同型性(σ1·σ2 ≡ (m1·m2)^d)があり、署名の掛け合わせで偽造ができてしまいます。これを潰す古典的方法が PKCS#1 v1.5 の決定的パディングですが、安全性の形式証明がつきません。現在推奨されるのが RSA-PSS(Probabilistic Signature Scheme)です。
PSS の核心は 署名ごとにランダムなソルト(salt)を混ぜて、エンコード結果を確率的にする ことです。流れはこうです。
署名(EMSA-PSS エンコード):
mHash = Hash(m)
salt = ランダムバイト列(毎回新規)
M' = (0x00 を8バイト) || mHash || salt # 内部メッセージ
H = Hash(M')
DB = padding || 0x01 || salt
maskedDB = DB XOR MGF1(H) # MGF でマスク
EM = maskedDB || H || 0xbc
σ = EM^d mod n # ここで初めて RSA 冪乗
検証側は σ^e mod n で EM を復元し、H と maskedDB から salt を取り出し、同じ手順で H を再計算して一致を確認します。重要な性質が二つあります。第一に、同じ文書でも salt が毎回違うため 署名は毎回変わる(確率的)。第二に、PSS はランダムオラクルモデルで EUF-CMA 安全性が証明されており、その帰着が PKCS#1 v1.5 よりタイトです。MGF1 は ハッシュ関数の内部 で扱うハッシュを使ったマスク生成関数で、出力を擬似ランダムに広げる役割を担います。
新規実装で RSA 署名を使うなら PKCS#1 v1.5 ではなく RSA-PSS(RFC 8017)を選びます。v1.5 は今も TLS 証明書などで広く現役ですが、確率的でなく証明もゆるい。salt 長は通常ハッシュ長と同じに取ります。なお PSS でも RSA そのものの土台(鍵長 2048 ビット以上、素因数分解の困難性)は不変で、量子計算機には依然として脆弱です。
ECDSA:署名生成・検証と nonce の役割
楕円曲線上の署名が ECDSA です。楕円曲線暗号(ECC)の原理 の群演算の上に載ります。曲線の生成点 G、その位数 n、秘密鍵 d、公開鍵 Q = dG を前提に、文書 m への署名 (r, s) を次で作ります。
署名(秘密鍵 d で):
e = Hash(m) を整数化(先頭 bits を使う)
k = 1 .. n-1 のランダムな秘密値(nonce, 毎回新規)
R = kG # 曲線上の点
r = R.x mod n # R の x 座標
s = k^(-1) * (e + r*d) mod n
署名 = (r, s) # r=0 や s=0 なら k を引き直す
検証(公開鍵 Q で):
w = s^(-1) mod n
u1 = e*w mod n
u2 = r*w mod n
P = u1*G + u2*Q # 点演算
有効 ⇔ P.x mod n == r
検証が成立する理由は代入で追えます。s = k^(-1)(e + r d) を変形すると k = s^(-1)(e + r d) = u1 + u2·d(mod n)。両辺に G を掛けると kG = u1·G + u2·(dG) = u1·G + u2·Q = P。よって P = kG = R となり、P.x mod n が r に一致します。ここで決定的に重要なのが k(nonce)が文書ごとに秘密かつランダムでなければならない 点です。s の式に k と d が同居しており、k が漏れると d が一発で解けてしまいます。
nonce 漏洩の致命性:方程式一本で秘密鍵が解ける
ECDSA の s の式を d について解くと、k さえ分かれば秘密鍵が即座に求まります。
s = k^(-1)(e + r*d) mod n
⇔ d = (s*k - e) * r^(-1) mod n # k が既知なら d が確定
つまり たった一つの署名でも、その k が漏れれば秘密鍵 d は終わり です。さらに恐ろしいのは、k の値そのものを知らなくても、同じ k を二つの異なる文書で再利用 すると d が解けることです。(r, s1) と (r, s2)(r が同じなら同じ k)について、
s1 = k^(-1)(e1 + r*d), s2 = k^(-1)(e2 + r*d)
s1 - s2 = k^(-1)(e1 - e2)
⇒ k = (e1 - e2) / (s1 - s2) mod n # まず k が求まり
⇒ d = (s1*k - e1) * r^(-1) mod n # 次に d が求まる
未知数2つ(k, d)に対し独立な式が2本立つので、連立方程式として解けてしまうわけです。
これは理論上の話ではありません。2010 年の PlayStation 3 ハックは、ソニーが ECDSA の k を毎回同じ定数で固定していたため、署名2つから署名鍵が抽出され、任意コードに正規署名を付けられるようになった事例です。同様に、弱い乱数生成器を積んだ一部 Bitcoin ウォレット は k の再利用や偏りで秘密鍵を抜かれ資金を盗まれました。k は完全な秘密・毎回新規・一様分布のすべてが必要で、一つでも崩れると破綻します。さらに k の上位/下位数ビットが漏れるだけでも、多数の署名を集めて格子(lattice)攻撃で d を復元できることが知られています。
EdDSA:決定論的 nonce という設計判断
ECDSA の弱点は「毎回、高品質な乱数で k を作れること」に安全性が全面依存する点にあります。乱数源は壊れやすく(VM クローン、低エントロピー起動、実装バグ)、しかも壊れても署名は正常に見えるため事故に気づけません。EdDSA(Edwards-curve Digital Signature Algorithm、RFC 8032、代表が Ed25519)は、この依存そのものを設計で取り除きました。
中心的な判断が nonce を乱数で引かず、秘密鍵と文書から決定論的に導出する ことです。
鍵: 秘密シード sk から Hash で (a, prefix) を派生(a がスカラー秘密鍵)
署名:
r = Hash(prefix || M) を整数化 # nonce を「決定論的に」生成
R = r * B # B は基点
k = Hash(R || A || M) を整数化 # A は公開鍵
S = (r + k*a) mod L
署名 = (R, S) # 64 バイト
検証:
Hash(R || A || M) を整数化して k を再計算
有効 ⇔ S*B == R + k*A
r が prefix(秘密鍵由来)と文書 M のハッシュで決まるため、同じ秘密鍵で同じ文書に署名すれば必ず同じ署名が出ます。乱数生成器が一切要りません。これにより ECDSA の k 再利用・低エントロピー事故が 原理的に発生不能 になります。異なる文書には異なる r が出るので再利用にもなりません。
EdDSA の改良は決定論だけではありません。(1) ねじれのない Edwards 曲線は加算公式が全点で例外なく成立し、ECDSA のような場合分けが減って定数時間実装が容易(サイドチャネル攻撃に強い)。(2) 検証時に剰余逆元(s^(-1))の計算が不要で速い。(3) 署名に文書全体のハッシュを2回通すため、衝突や弱いハッシュへの耐性が高い。決定論 nonce はこの総合設計の一部です。
三方式の設計思想を並べて見る
同じ「デジタル署名」でも、依存する困難性・乱数への態度・失敗モードが大きく異なります。
| 観点 | RSA-PSS | ECDSA | EdDSA (Ed25519) |
|---|---|---|---|
| 安全性の根拠 | 素因数分解の困難性 | 楕円曲線離散対数 (ECDLP) | 楕円曲線離散対数 (ECDLP) |
| 署名ごとの乱数 | salt(漏れても鍵は安全) | nonce k(漏洩で鍵全損) | 不要(決定論的) |
| 決定性 | 確率的(salt で毎回変化) | 確率的(k で毎回変化) | 決定的(同文書は同署名) |
| 鍵長/署名サイズ | 大きい(3072bit 鍵・384B 署名) | 小さい(256bit 鍵・64B 署名) | 小さい(256bit 鍵・64B 署名) |
| 主な失敗モード | 弱いパディング・短い鍵 | 乱数源の破綻・k 再利用 | 実装バグ程度(設計で堅牢) |
| 新規採用の推奨度 | RSA 互換が要る場合 | 標準準拠・既存基盤向け | 新規設計の第一候補 |
注意したいのは、EdDSA は ECDSA より「数学的に強い」わけではなく、同じ ECDLP に依存している 点です。違いは運用上の壊れにくさにあります。ECDSA は正しく乱数を扱えば安全ですが、その「正しく」が現場で守られにくい。EdDSA はその落とし穴を仕様レベルで塞いだ、いわば 誤用しにくい API としての設計勝利 です。資格試験でも「EdDSA の利点は決定論的 nonce による再利用事故の排除」と問われます。
EdDSA の決定論には注意点もあります。署名生成中にフォルトインジェクション(RSA の数理 で触れた故障注入)で R 計算後にビットを反転させ、わずかに異なる2署名を作らせると、決定論ゆえに同じ r が使われ、ECDSA の k 再利用と同型の攻撃で鍵が漏れる懸念があります。このため一部実装は「決定論+少量の乱数(hedged signature)」を採用します(RFC 6979 はあくまで決定論的な nonce 生成の規格で、フォルト攻撃対策ではない点に注意)。決定論は乱数源故障には強いが、能動的フォルト攻撃には別途対策が要る、という整理です。
まとめ
デジタル署名の安全性ゴールは EUF-CMA(任意文書の署名を取れても未署名文書を偽造できない)です。RSA-PSS は素の RSA の準同型性を確率的パディング(salt + MGF1)で潰し、ランダムオラクルモデルで証明可能な安全性を得ます。ECDSA は ECDLP に依存して短い鍵・署名を実現しますが、署名ごとの秘密 nonce k が漏洩・再利用・偏ると、s = k^(-1)(e + rd) の式から秘密鍵 d が方程式一本で解けてしまう致命的な弱点を持ちます。EdDSA は k を秘密鍵と文書から決定論的に導くことでこの事故を原理的に封じ、加えて定数時間実装の容易さや検証の高速化も得た総合設計です。
困難性の土台は RSA の数理 と ECC の原理、署名に使うハッシュは ハッシュ関数の内部、実装の堅牢さに直結する サイドチャネル攻撃 と合わせて押さえると、署名スキームの選定が原理から判断できるようになります。
セキュリティ Article
デジタル署名スキームの内部(RSA-PSS・ECDSA・EdDSA)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
デジタル署名
比較で見る軸
難易度: advanced / カテゴリ: セキュリティ / タグ数: 5
導入後に効く点
ECDSA は署名ごとに秘密の乱数 nonce k が要る。k が漏れる・再利用される・偏ると、連立方程式で秘密鍵 d が即座に復元される。PS3 ハックや一部 Bitcoin ウォレット流出はこれが原因。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- セキュリティ
- タグ数
- 5
判断チェックリスト
- 自社の用途が「デジタル署名 / ECDSA」に近いか確認する。
- 強みである「署名の安全性ゴールは EUF-CMA(適応的選択文書攻撃下での存在的偽造不可能性)。攻撃者が任意の文書の署名を取れても、未署名の新しい文書の有効な署名を作れない、が満たすべき条件。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。