Loading [MathJax]/extensions/tex2jax.js

ZKAttest: 具体的なプロトコルについて

お知らせ
Table of Contents

はじめに

この記事では前回の記事 [12] に続いてECDSA署名を行うシグマプロトコルであるZKAttest([1]ZKAttest: Ring and Group Signatures for Existing ECDSA Keys)について解説します。

楕円曲線とその群

楕円曲線とはy2=x3+ax+by^2=x^3+ax+bと表される曲線のことです。
楕円曲線上の点は楕円加算と呼ばれる加算によって体を成します。

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


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


ZKAttestではまず素数ppの剰余体Fp\mathbb{F}_p上で定義される標準的な楕円曲線E/Fp:y2=x33x+bE/\mathbb{F}_p : y^2=x^3-3x+b に対応する群をGNIST=E(Fp)G_{NIST} = E(\mathbb{F}_p )と表し、この群をECDSA署名に利用します。
しかし群の位数#GNIST\#G_{NIST}は素数ppとは異なるため、Fp\mathbb{F}_p上では演算を行うことができず、GNISTG_{NIST}上の座標のコミットメント同士の関係を調べることはできません。そのため任意の位数の群に対応する楕円曲線を計算するBröker[4]の方法を用いて位数がppとなるような楕円曲線E/FqE'/\mathbb{F}_q を求め、対応する群GTomG_{Tom}を定めます。これらの群GNIST,GTomG_{NIST},G_{Tom}で定義されるPedersen commitment[2]ComNIST,ComTomCom_{NIST},Com_{Tom}を証明に利用します。生成元gg、ランダムに生成した値rrによるxxのPedersen commitmentをCom(x;r)=xg+rhCom(x;r) = xg+rhと表します。

ZKAttestの知識証明の手順

ここではZKAttestの知識証明の手順について解説します。加算、スカラー乗算についての知識証明について述べそれらを用いてECDSA署名の知識証明の手順を示します。スカラー乗算の知識証明が最も本質的です。

加算の知識証明

ここでは群GNISTG_{NIST}上の無限遠点以外の元a,b,ta,b,tについてそれらの座標をax,ay,bx,by,tx,tya_x,a_y,b_x, b_y, t_x, t_yとし、これらの値を明かさずにこれらの値がa+b=ta+b=tを満たすことを示すことが目標です。ax,ay,bx,by,tx,tya_x,a_y,b_x, b_y, t_x, t_yのコミットメントをそれぞれC1,...,C6C_1,...,C_6とします。ax,ay,bx,by,tx,tya_x,a_y,b_x, b_y, t_x, t_yGNISTG_{NIST}の座標の値なのでこのコミットメントはComTomCom_{Tom}を用いることに注意して下さい。

a+b=ta+b=tの証明にはa,b,ta,b,tが無限遠点でないことに注意すると(axbx0t=a+b)(ax=bxay=byt=2a)(a_x−b_x\neq 0∧t = a+b)∨(a_x = b_x∧a_y = b_y∧t = 2a)を示せば十分です。ここで

  • シグマプロトコルで行える知識証明は,∧,∨の演算について閉じていること
  • 同一の体上の加算や乗算の知識証明は既存の方法[10]によって証明できるので逆元を用いることで加算乗除の演算が証明できること
  • 0\neq 0の証明は逆元を求めてその積が11になることを示し、逆元の存在を証明することによって行えること

に注意するとax=bxay=byt=2aa_x = b_x∧a_y = b_y∧t = 2aaxbx0a_x−b_x\neq 0は証明可能です。したがってあとはa+b=ta+b=tを示せば良いことになります。

a+b=ta+b=tの証明には[11]によると
tx=(byaybxax)2axbx,ty=(byaybxax)(bxtx)ayt_x = (\frac{b_y -a_y}{b_x-a_x})^2-a_x-b_x,t_y = (\frac{b_y -a_y}{b_x-a_x})(b_x-t_x)-a_y
を示せば十分です。
そのためにはC1,...,C6C_1,...,C_6から始めて順に
C7=ComTom(bxax)C_7=Com_{Tom}(b_x-a_x)
C8=ComTom((bxax)1)C_8=Com_{Tom}((b_x-a_x)^{-1})
C9=ComTom(byay)C_9=Com_{Tom}(b_y-a_y)
C10=ComTom(byaybxax)C_{10}=Com_{Tom}(\frac{b_y-a_y}{b_x-a_x})
C11=ComTom((byaybxax)2)C_{11}=Com_{Tom}((\frac{b_y-a_y}{b_x-a_x})^2) C12=ComTom(bxtx)C_{12}=Com_{Tom}(b_x-t_x)
C13=ComTom((byaybxax)(bxtx))C_{13}=Com_{Tom}((\frac{b_y-a_y}{b_x-a_x})(b_x-t_x))
それぞれの演算に対応する知識証明を行い、最終的に
C5=C11C1C3C_5=C_{11}-C_1-C_3,C6=C13C12C2C_6=C_{13}C_{12}-C_2
に対応する演算の知識証明を行います。

