ブロックチェーン技術ブログ

ブロックチェーンと英語、数学に関するブログ

デジタル署名 < ECDSA署名 >

デジタル署名は、"ある人がデータを作成したこと"あるいは"あるデータに同意したこと"を保証する仕組みです.
ブロックチェーンでは、トランザクションが送信者本人によって作成されたものであることを示すために利用されます.

デジタル署名には、公開鍵暗号の技術が応用されています.

デジタル署名は、鍵生成、署名、検証の3つのアルゴリズムからなります.

  1. 鍵生成
    デジタル署名では、公開鍵暗号技術を利用した署名鍵(秘密鍵)と検証鍵(公開鍵)のペアを利用します.
    事前に、署名鍵と検証鍵のペアを作成しておきます.

  2. 署名
    署名者が署名対象のメッセージと自身の署名鍵から、デジタル署名を生成します.

  3. 検証
    署名者の検証鍵を用いて、署名対象のメッセージとデジタル署名から、検証をおこないます.
    正しい署名の場合、検証に成功します.

デジタル署名の図

 署名者                 検証者

メッセージ      →        メッセージ
  ↓                   ↓
  署名  →  デジタル署名  → 検証 (署名者の検証鍵を使用) 
(自身の署名鍵を使用)           ↓
                   成功 or 失敗

署名のサイズは、メッセージのサイズによらず一定です.
また、暗号と異なり、署名からメッセージを計算することはできません.

楕円曲線

楕円曲線について簡単にみていきましょう.

楕円曲線Eは、y^{2}=x^{3}+ax+b を満たす、3次曲線です.
体として有限体 F_p が用いられます.

楕円曲線上の点G(ベースポイント)に対して、加法を定義できます.
このときに、G + G + ... + G = nG = O となる、nが存在します.
また、n が G の位数となります.

楕円曲線暗号では、nG から n を求めるのが困難であるという仮定を利用します.

ECDSA署名

ECDSAは、楕円曲線を利用した署名アルゴリズムです.
BitcoinやEthereumでも使用されています.

事前に以下の情報を共有しておきます.

パラメータ 説明
a, b 楕円曲線の係数
p 有限体F_p素数
Gx, Gy ベースポイントのx座標, y座標
n Gの位数

鍵生成

Q = dG を計算して、署名鍵と検証鍵を生成します.
署名鍵: d
検証鍵: G

署名

  1.  \lbrack 1, n-1 \rbrack の乱数kを選ぶ
  2. kG = (x_1, y_1)から、r = x_1\pmod n を計算します
    r = 0 の場合、乱数を取り直して、再度 r を計算します
  3. e = Hash(m)
  4. s = k^{-1} (e+dr)\pmod n を計算する
  5. (r, s) がmに対する署名となる

検証

  1. r, s が  \lbrack 1, n-1 \rbrackの範囲でなければ、失敗とする
  2. e = Hash(m)
  3. w = s^{-1}\pmod n
  4. u_1=ew\pmod n,  u_2=rw\pmod n を計算する
  5. u_1G + u_2Q = X = (x_1, y_1)
  6. v = x_1 \pmod n
  7. v = r の場合、署名の検証に成功