はじめに
この記事では前回の記事 [12] に続いてECDSA署名を行うシグマプロトコルであるZKAttest([1]ZKAttest: Ring and Group Signatures for Existing ECDSA Keys)について解説します。
楕円曲線とその群
楕円曲線とはy2=x3+ax+b
と表される曲線のことです。
楕円曲線上の点は楕円加算と呼ばれる加算によって体を成します。

楕円加算。[7]より引用。

楕円加算の図。[7]より引用。
ZKAttestではまず素数
p
の剰余体
Fp
上で定義される標準的な楕円曲線
E/Fp:y2=x3−3x+b
に対応する群を
GNIST=E(Fp)
と表し、この群をECDSA署名に利用します。
しかし群の位数
#GNIST
は素数
p
とは異なるため、
Fp
上では演算を行うことができず、
GNIST
上の座標のコミットメント同士の関係を調べることはできません。そのため任意の位数の群に対応する楕円曲線を計算するBröker[4]の方法を用いて位数が
p
となるような楕円曲線
E′/Fq
を求め、対応する群
GTom
を定めます。これらの群
GNIST,GTom
で定義されるPedersen commitment[2]
ComNIST,ComTom
を証明に利用します。生成元
g
、ランダムに生成した値
r
による
x
のPedersen commitmentを
Com(x;r)=xg+rh
と表します。
ZKAttestの知識証明の手順
ここではZKAttestの知識証明の手順について解説します。加算、スカラー乗算についての知識証明について述べそれらを用いてECDSA署名の知識証明の手順を示します。スカラー乗算の知識証明が最も本質的です。
加算の知識証明
ここでは群GNIST
上の無限遠点以外の元a,b,t
についてそれらの座標をax,ay,bx,by,tx,ty
とし、これらの値を明かさずにこれらの値がa+b=t
を満たすことを示すことが目標です。ax,ay,bx,by,tx,ty
のコミットメントをそれぞれC1,...,C6
とします。ax,ay,bx,by,tx,ty
はGNIST
の座標の値なのでこのコミットメントはComTom
を用いることに注意して下さい。
a+b=t
の証明にはa,b,t
が無限遠点でないことに注意すると(ax−bx=0∧t=a+b)∨(ax=bx∧ay=by∧t=2a)
を示せば十分です。ここで
- シグマプロトコルで行える知識証明は
∧,∨
の演算について閉じていること
- 同一の体上の加算や乗算の知識証明は既存の方法[10]によって証明できるので逆元を用いることで加算乗除の演算が証明できること
=0
の証明は逆元を求めてその積が1
になることを示し、逆元の存在を証明することによって行えること
に注意するとax=bx∧ay=by∧t=2a
とax−bx=0
は証明可能です。したがってあとはa+b=t
を示せば良いことになります。
a+b=t
の証明には[11]によると
tx=(bx−axby−ay)2−ax−bx,ty=(bx−axby−ay)(bx−tx)−ay
を示せば十分です。
そのためにはC1,...,C6
から始めて順に
C7=ComTom(bx−ax)
C8=ComTom((bx−ax)−1)
C9=ComTom(by−ay)
C10=ComTom(bx−axby−ay)
C11=ComTom((bx−axby−ay)2)
C12=ComTom(bx−tx)
C13=ComTom((bx−axby−ay)(bx−tx))
それぞれの演算に対応する知識証明を行い、最終的に
C5=C11−C1−C3
,C6=C13C12−C2
に対応する演算の知識証明を行います。
以上の手順で加算の知識証明をシグマプロトコルによって行えます。
スカラー乗算の知識証明
上記で説明した加算の知識証明を利用します。
ここでは群GNIST
上の生成元g,h
と群GNIST
上の生成元g′,h′
、コミットメントC1=ComNIST(λ)(=λg+rh),C2′=ComTom(x),C3′=ComTom(y)
が証明者Pと検証者Vに共通して与えられた上で、群GNIST
上の元λ
と群GTom
上の元x,y
についてこれらの値を明かさずに(x,y)=λg
を満たすことを示すことが目標です。(「'」が付くものはGNIST
上の元であることを表します。)
知識証明の手順
以下のような3ラウンドのやり取りでシグマプロトコルを構成します。
- Pが
α,β1,β2,β3
をランダムに選び、(γ1,γ2)=αg
としてa1=αg+β1h,a2′=γ1g′+β2h′,a3=γ2g′+β3h′
を計算します。(α−λ)g
のx,y
座標のGTom
上のコミットメントをC4′,C5′
とした上で、a1,a2′,a3′,C4′,C5′
と(C2′,C3′)+(C4′,C5′)=(a2′,a3′)
であることを示すコミットメントX
(上で示した加算の知識証明を利用)を送ります。
- Vが1ビットの
c0
と加算の知識証明のためのチャレンジc1
からなるc=(c0,c1)
をチャレンジとしてPに送ります。
- チャレンジに応じてPが次のように返答を送ります。
c0=0
のとき
z1=α,z2=β1,z3=β2,z4=β3
として(z1,z2,z3,z4)
を送ります。
c0=1
のとき
z1=α−λ,z2=β1−r
(r
はC1=ComNIST(λ)
の計算に使用)、X
に対するチャレンジc1
の返答をπ
として(π,z1,z2)
を送ります。
Pの返答に応じてVは以下のようにPの証明を検証します。
c0=0
のとき
(z1,z2,z3,z4)=(α,β1,β2,β3)
を用いてa1,a2′,a3′
がαg,γ1,γ2
のコミットメントであることを確かめます。
c0=1
のとき
加算の知識証明によってX,c1,π
から(C2′,C3′)+(C4′,C5′)=(a2′,a3′)
が成り立つことを検証します。そしてz1g+z2h+C1=a1
が成り立つこととC4′,C5′
がz1g
のx,y
座標のコミットメントであることを確かめます。
シグマプロトコルであることの証明
以下このプロトコルがシグマプロトコルであることを示します。完全性(Pの証明が正しければVが証明が正しいと分かること)が成り立つことは容易に分かるのでSHVZKとSpecial soundnessが成り立つことを示します。
SHVZK
SHVZKは知識λ,x,y
がなくてもg,h,g′,h′
とランダムなc=(c0,c1)
が入力されるとVがプロトコルに従う場合のPとVのやり取りと確率的に区別できないやり取りを出力する「シミュレータ」を構成することで証明します。
c0=0
のとき
ランダムにα,β1,β2,β3
を選び実際の証明と同じようにa1=αg+β1h,a2′=γ1g′+β2h′,a3=γ2g′+β3h′
、(α−λ)g
のx,y
座標のGTom
上のコミットメントC4′,C5′
、加算の知識証明のコミットメントX
を計算し、実際の証明と同じようにやり取りを行います。
c0=1
のとき
z1,z2
をランダムに選んでa1
はa1=z1g+z2h+C1
、C4′,C5′
はz1g
のx,y
座標とします。加算の知識証明のコミットメントX
と返答π
は加算の知識証明のシミュレータ(シグマプロトコルであることから存在が保証される)を用いてチャレンジc1
から構成します。
以上のようにシミュレータを構成できました。
Special soundness
Special soundnessは同一のC1,C2′,C3′,a1,a2′,a3′,C4′,C5,X′
とVの異なるチャレンジに対する、Vが正しいと認める返答を入力すると知識λ,x,y
を出力する「エクストラクター」を構成することで証明します。Vのチャレンジc
はc0=0
の場合が1通り、c0=1
の場合がc1
を持つ2通りの合計3通りを与えます。
まずλ
はc0=0(z1=α)
とc0=1(z1=α−λ)
の場合のz1
の差を取ることで得られます。
さらに
c0=0,1
のときにそれぞれa2′,a3′
とC4′,C5′
がGTom
の元であることが確認でき、c0=1
のときに(C2′,C3′)+(C4′,C5′)=(a2′,a3′)
が成り立つことを確認できることからC2′,C3′
もGTom
の元であること
- ある
α
が存在してa2′,a3′
がαg+β1h
のコミットメントであること
c0=1
のときにz1g+z2h+C1=a1=αg+β1h
が成り立つこと
C2′,C3′
がc0=0,1
のときにz1g+t=αg
を満たすt
のx,y
座標のコミットメントであること(加算の知識証明のエクストラクターを用いる)
を確認できます。したがって(x,y)
の値をλg
として得ることができ、c0=1
のときにt=λg=(α−z1)g
およびC1=(α−z1)g+(β1−z2)h
が成り立つこと、つまりC1
がλg
のコミットメントであることを確認することができました。
ECDSA署名の知識証明
通常のECDSA署名は楕円曲線上の群を用いて
- 群の位数
n
、生成元g
- 秘密鍵
d
- 公開鍵
q=dg
- メッセージ
m
とそのハッシュ値t
R=(r,−)=kg
(k
はランダムに選ぶ)
s=k−1(t+rd)modn
に対して証明者が署名(r,s)
を送り、検証者がR=u1g+u2q(u1=ts−1,u2=rs−1)
を検証することによって行われます。
ZKAttestでは証明者が署名(R,z=sr−1)
を送り検証者がzR−tr−1g=q
を検証することによってECDSA署名を行います。この署名と検証に上で示した加法と乗法の知識証明を用いることでシグマプロトコルによってECDSA署名を実現できます。
詳細は元論文[1]を参照して下さい。
応用と実装
ZKAttestはリング署名、グループ署名、証明書が非失効であることの証明に応用できます。
またTypescriptを用いた具体的な実装がgithub上に公開されています。Webブラウザ上で動作し、10秒以内のメンバーシップの証明を最大数千のリストに対して行うことが可能だそうです。一回の証明の検証は一秒未満で実行できますが、健全性が保証されないので複数回実行することで補われます。
詳細は元論文[1]を参照して下さい。
まとめと感想
ZKAttestの具体的なプロトコルについてまとめました。紹介しきれなかった部分は元論文を参照して下さい。証明が複雑で誤植もあったので読むのが大変でした。理解しきれていない部分もあります。以下私の疑問点、理解不足の点を挙げます。
- Special Soundnessの証明でProverの返答を3つ用いているのは正しいのか?(元のSpecial Soundnessの定義では2つの返答を用いている[8]。)
- スカラー乗算の知識証明の1ラウンド目でProverが
α,β1,β2,β3
をランダムに選択しなかったときに不都合は生じないのか?Proverの不正は行われないのだろうか?
- ECDSA署名のリング署名への応用について理解できていない。
これらの疑問点に対する答えや間違いを見つけたら教えて下さい。
参考文献
[1]https://dl.acm.org/doi/abs/10.1007/978-3-030-99277-4_4
[2]https://doi.org/10.1007/3-540-46766-1_9
[3]https://www.w3.org/TR/webauthn-2/
[4]Bröker, R.: Constructing Elliptic Curves of Prescribed Order. Ph.D. thesis, Leiden (2006)
[5]https://doi.org/10.1007/3-540-48910-X_8
[6] https://doi.org/10.1007/978-3-662-46803-6_9
[7] IPUSIRON(2017). 暗号技術の全て, 翔泳社
[8] Damgard(2010). On Σ-protocols https://www.cs.au.dk/~ivan/Sigma.pdf
Goldwasser, S., Micali, S., & Rackoff, C. (1985). The Knowledge Complexity of Interactive Proof-Systems (Extended Abstract). STOC 1985.
[9] WebAuthn: https://developer.mozilla.org/ja/docs/Web/API/Web_Authentication_API#Registration
[10]https://doi.org/10.1007/3-540-48910-X_8
[11]https://doi.org/10.1007/978-0-387-09494-6_3
[12] https://tech.hashport.io/3356/