以上の手順で加算の知識証明をシグマプロトコルによって行えます。

スカラー乗算の知識証明

上記で説明した加算の知識証明を利用します。
ここでは群GNISTG_{NIST}上の生成元g,hg,hと群GNISTG_{NIST}上の生成元g,hg',h'、コミットメントC1=ComNIST(λ)(=λg+rh),C2=ComTom(x),C3=ComTom(y)C_1=Com_{NIST}(\lambda )(= \lambda g+ rh), C_2'=Com_{Tom}(x), C_3'=Com_{Tom}(y)が証明者Pと検証者Vに共通して与えられた上で、群GNISTG_{NIST}上の元λ\lambdaと群GTomG_{Tom}上の元x,yx,yについてこれらの値を明かさずに(x,y)=λg(x,y)=\lambda gを満たすことを示すことが目標です。(「'」が付くものはGNISTG_{NIST}上の元であることを表します。)

知識証明の手順

以下のような3ラウンドのやり取りでシグマプロトコルを構成します。

  1. Pがα,β1,β2,β3\alpha, \beta_1, \beta_2, \beta_3をランダムに選び、(γ1,γ2)=αg(\gamma_1, \gamma_2)=\alpha gとしてa1=αg+β1h,a2=γ1g+β2h,a3=γ2g+β3ha_1=\alpha g+\beta_1 h, a_2'=\gamma_1 g'+\beta_2 h', a_3=\gamma_2 g'+\beta_3 h'を計算します。(αλ)g(\alpha -\lambda )gx,yx,y座標のGTomG_{Tom}上のコミットメントをC4,C5C_4',C_5'とした上で、a1,a2,a3,C4,C5a_1, a_2', a_3', C_4', C_5'(C2,C3)+(C4,C5)=(a2,a3)(C_2', C_3')+(C_4',C_5')=(a_2',a_3')であることを示すコミットメントXX(上で示した加算の知識証明を利用)を送ります。
  2. Vが1ビットのc0c_0と加算の知識証明のためのチャレンジc1c_1からなるc=(c0,c1)c=(c_0, c_1)をチャレンジとしてPに送ります。
  3. チャレンジに応じてPが次のように返答を送ります。
    • c0=0c_0 = 0のとき
      z1=α,z2=β1,z3=β2,z4=β3z_1=\alpha, z_2=\beta_1, z_3=\beta_2, z_4=\beta_3として(z1,z2,z3,z4)(z_1, z_2, z_3, z_4)を送ります。
    • c0=1c_0 = 1のとき
      z1=αλ,z2=β1rz_1=\alpha -\lambda, z_2=\beta_1 -rrrC1=ComNIST(λ)C_1=Com_{NIST}(\lambda )の計算に使用)、XXに対するチャレンジc1c_1の返答をπ\piとして(π,z1,z2)(\pi, z_1,z_2)を送ります。

Pの返答に応じてVは以下のようにPの証明を検証します。

  • c0=0c_0 = 0のとき
    (z1,z2,z3,z4)=(α,β1,β2,β3)(z_1, z_2, z_3, z_4)=(\alpha, \beta_1, \beta_2, \beta_3)を用いてa1,a2,a3a_1, a_2',a_3'αg,γ1,γ2\alpha g, \gamma_1, \gamma_2のコミットメントであることを確かめます。
  • c0=1c_0 = 1のとき
    加算の知識証明によってX,c1,πX, c_1, \piから(C2,C3)+(C4,C5)=(a2,a3)(C_2', C_3')+(C_4',C_5')=(a_2',a_3')が成り立つことを検証します。そしてz1g+z2h+C1=a1z_1 g+ z_2 h+C_1 = a_1が成り立つこととC4,C5C_4',C_5'z1gz_1 gx,yx,y座標のコミットメントであることを確かめます。

シグマプロトコルであることの証明

以下このプロトコルがシグマプロトコルであることを示します。完全性(Pの証明が正しければVが証明が正しいと分かること)が成り立つことは容易に分かるのでSHVZKとSpecial soundnessが成り立つことを示します。

SHVZK

SHVZKは知識λ,x,y\lambda ,x, yがなくてもg,h,g,hg,h,g',h'とランダムなc=(c0,c1)c=(c_0, c_1)が入力されるとVがプロトコルに従う場合のPとVのやり取りと確率的に区別できないやり取りを出力する「シミュレータ」を構成することで証明します。

  • c0=0c_0 = 0のとき
    ランダムにα,β1,β2,β3\alpha, \beta_1, \beta_2, \beta_3を選び実際の証明と同じようにa1=αg+β1h,a2=γ1g+β2h,a3=γ2g+β3ha_1=\alpha g+\beta_1 h, a_2'=\gamma_1 g'+\beta_2 h', a_3=\gamma_2 g'+\beta_3 h'(αλ)g(\alpha -\lambda )gx,yx,y座標のGTomG_{Tom}上のコミットメントC4,C5C_4',C_5'、加算の知識証明のコミットメントXXを計算し、実際の証明と同じようにやり取りを行います。
  • c0=1c_0 = 1のとき
    z1,z2z_1, z_2をランダムに選んでa1a_1a1=z1g+z2h+C1a_1 = z_1 g+ z_2 h+C_1C4,C5C_4',C_5'z1gz_1 gx,yx,y座標とします。加算の知識証明のコミットメントXXと返答π\piは加算の知識証明のシミュレータ(シグマプロトコルであることから存在が保証される)を用いてチャレンジc1c_1から構成します。

