署名生成
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2019/05/13 09:27 UTC 版)
「ボネ・リン・シャチャム署名」の記事における「署名生成」の解説
署名鍵 x {\displaystyle x} と署名したいメッセージ m {\displaystyle m} が与えられたとき、まず、 m {\displaystyle m} のハッシュ値 h = H ( m ) {\displaystyle h=H(m)} を計算する。そして、署名 σ = h x {\displaystyle \sigma =h^{x}} を出力する。
※この「署名生成」の解説は、「ボネ・リン・シャチャム署名」の解説の一部です。
「署名生成」を含む「ボネ・リン・シャチャム署名」の記事については、「ボネ・リン・シャチャム署名」の概要を参照ください。
署名生成
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/06/19 03:03 UTC 版)
ParameterCURVE 使用する楕円曲線 G ベースポイント(位数 n の巨大素数とともに楕円曲線を定義する) n G の位数( n ∗ G = O {\displaystyle n*G=O} を満たす) アリスが署名したメッセージをボブに送る場合を考える。最初に、使用する楕円曲線のパラメータ ( C U R V E , G , n ) {\displaystyle (CURVE,G,n)} を決めておく必要がある。 アリスは [ 1 , n − 1 ] {\displaystyle [1,n-1]} の範囲からランダムに選択された秘密鍵 d A {\displaystyle d_{A}} と、公開鍵 Q A = d A ∗ G {\displaystyle Q_{A}=d_{A}*G} から成る鍵ペアを生成する。ここで ∗ {\displaystyle *} は楕円曲線上での掛け算 (scalar multiplication) を意味する。 アリスがメッセージ m {\displaystyle m} に署名する場合、以下の計算を行う。 e = HASH ( m ) {\displaystyle e={\textrm {HASH}}(m)} を計算する。ここで HASH はSHA-1のような暗号学的ハッシュ関数を指す。 z {\displaystyle z} を、 e {\displaystyle e} の最上位側の L n {\displaystyle L_{n}} ビットとする。ここで L n {\displaystyle L_{n}} は位数 n {\displaystyle n} のビット長とする。 [ 1 , n − 1 ] {\displaystyle [1,n-1]} の範囲から整数 k {\displaystyle k} を任意に選択する。 曲線上の点 ( x 1 , y 1 ) = k ∗ G {\displaystyle (x_{1},y_{1})=k*G} を計算する。 r = x 1 mod n {\displaystyle r=x_{1}\,{\bmod {\,}}n} を計算する。 r = 0 {\displaystyle r=0} となる場合には k {\displaystyle k} の選択に戻る。 s = k − 1 ( z + r d A ) mod n {\displaystyle s=k^{-1}(z+rd_{A})\,{\bmod {\,}}n} を計算する。 s = 0 {\displaystyle s=0} となる場合には k {\displaystyle k} の選択に戻る。 ( r , s ) {\displaystyle (r,s)} が m {\displaystyle m} に対する署名となる。 s {\displaystyle s} を計算する際に、 HASH ( m ) {\displaystyle {\textrm {HASH}}(m)} から得られる z {\displaystyle z} は整数に変換される。 z {\displaystyle z} は n {\displaystyle n} より「大きい」ことは許されるが、「長い」ことは許されない。 DSAと同様に、署名ごとに異なる k {\displaystyle k} を選択することは極めて重要である。さもないと、ステップ6の式から秘密鍵 d A {\displaystyle d_{A}} を得ることが可能となってしまう。メッセージ m {\displaystyle m} および m ′ {\displaystyle m'} に対して、未知だが同じ k {\displaystyle k} から得られた2つの署名 ( r , s ) {\displaystyle (r,s)} および ( r , s ′ ) {\displaystyle (r,s')} がある場合、攻撃者は z {\displaystyle z} および z ′ {\displaystyle z'} を計算することが可能であり、 s − s ′ = k − 1 ( z − z ′ ) {\displaystyle s-s'=k^{-1}(z-z')} であることから、 k = z − z ′ s − s ′ {\displaystyle k={\frac {z-z'}{s-s'}}} が得られる。 s = k − 1 ( z + r d A ) {\displaystyle s=k^{-1}(z+rd_{A})} であるから、攻撃者は秘密鍵 d A = s k − z r {\displaystyle d_{A}={\frac {sk-z}{r}}} を得ることができる。このように単一の k {\displaystyle k} を用いることは不適切な実装であり、PlayStation 3のソフトウェア署名鍵が漏洩したのはこれが原因であった。
※この「署名生成」の解説は、「楕円曲線DSA」の解説の一部です。
「署名生成」を含む「楕円曲線DSA」の記事については、「楕円曲線DSA」の概要を参照ください。
- 署名生成のページへのリンク