デジタル署名アルゴリズム

デジタル署名アルゴリズムDSA)は、公開鍵暗号システムであり、デジタル署名のための連邦情報処理標準(FIPS)です。これは、べき乗剰余離散対数問題という数学的概念に基づいています。デジタル署名システムでは、秘密鍵と公開鍵からなる鍵ペアが使用されます。このシステムでは、公開鍵を宣言した署名者は、秘密鍵を使用して署名を生成することができ、検証者は、宣言された公開鍵を使用して署名を正しく検証することで、その署名の出所を主張することができます。DSAは、シュノア署名方式とエルガマル署名方式の派生です。[ 1 ]:486

米国国立標準技術研究所(NIST)は、1991年にデジタル署名標準(DSS)にDSAを採用することを提案し、1994年にFIPS 186として採用しました。 [ 2 ]初期仕様から5回の改訂がリリースされています。最新の仕様は、 2023年2月からのFIPS 186-5です。 [ 3 ] DSAは特許取得済みですが、NISTはこの特許を世界中でロイヤリティフリーで利用できるようにしています。FIPS 186-5仕様では、DSAはデジタル署名の生成には承認されなくなりますが、この標準の実装日より前に生成された署名の検証には使用できることが示されています。

概要

DSAは公開鍵暗号システムの枠組みの中で動作し、モジュラー指数の代数的性質と、計算的に解決不可能と考えられている離散対数問題に基づいています。このアルゴリズムでは、公開鍵と秘密鍵からなる鍵ペアを使用します。秘密鍵はメッセージのデジタル署名を生成するために使用され、署名者の対応する公開鍵を使用して、この署名を検証できます。デジタル署名は、メッセージ認証(受信者がメッセージの送信元を検証できる)、整合性(受信者が署名後にメッセージが変更されていないことを検証できる)、および否認不可性(送信者がメッセージに署名していないと虚偽に主張できない)を提供します。

歴史

1982年、米国政府は公開鍵署名規格の提案を募集しました。1991年8月、米国国立標準技術研究所(NIST)は、デジタル署名規格(DSS)にDSAを採用することを提案しました。当初、特にRSA暗号システムに基づくデジタル署名ソフトウェアの開発に既に注力していたソフトウェア企業から、強い批判がありました。[ 1 ] : 484 それにもかかわらず、NISTは1994年にDSAを連邦標準(FIPS 186)として採用しました。最初の仕様には5つの改訂版がリリースされています。1998年のFIPS 186–1、[ 4 ] 2000年のFIPS 186–2、[ 5 ] 2009年FIPS 186–3 、 [ 6 ] 2013年のFIPS 186–4、[ 3 ] 2023年のFIPS 186–5です。 [ 7 ]標準FIPS 186-5はDSAによる署名を禁止していますが、標準の実装日より前に生成された署名の検証は文書として許可しています。これは、 EdDSAなどの新しい署名スキームに置き換えられる予定です。[ 8 ]

DSAは、1991年7月26日に出願され、現在は失効している米国特許5,231,668号で保護されており、 NSA元職員のデイビッド・W・クラヴィッツ氏[ 9 ]に帰属しています。この特許は「ワシントンD.C.商務長官を代表とするアメリカ合衆国」に付与され、NISTはこの特許を世界中で無償で利用できるようにしています。[ 10 ]クラウス・P・シュノア氏は、自身の米国特許4,995,082号(これも現在は失効)がDSAをカバーしていると主張していますが、この主張には異議があります。[ 11 ]

1993年、デイブ・バニサールはFOIA請求を通じて、DSAアルゴリズムはNISTではなくNSAによって設計されたものであるという確認を得ることに成功した。[ 12 ]

OpenSSHは2025年にDSAを削除すると発表しました。バージョン10.0ではDSAのサポートは完全に廃止されました。[ 13 ] [ 14 ]

手術

DSA アルゴリズムには、キー生成 (キー ペアの作成)、キー配布、署名、署名検証の 4 つの操作が含まれます。

1. 鍵生成

鍵生成には2つのフェーズがあります。最初のフェーズでは、システムの異なるユーザー間で共有できるアルゴリズムパラメータを選択し、2番目のフェーズでは、1人のユーザーに対して1つの鍵ペアを計算します。

