楕円曲線DSA

提供: miniwiki
2016/5/21/ (土) 23:45時点におけるja>Squirrel's tailによる版 (署名検証:  漢字誤変換)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
移動先:案内検索

楕円曲線DSA(だえんきょくせんDSA、Elliptic Curve Digital Signature AlgorithmElliptic Curve DSA楕円DSAECDSA)は、Digital Signature Algorithm (DSA) について楕円曲線暗号を用いるようにした変種である。

DSAとの比較

楕円曲線暗号で一般的に言われるように、ECDSAにおいて必要とされる公開鍵のサイズはセキュリティレベルのおよそ2倍であると考えられる。例えば、80ビットのセキュリティレベル(攻撃者が秘密鍵を取得するために [math]2^{80}[/math] 回の計算を必要とする)を得るために、DSAでは最低でも1024ビットの公開鍵が必要であるが、ECDSAでは160ビットの公開鍵で十分である。一方、署名のサイズはDSAでもECDSAでも同じであり、必要とするセキュリティレベルの4倍のビット長を要する(80ビットのセキュリティレベルのためには320ビットの長さの署名が必要)。

署名生成

Parameter
CURVE 使用する楕円曲線
G ベースポイント(位数 n の巨大素数とともに楕円曲線を定義する)
n G の位数([math]n * G = O[/math] を満たす)

アリスが署名したメッセージをボブに送る場合を考える。最初に、使用する楕円曲線のパラメータ [math](CURVE, G, n)[/math] を決めておく必要がある。

アリスは [math][1, n-1][/math] の範囲からランダムに選択された秘密鍵 [math]d_A[/math] と、公開鍵 [math]Q_A = d_A * G[/math] から成る鍵ペアを生成する。ここで [math]*[/math]楕円曲線上での掛け算 (scalar multiplication) を意味する。

アリスがメッセージ [math]m[/math] に署名する場合、以下の計算を行う。

  1. [math]e = \textrm{HASH}(m)[/math] を計算する。ここで HASH はSHA-1のような暗号学的ハッシュ関数を指す。
  2. [math]z[/math] を、[math]e[/math] の最上位側の [math]L_n[/math] ビットとする。ここで [math]L_n[/math] は位数 [math]n[/math] のビット長とする。
  3. [math][1, n-1][/math] の範囲から整数 [math]k[/math] を任意に選択する。
  4. 曲線上の点 [math](x_1, y_1) = k * G[/math] を計算する。
  5. [math]r = x_1\,\bmod\,n[/math] を計算する。[math]r = 0[/math] となる場合には [math]k[/math] の選択に戻る。
  6. [math]s = k^{-1}(z + r d_A)\,\bmod\,n[/math] を計算する。[math]s = 0[/math] となる場合には [math]k[/math] の選択に戻る。
  7. [math](r, s)[/math][math]m[/math] に対する署名となる。

[math]s[/math] を計算する際に、[math]\textrm{HASH}(m)[/math] から得られる [math]z[/math] は整数に変換される。[math]z[/math][math]n[/math] より「大きい」ことは許されるが、「長い」ことは許されない[1]

DSAと同様に、署名ごとに異なる [math]k[/math] を選択することは極めて重要である。さもないと、ステップ6の式から秘密鍵 [math]d_A[/math] を得ることが可能となってしまう。メッセージ [math]m[/math] および [math]m'[/math] に対して、未知だが同じ [math]k[/math] から得られた2つの署名 [math](r, s)[/math] および [math](r, s')[/math] がある場合、攻撃者は [math]z[/math] および [math]z'[/math] を計算することが可能であり、[math]s - s' = k^{-1}(z - z')[/math] であることから、[math]k = \frac{z - z'}{s - s'}[/math] が得られる。[math]s = k^{-1}(z + r d_A)[/math] であるから、攻撃者は秘密鍵 [math]d_A = \frac{s k - z}{r}[/math] を得ることができる。このように単一の [math]k[/math] を用いることは不適切な実装であり、PlayStation 3のソフトウェア署名鍵が漏洩したのはこれが原因であった[2]

署名検証

ボブがアリスの署名を検証するためには、アリスの公開鍵 [math]Q_A[/math] が必要である。公開鍵 [math]Q_A[/math] が正当なものであるかの検証は以下のとおりである。

  1. [math]Q_A[/math][math]O[/math] でないことを確認する。
  2. [math]Q_A[/math] が曲線上にあることを確認する。
  3. [math]n * Q_A = O[/math] であることを確認する。

メッセージ [math]m[/math] と署名 [math](r, s)[/math] の検証は以下のように行われる。

  1. [math]r[/math] および [math]s[/math] がいずれも [math][1, n-1][/math] の範囲にある整数であることを確認する。これを満たさない場合には署名は不正なものである。
  2. [math]e = \textrm{HASH}(m)[/math] を計算する。ここで HASH は署名生成に用いられたハッシュ関数と同一のものである。
  3. [math]z[/math] を、[math]e[/math] の最上位側の [math]L_n[/math] ビットとする。
  4. [math]w = s^{-1}\,\bmod\,n[/math] を計算する。
  5. [math]u_1 = zw\,\bmod\,n[/math] および [math]u_2 = rw\,\bmod\,n[/math] を計算する。
  6. 曲線上の点 [math](x_1, y_1) = u_1 * G + u_2 * Q_A[/math] を計算する。
  7. [math]r \equiv x_1 \pmod{n}[/math] であれば署名は正当なものである。

Straus's algorithm(Shamir's trickとも)を用いることで、2つの楕円曲線上での掛け算の和 [math]u_1 * G + u_2 * Q_A[/math] を、2つの楕円曲線上での掛け算よりも速く計算することができる[3]

