楕円曲線DSA
ここで C {\displaystyle C} は署名検証のステップ6で得られた点とする。
C = u 1 ∗ G + u 2 ∗ Q A {\displaystyle C=u_{1}*G+u_{2}*Q_{A}}
公開鍵が Q A = d A ∗ G {\displaystyle Q_{A}=d_{A}*G} と定義されることより
C = u 1 ∗ G + u 2 d A ∗ G {\displaystyle C=u_{1}*G+u_{2}d_{A}*G}
楕円曲線上での掛け算より
C = ( u 1 + u 2 d A ) ∗ G {\displaystyle C=(u_{1}+u_{2}d_{A})*G}
署名検証のステップ4より u 1 {\displaystyle u_{1}} および u 2 {\displaystyle u_{2}} の定義を拡張すると
C = ( z s − 1 + r d A s − 1 ) ∗ G {\displaystyle C=(zs^{-1}+rd_{A}s^{-1})*G}
アリスが署名したメッセージをボブに送る場合を考える。最初に、使用する楕円曲線のパラメータ ( 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} を任意に選択する。
ECDSAをサポートしているライブラリは以下の通りである。
Botan
Bouncy Castle(英語版)
cryptlib(英語版)
Crypto++(英語版)
libgcrypt(英語版)
OpenSSL
GnuTLS
wolfCrypt