パラメータ生成

  • 出力長 ビットの承認済み暗号ハッシュ関数 を選択します。元のDSSでは、は常にSHA-1でしたが、現在のDSSではより強力なSHA-2ハッシュ関数の使用が承認されています。 [ 3 ] [ 15 ]が法長 より大きい場合、ハッシュ出力の左端のビットのみが使用されます。H{\displaystyle H}|H|{\displaystyle |H|}H{\displaystyle H}|H|{\displaystyle |H|}{\displaystyle N}{\displaystyle N}
  • 鍵の長さを選択します。オリジナルのDSSでは、512から1024までの64の倍数に制限されていました。NIST 800-57では、セキュリティ有効期間が2010年(または2030年)を超える鍵については、2048(または3072)の長さを推奨しています。[ 16 ]L{\displaystyle L}L{\displaystyle L}
  • となるような係数の長さを選択してください。FIPS 186-4では、およびが(1024, 160)、(2048, 224)、(2048, 256)、または(3072, 256)のいずれかの値を取るように規定されています。[ 3 ]{\displaystyle N}<L{\displaystyle N<L}|H|{\displaystyle N\leq |H|}L{\displaystyle L}{\displaystyle N}
  • ビット素数を選択します。{\displaystyle N}q{\displaystyle q}
  • が の倍数となるようなビットの素数を選択します。L{\displaystyle L}p{\displaystyle p}p1{\displaystyle p-1}q{\displaystyle q}
  • からランダムに整数を選択します。h{\displaystyle h}{2p2}{\displaystyle \{2\ldots p-2\}}
  • を計算します。まれに、異なる で再試行してください。一般的にが使用されます。この剰余指数は、値が大きい場合でも効率的に計算できます。g:=h(p1)/qmodp{\displaystyle g:=h^{(p-1)/q}\mod p}g=1{\displaystyle g=1}h{\displaystyle h}h=2{\displaystyle h=2}

アルゴリズムパラメータは( , , )です。これらはシステムの異なるユーザー間で共有できます。 p{\displaystyle p}q{\displaystyle q}g{\displaystyle g}

ユーザーごとのキー

一連のパラメータが指定されると、第 2 フェーズでは単一のユーザーのキー ペアを計算します。

  • からランダムに整数を選択します。x{\displaystyle x}{1q1}{\displaystyle \{1\ldots q-1\}}
  • 計算します。y:=gxmodp{\displaystyle y:=g^{x}\mod p}

x{\displaystyle x}は秘密鍵、は公開鍵です。 y{\displaystyle y}

2. 鍵配布

署名者は公開鍵を公開する必要があります。つまり、信頼できる(ただし必ずしも秘密である必要はない)メカニズムを介して受信者に鍵を送信する必要があります。署名者は秘密鍵を秘密に保持する必要があります。 y{\displaystyle y}x{\displaystyle x}

3. 署名

メッセージは次のように署名されます。 m{\displaystyle m}

  • ランダムに整数を選択するk{\displaystyle k}{1q1}{\displaystyle \{1\ldots q-1\}}
  • を計算します。 という可能性は低いですが、その場合は別のランダム からやり直してください。r:=(gkmodp)modq{\displaystyle r:=\left(g^{k}{\bmod {\,}}p\right){\bmod {\,}}q}r=0{\displaystyle r=0}k{\displaystyle k}
  • を計算します。 という可能性は低いですが、その場合は別のランダム からやり直してください。s:=(k1(H(m)+xr))modq{\displaystyle s:=\left(k^{-1}\left(H(m)+xr\right)\right){\bmod {\,}}q}s=0{\displaystyle s=0}k{\displaystyle k}

署名は(r,s){\displaystyle \left(r,s\right)}

との計算は、メッセージごとに新しい鍵を作成することに相当します。 の計算におけるモジュラー指数演算は、署名操作の中で最も計算コストの高い部分ですが、メッセージが既知になる前に計算できる場合があります。モジュラー逆数の計算は2番目に計算コストの高い部分ですが、これもメッセージが既知になる前に計算できる場合があります。これは、拡張ユークリッド互除法、またはフェルマーの小定理を用いてとして計算できます。 k{\displaystyle k}r{\displaystyle r}r{\displaystyle r}k1modq{\displaystyle k^{-1}{\bmod {\,}}q}kq2modq{\displaystyle k^{q-2}{\bmod {\,}}q}

4. 署名検証