アルゴリズムの正当性

ここで [math]C[/math] は署名検証のステップ6で得られた点とする。

[math]C = u_1 * G + u_2 * Q_A[/math]

公開鍵が [math]Q_A = d_A * G[/math] と定義されることより

[math]C = u_1 * G + u_2 d_A * G[/math]

楕円曲線上での掛け算より

[math]C = (u_1 + u_2 d_A) * G[/math]

署名検証のステップ4より [math]u_1[/math] および [math]u_2[/math] の定義を拡張すると

[math]C = (z s^{-1} + r d_A s^{-1}) * G[/math]

[math]s^{-1}[/math] を外に出して

[math]C = (z + r d_A) s^{-1} * G[/math]

署名のステップ6より [math]s[/math] の定義を拡張すると

[math]C = (z + r d_A) (z + r d_A)^{-1} (k^{-1})^{-1} * G[/math]

逆数の逆数は元と同じであることと、逆数と元の積は [math]O[/math] であることから

[math]C = k * G[/math]

[math]r[/math] の定義より、これは署名検証のステップ6と等しい。

これは正しく署名されたメッセージは正しく検証されることのみを示しており、セキュアな署名アルゴリズムであるための他の要素については考慮していない。

セキュリティ

2010年12月、fail0verflowと名乗るグループが、ソニーPlayStation 3のソフトウェア署名に用いていたECDSA秘密鍵の回復に成功したと発表した。しかし、これは [math]k[/math] をランダムではなく固定値としていたソニーの不適切な実装によるものであり、アルゴリズム自体の脆弱性ではない。署名生成のセクションで述べたように、[math]k[/math] を固定値で用いることは秘密鍵 [math]d_A[/math] を計算可能とし、アルゴリズムを破綻させるものである[4]

2011年3月29日、2人の研究者による論文がIACREnglish版に発表された。この論文では、サイドチャネル攻撃の一つであるタイミング攻撃English版によって、ECDSAを認証に利用し、OpenSSLを用いたサーバのTLS秘密鍵を入手可能であることが示された[5]。この脆弱性はOpenSSL 1.0.0eで修正された[6]

2013年8月、Java class SecureRandomのいくつかの実装において、[math]k[/math] のコリジョンが発生することがあるバグが明らかとなった。前述のように、これにより秘密鍵を得ることが可能であり、Javaを利用しECDSAを認証に用いていたAndroidアプリからBitcoinが盗まれる危険性があった[7]。この問題は、RFC 6979にあるように、秘密鍵とメッセージハッシュから決定論的に [math]k[/math] を導くことで回避できる。

このアルゴリズムは楕円曲線をパラメータとして必要とするが、多くの場合NISTによって定められた楕円曲線(P-256、P-384、P-521など)[8]が用いられる。これらの曲線は特定のシード値からSHA-1を基盤としたアルゴリズムを用いて算出されている[8]が、シード値の根拠が不明であること[9][10]、また同じく固定の楕円曲線を用いたアルゴリズムであるDual_EC_DRBGEnglish版NSAがバックドアを仕込んだ上でRSAセキュリティ社のセキュリティ製品に採用させたと報道されたこと[11]から、疑いの目で見られることがある[12][13]

脚注

  1. FIPS 186-3, pp. 19 and 26
  2. Console Hacking 2010 - PS3 Epic Fail, page 123–128
  3. The Double-Base Number System in Elliptic Curve Cryptography
  4. Bendel, Mike (2010年12月29日). “Hackers Describe PS3 Security As Epic Fail, Gain Unrestricted Access”. Exophase.com. http://exophase.com/20540/hackers-describe-ps3-security-as-epic-fail-gain-unrestricted-access/ . 2013閲覧. 
  5. Vulnerability Note VU#536044 - OpenSSL leaks ECDSA private key through a remote timing attack
  6. OpenSSL: News, ChangeLog
  7. Android bug batters Bitcoin wallets”. The Register (2013年8月12日). . 2013閲覧.
  8. 8.0 8.1 RECOMMENDED ELLIPTIC CURVES FOR FEDERAL GOVERNMENT USE” (1999年7月). . 2015閲覧.
  9. SafeCurves: Rigidity”. . 2015閲覧.
  10. 例えばMD5SHA-2で撹拌のために用いられる定数テーブルは整数ラジアンの三角関数の値や素数平方根や立方根の値を特定の形で用いており、意図的な操作の余地が少ない。
  11. Exclusive: Secret contract tied NSA and security industry pioneer”. Reuters (2013年12月20日). . 2015閲覧.
  12. Daniel J. Bernstein, Tanja Lange (2013年5月31日). “Security dangers of the NIST curves”. . 2015閲覧.
  13. Maxwell, Gregory (2013年9月8日). “[tor-talk NIST approved crypto in Tor?]”. . 2015閲覧.

参考文献

関連項目

外部リンク

テンプレート:Cryptography navbox