DSAを完全に理解します。
Note
ざっくり、ElGamal署名 -> DSA -> ECDSAという流れらしい。
大雑把にはどれも形は同じで「どの群の上で考えるか」が違う。
署名者 A と検証者 B の間のやり取りを考える。
- 素数 p,q と g∈Fp を固定し、
A と B で共有する
q∣p−1,gq≡1modp
A 秘密鍵 x∈{1,…,q−1} を決め、公開鍵 y を共有する
y≡gx(modp)
A はメッセージ m に署名 (r,s) を作り、B に送る
krs∈{1,…,q−1},=(gkmodp)modq,≡k−1(H(m)+xr)(modq)
Note
r=0 または s=0 の場合、この後に困るので、nonce k を選び直す。
B は (r,s) を検証する
wu1u2v≡s−1(modq)≡H(m)w(modq)≡rw(modq)=(gu1yu2modp)modqv=r なら正しい署名
modp と modq の2つを考えている理由
modp の上にあるのは公開情報である y,g のみで、ほかは全て modq の上で考えている。
大雑把には、
- 安全性のために公開情報は大きな値で (modp で) 扱う
- 通信量軽減のために署名は小さな値で (modq で) 扱う
ということらしい。
Note
実際は p は2048bit、q は224bitみたいな想定。
もう少し構造的には、q は「指数側の世界」のサイズ。
秘密鍵 x や nonce k は g の指数として使われるため、⟨g⟩ の位数である q を法として考えればよい。
一方で、実際の公開値 y=gx や gk は Fp× の元として計算される。
検証の整合性を見る
- (r,s) は公開鍵 y に対応する秘密鍵で作られた ⟹v=r (必要性)
- 秘密鍵を知らずに v=r となる (r,s) を作るのは難しい (擬似的な十分性)
が必要。
1を確かめる
s の定義から、Fq において、
k===s−1(H(m)+xr)wH(m)+wxru1+u2xが成り立ち、したがって
v====(gu1yu2modp)modq(gu1+u2xmodp)modq(gkmodp)modqr 2について
これは色々な根拠が複合的に為すもの。この続きで頑張って理解したい。
k を毎回ランダムに選ぶ理由
k は秘密鍵 x を守るためのもの。
- 例えば k が既知だった場合、固定値 k=1 を考えると、
s≡H(m)+xr(modq)となるため、
x≡(s−H(m))r−1(modq)より、1つの署名から x が求まってしまう。
- 同じ k を2度使った場合、メッセージ m1,m2 に対する署名をそれぞれ (r,s1),(r,s2) とする。
Hint
r=(gkmodp)modq であったから、同じ k を使うと r も同じになる。
このとき、
s1s2≡k−1(H(m1)+xr)(modq)≡k−1(H(m2)+xr)(modq)である。辺々を引くと x が消えて、
s1−s2≡k−1(H(m1)−H(m2))(modq)したがって、
k≡(H(m1)−H(m2))(s1−s2)−1(modq)となり、
x≡(s1k−H(m1))r−1(modq)より、秘密鍵 x も求まってしまう。線形代数って怖い!
以上のように、k は秘密鍵 x を隠すために使われている。
公開される r=(gkmodp)modq から k を求めることは、DLPに関係するため難しい。
また、k が未知で毎回異なるため、
s≡k−1(H(m)+xr)(modq)から x を直接求めることもできない。
q∣p−1 ってなんのための制約?
DSAでは、Fp× の中に位数 q の部分群 ⟨g⟩ を作りたい。
Note
これまで見ていたように、g の指数の中で色々な計算を考えるため。
ラグランジュの定理より、部分群の位数は群の位数を割り切る必要がある。すなわち、
∣Fp×∣=p−1なので、位数 q の部分群を持つために
が必要になる。逆に、コーシーの定理より、q が ∣Fp×∣ を割り切るなら、位数 q の元が存在する。
DR;TL
実際、適当な h∈Fp× を選んで、
g≡h(p−1)/q(modp)とすれば、
gq≡hp−1≡1(modp)となる。
したがって、g の位数は q の約数である。g=1 なら、q は素数なので
ord(g)=qとなる。
この部分群の生成元を g とすると、
gq≡1(modp)であり、g の指数は modq で考えられる。
これにより、公開計算は大きな Fp 上で行いながら、秘密鍵 x や nonce k は小さな Fq 上で扱える。