以上のようにシミュレータを構成できました。

Special soundness

Special soundnessは同一のC1,C2,C3,a1,a2,a3,C4,C5,XC_1,C_2',C_3',a_1, a_2', a_3', C_4', C_5, X'とVの異なるチャレンジに対する、Vが正しいと認める返答を入力すると知識λ,x,y\lambda ,x, yを出力する「エクストラクター」を構成することで証明します。Vのチャレンジccc0=0c_0=0の場合が1通り、c0=1c_0=1の場合がc1c_1を持つ2通りの合計3通りを与えます。
まずλ\lambdac0=0(z1=α)c_0=0 (z_1=\alpha)c0=1(z1=αλ)c_0=1 (z_1=\alpha-\lambda)の場合のz1z_1の差を取ることで得られます。
さらに

  • c0=0,1c_0=0,1のときにそれぞれa2,a3a_2',a_3'C4,C5C_4',C_5'GTomG_{Tom}の元であることが確認でき、c0=1c_0=1のときに(C2,C3)+(C4,C5)=(a2,a3)(C_2', C_3')+(C_4',C_5')=(a_2',a_3')が成り立つことを確認できることからC2,C3C_2',C_3'GTomG_{Tom}の元であること
  • あるα\alphaが存在してa2,a3a_2',a_3'αg+β1h\alpha g+ \beta_1 hのコミットメントであること
  • c0=1c_0=1のときにz1g+z2h+C1=a1=αg+β1hz_1 g+z_2 h+C_1=a_1 =\alpha g + \beta_1 hが成り立つこと
  • C2,C3C_2',C_3'c0=0,1c_0=0,1のときにz1g+t=αgz_1 g+ t = \alpha gを満たすttx,yx,y座標のコミットメントであること(加算の知識証明のエクストラクターを用いる)

を確認できます。したがって(x,y)(x,y)の値をλg\lambda gとして得ることができ、c0=1c_0=1のときにt=λg=(αz1)gt=\lambda g =(\alpha -z_1)gおよびC1=(αz1)g+(β1z2)hC_1=(\alpha -z_1)g+(\beta_1 -z_2)hが成り立つこと、つまりC1C_1λg\lambda gのコミットメントであることを確認することができました。

ECDSA署名の知識証明

通常のECDSA署名は楕円曲線上の群を用いて

  • 群の位数nn、生成元gg
  • 秘密鍵dd
  • 公開鍵q=dgq=dg
  • メッセージmmとそのハッシュ値tt
  • R=(r,)=kgR=(r,-)=kg(kkはランダムに選ぶ)
  • s=k1(t+rd)  mod  ns=k^{-1}(t+rd)\;mod\;n

に対して証明者が署名(r,s)(r,s)を送り、検証者がR=u1g+u2q(u1=ts1,u2=rs1)R=u_1g+u_2q(u_1=ts^{-1}, u_2=rs^{-1})を検証することによって行われます。
ZKAttestでは証明者が署名(R,z=sr1)(R,z=sr^{-1})を送り検証者がzRtr1g=qzR-tr^{-1}g=qを検証することによってECDSA署名を行います。この署名と検証に上で示した加法と乗法の知識証明を用いることでシグマプロトコルによってECDSA署名を実現できます。
詳細は元論文[1]を参照して下さい。

応用と実装

ZKAttestはリング署名、グループ署名、証明書が非失効であることの証明に応用できます。
またTypescriptを用いた具体的な実装がgithub上に公開されています。Webブラウザ上で動作し、10秒以内のメンバーシップの証明を最大数千のリストに対して行うことが可能だそうです。一回の証明の検証は一秒未満で実行できますが、健全性が保証されないので複数回実行することで補われます。
詳細は元論文[1]を参照して下さい。

まとめと感想

ZKAttestの具体的なプロトコルについてまとめました。紹介しきれなかった部分は元論文を参照して下さい。証明が複雑で誤植もあったので読むのが大変でした。理解しきれていない部分もあります。以下私の疑問点、理解不足の点を挙げます。

  • Special Soundnessの証明でProverの返答を3つ用いているのは正しいのか?(元のSpecial Soundnessの定義では2つの返答を用いている[8]。)
  • スカラー乗算の知識証明の1ラウンド目でProverがα,β1,β2,β3\alpha, \beta_1, \beta_2, \beta_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/

タイトルとURLをコピーしました