来自于Cloudflare和Cornell Tech的Armando Faz-Hern´andez等人,2021年论文《ZKAttest: Ring and Group Signatures for existing ECDSA keys》。
代码实现有:
在该代码实际实现时,采用的Groth–Kohlweiss membership Proof算法来自于 Groth和Kohlweiss 2015年论文《One-out-of-Many Proofs: Or How to Leak a Secret and Spend a Coin》,详细可参看博客:
加密密钥越来越多地存储在专用硬件或软件接口后面。这样做会限制访问,例如只允许通过ECDSA进行签名。若想将该key用于环签名或群签名,现有接口无法满足相应的要求。
本文提供了一种 ∑ \sum ∑-protocol,可使用committed public key来验证对某一消息的ECDSA签名或Schnorr签名,而不需要reveal该public key。基于该协议,结合Groth–Kohlweiss membership proof,可派生出在无法访问私钥的情况下,进行环签名的机制。
某公司内的泄密者可采用包含该公司内所有成员的环签名方式来泄露秘密文件,这样既可证明泄密者确实属于该公司,同时又保证匿名性。
Web Authentication: An API for accessing Public Key Credentials - Level 2.,为当前流行的硬件验证器标准,仅支持通过标准化算法(如ECDSA)对消息进行签名。这些签名和显示公钥真实性的证书链揭示了在执行认证时使用了哪个验证器,从而在认证信任度与隐私之间进行了权衡。更改此类模块的安装基础以增强隐私(如支持现有的环签名方案),将需要数年的时间。因此,有必要利用现有的key来增强WebAuthn认证的隐私性:这是ZKAttest的主要目标。
ZKAttest的核心primitive为:
Verifier可在不知道public key的情况下,通过该proof验证签名的有效性。ZKP中commitment的hiding属性可实现相应的功能。如, C C C为a commitment to a value on a public list of keys,从而生成环签名。
环签名(ring signature)是一种数字签名方案,最初由Rivest等人提出,环签名是一种简化的群签名,环签名中只有环成员没有管理者,不需要环成员间的合作。环签名是一个能够实现签名者无条件匿名的签名方案。ring signature背景知识可参看博客 隐私交易基本原则 第3和第4节内容。
环签名中包含3个算法:
理想情况下,即使ring中所有member的私钥都被暴露了,也无法根据签名判断出具体是谁签的。同时环签名还具有不可伪造性(没有私钥不能伪造一个合法的环签名)。
ZKAttest中,采用2个不同的曲线来实现,分别从2条曲线上取point:【实际可选two-cycle曲线】
将Pedersen commitment to x x x with randomness r r r表示为: C o m ( x ; r ) = x g + r h Com(x;r)=xg+rh Com(x;r)=xg+rh。
Pedersen commitment具有如下属性:
∑ \sum ∑-protocol基本概念可参看:基于Sigma protocol实现的零知识证明protocol集锦。
∑ \sum ∑-protocol为3-round protocol,满足:
∑ \sum ∑-protocol具有并行可组合型,可同时证明a common set of commitments的多个属性,不需要为每个属性单独生成一个proof。如已知commitments C 1 = x g + r 1 h , C 2 = y g + r 2 h C_1=xg+r_1h, C_2=yg+r_2h C1=xg+r1h,C2=yg+r2h,可用 ∑ \sum ∑-protocol来证明 commitment C 3 C_3 C3为a commitment to x + y x+y x+y, x − y x-y x−y, x y xy xy, x / y x/y x/y。
∑ \sum ∑-protocol可用于证明2个statements同时正确,或者证明2者之一是正确的。
借助Fiat-Shamir可将 ∑ \sum ∑-protocol转换为non-interactive zero-knowledge proof (NIZK)。
ZKAttest中,采用2个不同的曲线来实现,分别从2条曲线上取point:【实际可选two-cycle曲线】
E / F p : y 2 = x 3 − 3 x + b E/\mathbb{F}_p: y^2=x^3-3x+b E/Fp:y2=x3−3x+b,对应prime order group G N I S T = E ( F p ) G_{NIST}=E(\mathbb{F}_p) GNIST=E(Fp)。其中 p p p为prime。
为了证明relations among commitments to values in F p \mathbb{F}_p Fp,(如,commitments of the coordinates of a point),更适于在order 为 p p p的group内进行操作。如果所使用的group order不为 p p p,为了证明knowledge of openings of C 1 , C 2 , C 3 C_1,C_2,C_3 C1,C2,C3 to x , y , x y m o d p x,y,xy\mod p x,y,xymodp,需要该group的size不少于 p 2 p^2 p2,然后证明knowledge of C 4 C_4 C4 opening to x y xy xy over the integers,然后再证明存在不大于 p p p的number r r r,使得 t = x y − r p t=xy-rp t=xy−rp成立。这中间还额外需要range proof以及很多辅助commitments。此外,整个过程中也没法利用commitment的加法同态属性。
根据Br¨oker 1979年论文《CONSTRUCTING ELLIPTIC CURVES OF PRESCRIBED ORDER》中的方法生成指定order的曲线,本文称为Tom curves。
E ′ / F q : y 2 = x 3 + a 4 x + a 6 E'/\mathbb{F}_q: y^2=x^3+a_4x+a_6 E′/Fq:y2=x3+a4x+a6,对应prime order group G T O M = E ′ ( F q ) = p G_{TOM}=E'(\mathbb{F}_q)=p GTOM=E′(Fq)=p。其中 q q q为prime。
使用 C o m T o m Com_{Tom} ComTom和 C o m N I S T Com_{NIST} ComNIST来区分不同曲线上的commitment。
令 a , b , t a,b,t a,b,t为 G I N S T G_{INST} GINST上的points,相应的坐标为 a x , a y , b x , b y , t x , t y a_x,a_y,b_x,b_y,t_x,t_y ax,ay,bx,by,tx,ty。对应各坐标的commitments为 C 1 = C o m T o m ( a x ) , C 2 = C o m T o m ( a y ) , C 3 = C o m T o m ( b x ) , C 4 = C o m T o m ( b y ) , C 5 = C o m T o m ( t x ) , C 6 = C o m T o m ( t y ) C_1=Com_{Tom}(a_x),C_2=Com_{Tom}(a_y),C_3=Com_{Tom}(b_x),C_4=Com_{Tom}(b_y),C_5=Com_{Tom}(t_x),C_6=Com_{Tom}(t_y) C1=ComTom(ax),C2=ComTom(ay),C3=ComTom(bx),C4=ComTom(by),C5=ComTom(tx),C6=ComTom(ty)。
需证明relation a + b = t a+b=t a+b=t。
本文针对的应用场景中,必须忽略 a = b , a = − b a=b,a=-b a=b,a=−b(即 a x = b x a_x=b_x ax=bx)等特殊情况,只针对如下情况:
当 a x ≠ b x a_x\neq b_x ax=bx时,可采用Silverman 书本《The Arithmetic of Elliptic Curves》第三章“The geometry of elliptic curves” 中的Group Law Algorithm 2.3 中的affine addition公式,有:
t x = ( b y − a y b x − a x ) 2 − a x − b x , t y = ( b y − a y b x − a x ) ( b x − t x ) − a y t_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 tx=(bx−axby−ay)2−ax−bx,ty=(bx−axby−ay)(bx−tx)−ay
为了证明 a + b = t a+b=t a+b=t,Prover需计算如下辅助commitments:
C 7 = C o m T o m ( b x − a x ) C_7=Com_{Tom}(b_x-a_x) C7=ComTom(bx−ax), C 8 = C o m T o m ( b x − a x ) − 1 C_8=Com_{Tom}(b_x-a_x)^{-1} C8=ComTom(bx−ax)−1
C 9 = C o m T o m ( b y − a y ) C_9=Com_{Tom}(b_y-a_y) C9=ComTom(by−ay)
C 10 = C o m T o m ( b y − a y b x − a x ) C_{10}=Com_{Tom}(\frac{b_y-a_y}{b_x-a_x}) C10=ComTom(bx−axby−ay), C 11 = C o m T o m ( ( b y − a y b x − a x ) 2 ) C_{11}=Com_{Tom}((\frac{b_y-a_y}{b_x-a_x})^2) C11=ComTom((bx−axby−ay)2)
C 12 = C o m T o m ( b x − t x ) C_{12}=Com_{Tom}(b_x-t_x) C12=ComTom(bx−tx), C 13 = C o m T o m ( ( b y − a y b x − a x ) ( b x − t x ) ) C_{13}=Com_{Tom}((\frac{b_y-a_y}{b_x-a_x})(b_x-t_x)) C13=ComTom((bx−axby−ay)(bx−tx))
然后可并行证明以上每个辅助commitment open to the proper value as a sum or product of previous one,最后有:
C 5 = C 11 − C 1 − C 3 , C 6 = C 13 C 12 − C 2 C_5=C_{11}-C_1-C_3, C_6=C_{13}C_{12}-C_2 C5=C11−C1−C3,C6=C13C12−C2
以上辅助证明可利用 Camenisch等人1999年论文《Proving in zero-knowledge that a number is the product of two safe primes》中现有算法来证明a correct multiplication or addition。
对于 C 8 = C 7 − 1 C_8=C_7^{-1} C8=C7−1的proof of proper inversion,可转为proof of multiplication C 8 C 7 = C o m T o m ( 1 ) C_8C_7=Com_{Tom}(1) C8C7=ComTom(1)。
以上proof未证明the points are on the curve,但是只要 a , b a,b a,b on curve,则 t t t肯定也on curve。
因为 ∞ \infin ∞无法在affine坐标系下表示,为了强化应用中不允许 a x = b x , a y ≠ b y a_x=b_x, a_y\neq b_y ax=bx,ay=by,可证明 a x − b x ≠ 0 a_x-b_x\neq 0 ax−bx=0,转为证明存在倒数 ( a x − b x ) − 1 (a_x-b_x)^{-1} (ax−bx)−1。
除此之外,还需要考虑 a = b a=b a=b的情况,此时为point doubling t = 2 a t=2a t=2a。
因此对于affine坐标系下的 t = a + b t=a+b t=a+b ∑ \sum ∑-protocol证明为:
( a x − b x ≠ 0 ∧ t = a + b ) ∨ ( a x = b x ∧ a y = b y ∧ t = 2 a ) (a_x-b_x\neq 0\wedge t=a+b)\vee (a_x=b_x\wedge a_y=b_y \wedge t=2a) (ax−bx=0∧t=a+b)∨(ax=bx∧ay=by∧t=2a)
整个proof cost的主要开销为:
field multiplications数量和field inversion 数量,实际都是proof of multiplication的数量。从proof-space的角度来说,affine坐标公式是效率最高的。Renes等人2016年论文《Complete addition formulas for prime order elliptic curves》中有更能复杂完备的工作,也需要更多的操作。
令 g , h g,h g,h表示 G N I S T G_{NIST} GNIST上的point; g ′ , h ′ g',h' g′,h′表示 G T o m G_{Tom} GTom上的point。
针对的场景为:
本文实际证明算法 对 Agrawal等人2018年论文《Non-interactive zero-knowledge proofs for composite statements》第14页Figure 2中的算法进行了纠正。【增加了Verifier端验证 z 1 g + z 2 h + C 1 = a 1 z_1g+z_2h+C_1=a_1 z1g+z2h+C1=a1,若无该验证项,则完全忽略了 C 1 C_1 C1,无法证明knowledge of an opening of C 1 C_1 C1。】
对于128-bit security,可128 parallel instances 运行如下流程:
知道proof of scalar multiplication,并无法立刻用于verification of signatures under committed public keys。
关于ECDSA签名细节可参看:
对消息 m m m的签名 ( r , s ) (r,s) (r,s)的验签过程中,需要:
一种替代方案是将 ( R , z = s / r ) (R,z=s/r) (R,z=s/r) 作为签名,转为验证方程式 z R − t r − 1 g = q zR-tr^{-1}g=q zR−tr−1g=q(相当于在之前的等式两侧都乘以 z z z)是否成立。该方程式对ZKP更友好。 R = k g R=kg R=kg与公钥 q q q无关,其中 k k k为随机数。 t = H ( m ) t=H(m) t=H(m)为a function of the message alone。
由于这种替代方案中, R R R与公钥 q q q无关,且验签方程式与之前的ECDSA相当,因此二者安全性相当。
令 Q = C o m ( q ) Q=Com(q) Q=Com(q) 为the committed public key。
本文的以上算法也可用于处理一些Schnorr签名的变种,但是无法处理EdDSA。【因为EdDSA中将signer的公钥嵌入在hash函数中了,因此很难在验签的同时,保证签名者的隐私。也许借助Groth16等zkSNARK方案可实现。】
关于EdDSA,可参看博客:
关于Schnorr签名可参看:
已知消息 m m m和公钥 q = x g q=xg q=xg,其Schnorr签名为 ( R , s ) (R,s) (R,s)。其中 R = k g , e = H ( R , m ) , s = k − x e R=kg,e=H(R,m), s=k-xe R=kg,e=H(R,m),s=k−xe。
Schnorr的验签过程为,验证等式 s g + e q = R sg+eq=R sg+eq=R是否成立。可将其表示为 q = e − 1 R − e − 1 s g q=e^{-1}R-e^{-1}sg q=e−1R−e−1sg。
Prover发送 R R R 和 a commitment to e − 1 s e^{-1}s e−1s,然后通过scalar multiplication proof 来证明the committed public key is the sum of e − 1 R e^{-1}R e−1R(public info)and e − 1 s g e^{-1}sg e−1sg。
详细参考 One-Out-of-Many Proofs: Or How to Leak a Secret and Spend a Coin 中第6节“membership proof —— 基于 ∑ \sum ∑-protocol” 和 第4节" ∑ \sum ∑-protocol for one out of N N N commitments containing 0"。
针对的场景为:
核心思想为:
借助上面的 1 1 1-out-of- N N N ∑ \sum ∑-protocol,构建 c 0 = c ⋅ C o m c k ( − λ 0 ; 0 ) , ⋯ , c N − 1 = c ⋅ C o m c k ( − λ N − 1 ; 0 ) c_0=c\cdot Com_{ck}(-\lambda_0;0),\cdots,c_{N-1}=c\cdot Com_{ck}(-\lambda_{N-1};0) c0=c⋅Comck(−λ0;0),⋯,cN−1=c⋅Comck(−λN−1;0),转为证明存在 c l c_l cl的opening为0。
[1] ZKAttest: Ring and Group Signatures for existing ECDSA keys