署名アルゴリズム
代表的な公開鍵暗号を用いたディジタル署名アルゴリズムを示す.
RSA署名
素因数分解問題の難しさを利用した署名である(→ RSA 暗号).
- 鍵
- 秘密鍵: $d$ (または,$p$,$q$), $p$,$q$ は素数
$n = pq$, $λ(n) = \mathrm{lcm} (p-1, q-1)$
$e \in Z_{λ(n)}$ $(\gcd (e, λ(n)) = 1)$
$d = 1/e \bmod λ(n)$
- 公開鍵: $e$,$n\ (n = pq)$
- 署名生成
署名対象データ $m$ と秘密鍵 $d$ より,署名 $s$ を生成する.
\[ s = \mathrm{H}(m)^d \bmod n \]
ここで,$\mathrm{H}$ はハッシュ関数である.
- 署名検証
署名対象データ $m$,署名 $s$ および公開鍵 $e$ より,署名の正当性を以下の関係が成立するか否かで判定する.
\[ \mathrm{H}(m) = s^e \bmod n \]
DSA署名
米国の連邦標準技術局(NIST)により提案されたディジタル署名標準(DSS)である (FIPS PUB 186-3).
ECDSA署名
DSA署名の楕円曲線版である.
- 鍵
- 秘密鍵: $x$ (整数)
- 公開鍵: $P$ (楕円曲線上の点)
楕円曲線上の点のスカラー倍演算 $P = x G$ により求める.
- システムパラメータ:$E$, $G$, $n=\#G$
楕円曲線 $E$ (楕円曲線を定義するパラメータ)
楕円曲線上のベースポイント $G$ とその位数 $n$
- 署名生成
署名対象データ $m$ より,署名 $(r, s)$ を生成する.
$R = (r, r') = k G$ ($k \in Z_n$:乱数)
$s = k^{-1}(\mathrm{H}(m) + xr) \bmod n$
ここで,$\mathrm{H}$ は ハッシュ関数である.
- 署名検証
署名対象データ $m$,署名 $(r, s)$ および公開鍵 $P$ より,署名が正しいか否かを判定する.
$(x, y) = (\mathrm{H}(m)s^{-1} \bmod n) G + (r s^{-1} \bmod n) P$
$x = r$ ならば,署名は有効
Schnorr 署名
離散対数問題の難しさを利用した署名である.
- 鍵
- システムパラメータ:$p$,$q$,$g$
素数 $p$,$q\ (q|p-1)$
乗法群 ${Z_p}^*$ での位数が $q$ となる $g$
- 秘密鍵: $x \in Z_q$
- 公開鍵: $y$
$y = g^x \bmod p$
- 署名生成
署名対象データ $m$ より,署名 $(e, s)$ を生成する.
乱数 $r \in Z_q$
$e = \mathrm{H} (g^r \bmod p, m)$
$s = (r + xe) \bmod q$
ここで,$\mathrm{H} ( , )$ は ハッシュ関数である.
- 署名検証
$e' = \mathrm{H} (g^s y^e \bmod p, m)$
$e' = e$ ならば,署名は有効
ECAO署名
ECAO(Elliptic Curve Abe-Okamoto signature)は,1999年に NTT が開発した安全性の高さが数学的に証明された楕円曲線上の離散対数問題に基づくメッセージ回復型ディジタル署名である.
- システムパラメータ
- 体 $K$ 上の楕円曲線: $E(K)$
- ベースポイント: $G \in E(K)$
- $G$ の位数:$n$
- ハッシュ関数 $(k + t \ge n)$
$\mathrm{H_1}$:$\{0,1\}^t \rightarrow \{0,1\}^k$
$\mathrm{H_2}$:$\{0,1\}^k \rightarrow \{0,1\}^t$
$\mathrm{H}$ :$\{0,1\}^{k + t} \rightarrow \{0,1\}^n$
- 鍵生成
- 秘密鍵: $x\ (x \in {Z_n}^*)$
- 公開鍵: $P\ (P = x G)$
- 署名生成
メッセージ $m$ (長さ $t$)に対して署名 $s$ を以下のように生成する.
- 乱数 $r \in Z_n$ を生成する.
- $m' = \mathrm{H_1}(m) || (\mathrm{H_2}(\mathrm{H_1}(m)) \oplus m)$ を計算する ($\oplus$ は XOR).
- $r G = (r_x, r_y)$
- $u = r_x \oplus m',e = \mathrm{H}(u),v = (r - ex) \bmod n$
- $s = (u, v)$ を署名とする.
- 署名検証
メッセージ $m$,署名 $s$ および公開鍵 $P$ を与えて,署名が正しいか否かを判定する.
- $e = \mathrm{H}(u),m' = u \oplus (vG + eP)_x$
- $m = [m']_t \oplus \mathrm{H_2}([m']^k)$ を計算する.
ここで,$[a]_b$ は $a$ の最下位 $b$ ビット,$[a]^b$ は $a$ の最上位 $b$ ビットを示す.
- $[m']^k = \mathrm{H_1}(m)$ ならば署名は有効