こんにちは。
前回は電子署名の基礎ということでRSA署名をご紹介しました。
今回は、それより少し難しいDSA署名についてご紹介します。
準備
法
前回、合同式[latex]a \equiv b \bmod m[/latex]を説明しましたが、ここでの[latex]m[/latex]のことを「法」といいます。英語でmodularといいます。modはここからきています。
位数
互いに素な整数[latex]a[/latex]と正の整数[latex]m[/latex]において、[latex]a^d \equiv 1 \bmod m[/latex]となる中で最も小さい正の整数[latex]d[/latex]のことを「位数」といいます。
元
集合の要素のことを元といいます。「整数」という集合があったとして、[latex]1,2,3[/latex]などは元です。[latex]\frac{1}{2},\frac{1}{3}[/latex]などは元ではありません。
群
集合があったとして、その中での演算が、
- 結合法則…[latex](a+b)+c=a+(b+c)[/latex]のように、演算の順番が変わっても結果が同じになる
- 単位元…[latex]a+0=a[/latex]における[latex]0[/latex]とか、[latex]b \times 1=b[/latex]における1みたいに、何回やっても結果が同じになる元
- 逆元…ある元とその逆元で演算すると単位元になる。[latex]a+(-a)=0[/latex]や、[latex]b \times \frac{1}{b}=1[/latex]のように。
これら3つの性質を満たすとき、群といいます。
例えば、整数[latex]\mathbb{Z}[/latex]は加法[latex]+[/latex]に関して群です。
群[latex](\mathbb{Z},+)[/latex]のように表記します。
原始元
[latex]\bmod 5[/latex]を考えます。「5未満の正の整数」という集合の元には例えば1,2がありますが、 [latex]\begin{eqnarray}
1^1 \bmod 5 &=& 1 \\
1^2 \bmod 5 &=& 1 \\
&\vdots & \\
\end{eqnarray}
[/latex]
と、1の場合、答えは1しか出てきません。
一方で2の場合、
[latex]\begin{eqnarray}
2^1 \bmod 5 &=& 2 \\
2^2 \bmod 5 &=& 4 \\
2^3 \bmod 5 &=& 3 \\
2^4 \bmod 5 &=& 1 \\
&\vdots & \
\end{eqnarray}
[/latex]
2の場合、1,2,3,4という「5未満の正の整数」という集合の元すべてが答えに出てきます。このような元を原始元といいます。
DSA署名の流れHをハッシュ関数とします。
[latex]H[/latex]をハッシュ関数とします。鍵生成
- 鍵長[latex]L,N[/latex]を決めます。
- [latex]N[/latex]ビットの素数[latex]q[/latex]をランダムに決めます。ハッシュ関数の出力長より小さくなければいけません。
- [latex]L[/latex]ビットの素数[latex]p[/latex]をランダムに決めます。ハッシュ関数の出力長より小さくなければいけません。
- [latex]h<p-1[/latex]となるランダムな整数hを決めます。
- [latex]1≤x≤q-1[/latex]となるランダムな数xを決めます。
- [latex]g=h^\frac{p-1}{q} \bmod p[/latex]を求めます。
- [latex]y=g^x \bmod p[/latex]を求めます。
この流れにより、公開鍵[latex]pk=(p,q,g,y)[/latex]、秘密鍵[latex]sk=x[/latex]が決められます。
公開鍵は検証鍵として、秘密鍵は署名鍵として使われます。
署名
- [latex]q[/latex]未満の正の整数[latex]k[/latex]をランダムに決めます。
- [latex]r=(g^k \bmod p) \bmod q[/latex]を求めます。[latex]r=0[/latex]になる場合は1.に戻ります。
- [latex]t=(H(m)+xr)k^{-1} \bmod q[/latex]を求めます。[latex]t=0[/latex]になる場合は1.に戻ります。
検証
- [latex]w=t^{-1} \bmod q[/latex]を求めます。
- [latex]u_1=wH(m) \bmod q[/latex]を求めます。
- [latex]u_2=rw \bmod q[/latex]を求めます。
- [latex]v=(g^u_1y^u_2 \bmod p) \bmod q[/latex]を求めます。
安全性
離散対数問題
例えば、[latex]2^{10} \bmod 19[/latex]は簡単に解けますね。17です。逆に、[latex]2^x \equiv 17 \bmod 19[/latex]となる[latex]x[/latex]を求める(答えは10)ことはできるでしょうか?
これは、かなり時間がかかります。
正式に書くと、「[latex]p[/latex]未満の正の整数」という集合を[latex]\mathbb{Z}_p[/latex]として、素数[latex]p[/latex]、群[latex](\mathbb{Z}_p,\times)[/latex]の原始元[latex]g[/latex]、群[latex](\mathbb{Z}_p,\times)[/latex]の任意の元[latex]y[/latex]に対して、[latex]y \equiv g^x \bmod p[/latex]を満たす[latex]x[/latex]が存在します。
この[latex]x[/latex]を、[latex]y[/latex]に対する離散対数といい、[latex]x[/latex]を解くことを離散対数問題(Discrete Logarithm Problem, DLP)といいます。
これを多項式時間で解くアルゴリズムは見つかっていません。なので、離散対数問題は多項式時間で解けないという仮定を、離散対数仮定といいます。
この離散対数仮定が、DSA署名は安全だといえる根拠になります。
おわりに
群論の知識を必要としますが、本記事の「準備」節を読めばそれなりにわかってきたのではないでしょうか。
群論などの知識は前提としていきなり離散対数問題を紹介してる記事よりは、それなりにわかりやすくなるように書いたつもりなので、そうあってほしいです笑
次回はやっと、ブロックチェーンにも使われているECDSA署名についてご紹介します!
DSAとECDSAの関係はなんなのかと先にいうと、DSAに使っている群に、楕円曲線上の巡回群を使っているものこそがECDSA、ということになります。