Logo

Nola's Backyard

🧠DSAを完全に理解する

DSAを完全に理解します。

Note

ざっくり、ElGamal署名 -> DSA -> ECDSAという流れらしい。
大雑把にはどれも形は同じで「どの群の上で考えるか」が違う。

# DSAの概要

署名者 A と検証者 B の間のやり取りを考える。

  1. 素数 p,qp,q と g∈Fpg\in\mathbb{F}_{p} を固定し、A と B で共有する
q∣p−1,gq≡1 mod p q\mid p-1,\quad g^{q}\equiv 1\bmod{p}
  1. A 秘密鍵 x∈{1,…,q−1}x\in\{1,\dots,q-1\} を決め、公開鍵 yy を共有する
y≡gx(modp) y\equiv g^x\pmod p
  1. A はメッセージ mm に署名 (r,s)(r,s) を作り、B に送る
k∈{1,…,q−1},r=(gk mod p) mod q,s≡k−1(H(m)+xr)(modq) \begin{aligned} k&\in\{1,\dots,q-1\}, \\ r&=(g^k\bmod p)\bmod q, \\ s&\equiv k^{-1}(H(m)+xr)\pmod q \end{aligned}
Note

r=0r=0 または s=0s=0 の場合、この後に困るので、nonce kk を選び直す。

  1. B は (r,s)(r,s) を検証する
w≡s−1(modq)u1≡H(m)w(modq)u2≡rw(modq)v=(gu1yu2 mod p) mod q \begin{aligned} w&\equiv s^{-1}\pmod q \\ u_1&\equiv H(m)w\pmod q \\ u_2&\equiv rw\pmod q \\ v&=(g^{u_1}y^{u_2}\bmod p)\bmod q \end{aligned}

v=rv=r なら正しい署名

#  mod p\bmod p と  mod q\bmod q の2つを考えている理由

 mod p\bmod p の上にあるのは公開情報である y,gy,g のみで、ほかは全て  mod q\bmod q の上で考えている。

大雑把には、

  • 安全性のために公開情報は大きな値で ( mod p\bmod p で) 扱う
  • 通信量軽減のために署名は小さな値で ( mod q\bmod q で) 扱う

ということらしい。

Note

実際は pp は2048bit、qq は224bitみたいな想定。


もう少し構造的には、qq は「指数側の世界」のサイズ。

秘密鍵 xx や nonce kk は gg の指数として使われるため、⟨g⟩\langle g\rangle の位数である qq を法として考えればよい。

一方で、実際の公開値 y=gxy=g^{x} や gkg^{k} は Fp×\mathbb{F}_{p}^{\times} の元として計算される。

# 検証の整合性を見る

  1. (r,s)(r,s) は公開鍵 yy に対応する秘密鍵で作られた ⟹v=r\Longrightarrow v=r (必要性)
  2. 秘密鍵を知らずに v=rv=r となる (r,s)(r,s) を作るのは難しい (擬似的な十分性)

が必要。

# 1を確かめる

ss の定義から、Fq\mathbb{F}_{q} において、

k=s−1(H(m)+xr)=wH(m)+wxr=u1+u2x \begin{align*} k=&s^{-1}(H(m)+xr)\\ =&wH(m)+wxr\\ =&u_{1}+u_{2}x \end{align*}

が成り立ち、したがって

v=(gu1yu2 mod p) mod q=(gu1+u2x mod p) mod q=(gk mod p) mod q=r \begin{align*} v=&(g^{u_{1}}y^{u_{2}}\bmod p)\bmod q\\ =&(g^{u_{1}+u_{2}x}\bmod p)\bmod q\\ =&(g^{k}\bmod p)\bmod q\\ =& r \end{align*}

# 2について

これは色々な根拠が複合的に為すもの。この続きで頑張って理解したい。

# kk を毎回ランダムに選ぶ理由

kk は秘密鍵 xx を守るためのもの。

  1. 例えば kk が既知だった場合、固定値 k=1k=1 を考えると、
s≡H(m)+xr(modq) s\equiv H(m)+xr\pmod q

となるため、

x≡(s−H(m))r−1(modq) x\equiv (s-H(m))r^{-1}\pmod q

より、1つの署名から xx が求まってしまう。

  1. 同じ kk を2度使った場合、メッセージ m1,m2m_{1},m_{2} に対する署名をそれぞれ (r,s1),(r,s2)(r,s_{1}),(r,s_{2}) とする。
Hint

r=(gk mod p) mod qr=(g^k\bmod p)\bmod q であったから、同じ kk を使うと rr も同じになる。

このとき、

s1≡k−1(H(m1)+xr)(modq)s2≡k−1(H(m2)+xr)(modq) \begin{align*} s_{1}&\equiv k^{-1}(H(m_{1})+xr)\pmod q\\ s_{2}&\equiv k^{-1}(H(m_{2})+xr)\pmod q \end{align*}

である。辺々を引くと xx が消えて、

s1−s2≡k−1(H(m1)−H(m2))(modq) s_{1}-s_{2}\equiv k^{-1}(H(m_{1})-H(m_{2}))\pmod q

したがって、

k≡(H(m1)−H(m2))(s1−s2)−1(modq) k\equiv (H(m_{1})-H(m_{2}))(s_{1}-s_{2})^{-1}\pmod q

となり、

x≡(s1k−H(m1))r−1(modq) x\equiv (s_{1}k-H(m_{1}))r^{-1}\pmod q

より、秘密鍵 xx も求まってしまう。線形代数って怖い!


以上のように、kk は秘密鍵 xx を隠すために使われている。

公開される r=(gk mod p) mod qr=(g^{k}\bmod p)\bmod q から kk を求めることは、DLPに関係するため難しい。

また、kk が未知で毎回異なるため、

s≡k−1(H(m)+xr)(modq) s\equiv k^{-1}(H(m)+xr)\pmod q

から xx を直接求めることもできない。

# q∣p−1q\mid p-1 ってなんのための制約?

DSAでは、Fp×\mathbb{F}_{p}^{\times} の中に位数 qq の部分群 ⟨g⟩\langle g\rangle を作りたい。

Note

これまで見ていたように、gg の指数の中で色々な計算を考えるため。

ラグランジュの定理より、部分群の位数は群の位数を割り切る必要がある。すなわち、

∣Fp×∣=p−1 |\mathbb{F}_{p}^{\times}|=p-1

なので、位数 qq の部分群を持つために

q∣p−1 q\mid p-1

が必要になる。逆に、コーシーの定理より、qq が ∣Fp×∣|\mathbb{F}_{p}^{\times}| を割り切るなら、位数 qq の元が存在する。

DR;TL

実際、適当な h∈Fp×h\in\mathbb{F}_{p}^{\times} を選んで、

g≡h(p−1)/q(modp) g\equiv h^{(p-1)/q}\pmod p

とすれば、

gq≡hp−1≡1(modp) g^{q}\equiv h^{p-1}\equiv 1\pmod p

となる。

したがって、gg の位数は qq の約数である。g≠1g\neq1 なら、qq は素数なので

ord(g)=q ord(g)=q

となる。

この部分群の生成元を gg とすると、

gq≡1(modp) g^{q}\equiv 1\pmod p

であり、gg の指数は  mod q\bmod q で考えられる。

これにより、公開計算は大きな Fp\mathbb{F}_{p} 上で行いながら、秘密鍵 xx や nonce kk は小さな Fq\mathbb{F}_{q} 上で扱える。