次のようにして、署名がメッセージに対して有効な署名であるかどうかを確認できます。 (r,s){\displaystyle \left(r,s\right)}m{\displaystyle m}

  • および を検証します。0<r<q{\displaystyle 0<r<q}0<s<q{\displaystyle 0<s<q}
  • 計算します。w:=s1modq{\displaystyle w:=s^{-1}{\bmod {\,}}q}
  • 計算します。u1:=H(m)wmodq{\displaystyle u_{1}:=H(m)\cdot w\,{\bmod {\,}}q}
  • 計算します。u2:=rwmodq{\displaystyle u_{2}:=r\cdot w\,{\bmod {\,}}q}
  • 計算します。v:=(gu1yu2modp)modq{\displaystyle v:=\left(g^{u_{1}}y^{u_{2}}{\bmod {\,}}p\right){\bmod {\,}}q}
  • 署名は次の場合にのみ有効です。v=r{\displaystyle v=r}

アルゴリズムの正確性

署名スキームは、検証者が常に真正な署名を受け入れるという意味で正しいと言えます。これは次のように示せます。

まず、 なので、フェルマーの小定理により が成り立ちます。と は素数なので、 の位数は でなければなりません 。 g=h(p1)/q mod p{\textstyle g=h^{(p-1)/q}~{\text{mod}}~p}gqhp11modp{\textstyle g^{q}\equiv h^{p-1}\equiv 1\mod p}g>0{\displaystyle g>0}q{\displaystyle q}g{\displaystyle g}q{\displaystyle q}

署名者は計算する

s=k1(H(m)+xr)modq{\displaystyle s=k^{-1}(H(m)+xr){\bmod {\,}}q}

したがって

kH(m)s1+xrs1H(m)w+xrw(modq){\displaystyle {\begin{aligned}k&\equiv H(m)s^{-1}+xrs^{-1}\\&\equiv H(m)w+xrw{\pmod {q}}\end{aligned}}}

順序があるので 、g{\displaystyle g}q{\displaystyle q}

gkgH(m)wgxrwgH(m)wyrwgu1yu2(modp){\displaystyle {\begin{aligned}g^{k}&\equiv g^{H(m)w}g^{xrw}\\&\equiv g^{H(m)w}y^{rw}\\&\equiv g^{u_{1}}y^{u_{2}}{\pmod {p}}\end{aligned}}}

最後に、DSAの正しさは、

r=(gkmodp)modq=(gu1yu2modp)modq=v{\displaystyle {\begin{aligned}r&=(g^{k}{\bmod {\,}}p){\bmod {\,}}q\\&=(g^{u_{1}}y^{u_{2}}{\bmod {\,}}p){\bmod {\,}}q\\&=v\end{aligned}}}

感度

DSAでは、ランダム署名値のエントロピー、機密性、そして一意性が極めて重要です。これらの3つの要件のいずれかに違反すると、秘密鍵全体が攻撃者に漏洩される可能性があります。[ 17 ]同じ値を2回使用した場合(秘密を保持したままであっても)、予測可能な値を使用した場合、あるいは複数の署名のそれぞれにおいて数ビットでも漏洩した場合、秘密鍵が漏洩する可能性があります。[ 18 ]k{\displaystyle k}k{\displaystyle k}k{\displaystyle k}x{\displaystyle x}

この問題はDSAと楕円曲線デジタル署名アルゴリズム(ECDSA )の両方に影響します。2010年12月、 fail0verflowグループは、ソニーがPlayStation 3ゲーム機のソフトウェアに署名するために使用したECDSA秘密鍵の復元を発表しました。この攻撃は、ソニーが署名ごとに新しい乱数を生成できなかったために可能になりました。[ 19 ]k{\displaystyle k}

この問題は、 RFC 6979で規定されているように、秘密鍵とメッセージハッシュから決定論的にを導出することで防ぐことができます。これにより、 はそれぞれ異なり、秘密鍵を知らない攻撃者にとって予測不可能になります。 k{\displaystyle k} k{\displaystyle k}H(m){\displaystyle H(m)}x{\displaystyle x}

さらに、DSAやECDSAの悪意ある実装は、署名を介して潜在的に情報を漏洩させるために利用される可能性があります。例えば、一見無害に見える署名のみを配信する完全なオフラインデバイスから、オフラインの秘密鍵が漏洩する可能性があります。[ 20 ]k{\displaystyle k}

実装

