来自于Cloudflare和Cornell Tech的Armando Faz-Hern´andez等人,2021年论文《ZKAttest: Ring and Group Signatures for existing ECDSA keys》。
代码实现有:
- https://github.com/cloudflare/zkp-ecdsa(TypeScript)
在该代码实际实现时,采用的Groth–Kohlweiss membership Proof算法来自于 Groth和Kohlweiss 2015年论文《One-out-of-Many Proofs: Or How to Leak a Secret and Spend a Coin》,详细可参看博客:
- 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为:
- proof of valid ECDSA signature under a committed public key
Verifier可在不知道public key的情况下,通过该proof验证签名的有效性。ZKP中commitment的hiding属性可实现相应的功能。如, C C C为a commitment to a value on a public list of keys,从而生成环签名。
1.1 环签名环签名(ring signature)是一种数字签名方案,最初由Rivest等人提出,环签名是一种简化的群签名,环签名中只有环成员没有管理者,不需要环成员间的合作。环签名是一个能够实现签名者无条件匿名的签名方案。ring signature背景知识可参看博客 隐私交易基本原则 第3和第4节内容。
环签名中包含3个算法:
- G e n ( 1 k ) Gen(1^k) Gen(1k):输出为keys ( s k , p k ) (sk, pk) (sk,pk)
- S i g n ( m , s k i , R ) Sign(m, sk_i, R) Sign(m,ski,R):输出为a signature σ \sigma σ on the message m m m with respect to the ring R = { p k 1 , ⋯ , p k n } R=\{pk_1,\cdots,pk_n\} R={pk1,⋯,pkn}
- V e r i f y ( σ , m , R ) Verify(\sigma,m,R) Verify(σ,m,R):验证环签名。
理想情况下,即使ring中所有member的私钥都被暴露了,也无法根据签名判断出具体是谁签的。同时环签名还具有不可伪造性(没有私钥不能伪造一个合法的环签名)。
1.2 基础概念- G G G:group points on an elliptic curve。
- g , h , g 1 , g 2 g,h,g_1,g_2 g,h,g1,g2:为group generators。
ZKAttest中,采用2个不同的曲线来实现,分别从2条曲线上取point:【实际可选two-cycle曲线】
- G N I S T G_{NIST} GNIST:为标准的椭圆曲线,其base field为 F p \mathbb{F}_p Fp。
- G T o m G_{Tom} GTom:group order 为 p p p—— p p p为 G N I S T G_{NIST} GNIST的base field size。
将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具有如下属性:
- unconditionally hiding
- computationally binding
- addtively homomorphic
∑ \sum ∑-protocol基本概念可参看:基于Sigma protocol实现的零知识证明protocol集锦。 ∑ \sum ∑-protocol为3-round protocol,满足:
- Special Honest-Verifier Zero-Knowledge (SHVZK):意味着可sample from the distribution of transcripts without any knowledge of the witness。
- Special soundness:意味着对同一commitment,采用不同challenges,可计算出相应的witness。
∑ \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)。
1.3 Tom CurvesZKAttest中,采用2个不同的曲线来实现,分别从2条曲线上取point:【实际可选two-cycle曲线】
- G N I S T G_{NIST} GNIST:为标准的椭圆曲线,其base field为 F p \mathbb{F}_p Fp。
- G T o m G_{Tom} GTom:group order 为 p p p—— p p p为 G N I S T G_{NIST} GNIST的base field size。
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。
常用于FIPS 186-2和SEC2标准中的Tom曲线有:
令 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。
针对的场景为:
- public input: C 1 , C 2 ′ , C 3 ′ C_1,C_2',C_3' C1,C2′,C3′ 和 G N I S T G_{NIST} GNIST上的point g g g
- witness: x , y , λ x,y,\lambda x,y,λ
- relation: C 1 = C o m N I S T ( λ ) , C 2 ′ = C o m T o m ( x ) , C 3 ′ = C o m T o m ( y ) C_1=Com_{NIST}(\lambda),C_2'=Com_{Tom}(x),C_3'=Com_{Tom}(y) C1=ComNIST(λ),C2′=ComTom(x),C3′=ComTom(y)以及 ( x , y ) = λ g (x,y)=\lambda g (x,y)=λg
本文实际证明算法 对 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 运行如下流程:
- 1)Prover:选择随机数 α , β 1 , β 2 , β 3 \alpha, \beta_1,\beta_2,\beta_3 α,β1,β2,β3,计算 ( γ 1 , γ 2 ) = α g , a 1 = α g + β 1 h , a 2 ′ = γ 1 g ′ + β 2 h ′ , a 3 ′ = γ 2 g ′ + β 3 h ′ (\gamma_1,\gamma_2)=\alpha g, a_1=\alpha g+\beta_1 h, a_2'=\gamma_1 g'+\beta_2 h',a_3'=\gamma_2 g'+\beta_3 h' (γ1,γ2)=αg,a1=αg+β1h,a2′=γ1g′+β2h′,a3′=γ2g′+β3h′
- 2)Prover:计算 ( x 1 , y 1 ) = ( α − λ ) g (x_1,y_1)=(\alpha-\lambda)g (x1,y1)=(α−λ)g,计算 C 4 ′ = C o m T o m ( x 1 ) , C 5 ′ = C o m T o m ( y 1 ) C_4'=Com_{Tom}(x_1),C_5'=Com_{Tom}(y_1) C4′=ComTom(x1),C5′=ComTom(y1)。
- 3)Prover:将 a 1 , a 2 ′ , a 3 ′ , C 4 ′ , C 5 ′ a_1,a_2',a_3',C_4',C_5' a1,a2′,a3′,C4′,C5′ 都发送给Verifier。
- 4)Verifier:发送challenge string c = ( c 0 , c 1 ) c=(c_0,c_1) c=(c0,c1),其中 c 0 c_0 c0为a single bit, c 1 c_1 c1为a challenge for the point addition protocol。
- 5)Prover: 若 c 0 = 0 c_0=0 c0=0,则Prover计算 z 1 = α , z 2 = β 1 , z 3 = β 2 , z 4 = β 3 z_1=\alpha, z_2=\beta_1,z_3=\beta_2,z_4=\beta_3 z1=α,z2=β1,z3=β2,z4=β3,将 ( z 1 , z 2 , z 3 , z 4 ) (z_1,z_2,z_3,z_4) (z1,z2,z3,z4)发送给Verifier; 若 c 0 = 1 c_0=1 c0=1,则Prover计算 z 1 = α − λ , z 2 = β 1 − r z_1=\alpha-\lambda,z_2=\beta_1-r z1=α−λ,z2=β1−r。然后Prover使用上一节的Proof of point addition来证明knowledge of opening of a 2 ′ , a 3 ′ , C 2 ′ , C 3 ′ , C 4 ′ , C 5 ′ a_2',a_3',C_2',C_3',C_4',C_5' a2′,a3′,C2′,C3′,C4′,C5′ to γ 1 , γ 2 , x , y , u , v \gamma_1,\gamma_2,x,y,u,v γ1,γ2,x,y,u,v,其中 ( u , v ) = ( γ 1 , γ 2 ) − ( x , y ) (u,v)=(\gamma_1,\gamma_2)-(x,y) (u,v)=(γ1,γ2)−(x,y),生成的point addition proof以 π \pi π表示。Prover会将 ( π , z 1 , z 2 , x 1 , y 1 ) (\pi,z_1,z_2,x_1,y_1) (π,z1,z2,x1,y1)发送给Verifier。
- 6)Verifier: 若 c 0 = 0 c_0=0 c0=0,则Verifier仅需简单地验证the commitments a 1 , a 2 ′ , a 3 ′ a_1,a_2',a_3' a1,a2′,a3′ are opened correctly by ( α , β 1 , β 2 , β 3 ) (\alpha, \beta_1,\beta_2,\beta_3) (α,β1,β2,β3) ; 若 c 0 = 1 c_0=1 c0=1,则Verifier使用challenge c 1 c_1 c1来验证 π \pi π,并验证 z 1 g + z 2 h + C 1 = a 1 z_1g+z_2h+C_1=a_1 z1g+z2h+C1=a1,同时验证commitments C 4 ′ , C 5 ′ C_4',C_5' C4′,C5′ correctly opened by x 1 , y 1 x_1,y_1 x1,y1,且 ( x 1 , y 1 ) = z 1 g (x_1,y_1)=z_1g (x1,y1)=z1g。
知道proof of scalar multiplication,并无法立刻用于verification of signatures under committed public keys。
关于ECDSA签名细节可参看:
- ECDSA VS Schnorr signature VS BLS signature
对消息 m m m的签名 ( r , s ) (r,s) (r,s)的验签过程中,需要:
- 计算 ( R x , R y ) = R = u 1 g + u 2 q (R_x,R_y)=R=u_1g+u_2q (Rx,Ry)=R=u1g+u2q,其中 q q q为签名公钥, u 1 = t s − 1 m o d n , u 2 = r s − 1 m o d n u_1=ts^{-1}\mod n,u_2=rs^{-1}\mod n u1=ts−1modn,u2=rs−1modn,其中 t = H ( m ) t=H(m) t=H(m);
- 然后验证 R x = r m o d n R_x=r\mod n Rx=rmodn是否成立。
一种替代方案是将 ( 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。
- Prover计算 R R R 和 C z = C o m T o m ( z ) C_z=Com_{Tom}(z) Cz=ComTom(z)(a commitment to the scalar z z z)。
- Prover使用scalar multiplication proof来证明the correctness of a commitment to z R zR zR。
- 然后Prover使用point addition proof来证明the committed Q Q Q满足 z R − t r − 1 g = q = ( q x , q y ) zR-tr^{-1}g=q=(q_x,q_y) zR−tr−1g=q=(qx,qy)。其中 t r − 1 g tr^{-1}g tr−1g为public value,Prover仅需简单地display the opening of its commitments to t r − 1 g = ( s x , s y ) tr^{-1}g=(s_x,s_y) tr−1g=(sx,sy) to verify its correctness。【已知 R R R,即已知 r = R x m o d n r=R_x\mod n r=Rxmodn。】 具体为: 令 z R = ( z R x , z R y ) zR=(zR_x,zR_y) zR=(zRx,zRy)。 令 C q x = C o m T o m ( q x ) , C q y = C o m T o m ( q y ) C_{qx}=Com_{Tom}(q_x),C_{qy}=Com_{Tom}(q_y) Cqx=ComTom(qx),Cqy=ComTom(qy), C z = z R + r h C_z=zR+rh Cz=zR+rh, r r r为随机数,实现blinding。为了防止Prover作弊选取 R = k h R=kh R=kh,需调整为 h h h基于 R R R来hash到NIST上的点(hash to curve的标准算法可参考Faz-Hern´andez等人2021年论文《Hashing to Elliptic Curves》)。 然后Prover生成辅助commitment C s x = C o m T o m ( s x ) , C s y = C o m T o m ( s y ) C_{sx}=Com_{Tom}(s_x), C_{sy}=Com_{Tom}(s_y) Csx=ComTom(sx),Csy=ComTom(sy)以及 C 2 = C o m T o m ( z R x ) , C 3 = C o m T o m ( z R y ) C_2=Com_{Tom}(zR_x), C_3=Com_{Tom}(zR_y) C2=ComTom(zRx),C3=ComTom(zRy)。 然后Prover借助point addition proof来证明 C s x , C s y , C q x , C q y , C 2 , C 3 , C z C_{sx},C_{sy},C_{qx},C_{qy},C_2,C_3,C_z Csx,Csy,Cqx,Cqy,C2,C3,Cz的openings满足 z R − t r − 1 g = q zR-tr^{-1}g=q zR−tr−1g=q。
本文的以上算法也可用于处理一些Schnorr签名的变种,但是无法处理EdDSA。【因为EdDSA中将signer的公钥嵌入在hash函数中了,因此很难在验签的同时,保证签名者的隐私。也许借助Groth16等zkSNARK方案可实现。】 关于EdDSA,可参看博客:
- 区块链中的Ed25519
关于Schnorr签名可参看:
- ECDSA VS Schnorr signature VS BLS signature
已知消息 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。
6. Proof of Membership详细参考 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"。
针对的场景为:
- public info:commitment c c c,以及set of values λ 0 , ⋯ , λ N − 1 \lambda_0,\cdots,\lambda_{N-1} λ0,⋯,λN−1
- private info: λ l ∈ { λ 0 , ⋯ , λ N − 1 } \lambda_l\in\{\lambda_0,\cdots,\lambda_{N-1}\} λl∈{λ0,⋯,λN−1}和 γ l \gamma_l γl
- relation: c = C o m c k ( λ l ; γ l ) c=Com_{ck}(\lambda_l; \gamma_l) c=Comck(λl;γl)且 λ l ∈ { λ 0 , ⋯ , λ N − 1 } \lambda_l\in\{\lambda_0,\cdots,\lambda_{N-1}\} λl∈{λ0,⋯,λN−1}
核心思想为: 借助上面的 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