以下は、DSA をサポートする暗号化ライブラリの一覧です (網羅的ではありません)。

参照

参考文献

  1. ^ a bシュナイアー、ブルース (1996).応用暗号学. Wiley. ISBN 0-471-11709-9
  2. ^ 「FIPS PUB 186: デジタル署名標準(DSS)、1994年5月19日」。qcsrc.nist.gov。 2013年12月13日時点のオリジナルよりアーカイブ
  3. ^ a b c d「FIPS PUB 186-4: デジタル署名標準 (DSS)、2013 年 7 月」(PDF) . csrc.nist.gov .
  4. ^ 「FIPS PUB 186-1: デジタル署名標準 (DSS)、1998年12月15日」(PDF) . csrc.nist.gov . 2013年12月26日時点のオリジナル(PDF)からアーカイブ
  5. ^ 「FIPS PUB 186-2: デジタル署名標準 (DSS)、2000-01-27」(PDF) . csrc.nist.gov .
  6. ^ 「FIPS PUB 186-3: デジタル署名標準 (DSS)、2009 年 6 月」(PDF) . csrc.nist.gov .
  7. ^ 「FIPS PUB 186-5: デジタル署名標準 (DSS)、2023年2月」(PDF) . csrc.nist.gov .
  8. ^ 「デジタル署名標準(DSS)」米国商務省。2019年10月31日。 2020年7月21日閲覧
  9. ^デイビッド・W・クラヴィッツ博士 2013年1月9日アーカイブ、 Wayback Machine
  10. ^ヴェルナー・コッホ「DSAと特許」
  11. ^ “1994 Annual Report of CSSPAB” . 2009年8月26日.オリジナルの2009年8月26日時点のアーカイブ。
  12. ^ Neumann, Peter G. (2020年2月29日). 「The RISKS Digest Volume 14 Issue 59」 . 2020年2月29日時点のオリジナルよりアーカイブ2023年10月3日閲覧。{{cite web}}: CS1 maint: bot: original URL status unknown (link)
  13. ^ 「OpenSSHがDSA削除のタイムラインを発表 [LWN.net]」lwn.net . 2024年1月11日閲覧
  14. ^ 「OpenSSHバージョン10.0リリースノート」 。 2025年4月21日閲覧
  15. ^ 「FIPS PUB 180-4: セキュアハッシュ標準 (SHS)、2012年3月」(PDF) . csrc.nist.gov .
  16. ^ 「NIST特別出版物800-57」(PDF) . csrc.nist.gov . 2014年6月6日時点のオリジナル(PDF)からアーカイブ
  17. ^ 「Debian PGPの惨事はほぼ起こりかけた」 root labs rdist 2009年5月18日。
  18. ^ DSA値の要件k{\displaystyle k}
  19. ^ Bendel, Mike (2010年12月29日). 「ハッカーがPS3のセキュリティを大失敗と表現、無制限のアクセスを獲得」 Exophase.com . 2011年1月5日閲覧
  20. ^ Verbücheln, Stephan (2015年1月2日). 「完璧なオフラインウォレットでもビットコインの秘密鍵が漏洩する可能性がある」. arXiv : 1501.00447 [ cs.CR ].
  21. ^ 「公開鍵暗号 — Botan」 . botan.randombit.net . 2025年12月15日閲覧
  22. ^ 「Bouncy CastleがJava 1.81とC# .NET 2.6.1をリリース」 Bouncycastle . 2025年12月15日閲覧。
  23. ^ https://cryptlib.com/downloads/manual.pdf
  24. ^ 「デジタル署名アルゴリズム - Crypto++ Wiki」 . www.cryptopp.com . 2025年12月15日閲覧
  25. ^ 「暗号化関数(Libgcryptリファレンスマニュアル)」www.gnupg.org . 2025年12月15日閲覧
  26. ^ 「Nettle: 低レベル暗号化ライブラリ」 www.lysator.liu.se . 2025年12月15日閲覧
  27. ^ "dsa - OpenSSLドキュメント" . docs.openssl.org . 2025年12月15日閲覧
  28. ^ "wolfSSL ユーザーマニュアル | 第10章: wolfCrypt 使用方法リファレンス | ドキュメント" . wolfSSL (日本語) . 2025年12月15日閲覧
  29. ^ 「公開鍵アルゴリズム(GnuTLS 3.8.10)」 www.gnutls.org . 2025年12月15日閲覧