假设Alice希望用环签名为消息M签名,M的长度为 k l e n k_{len} klen,环中有 n n n个成员 A 1 , A 2 . . . A n A_1, A_2...A_n A1,A2...An,其中签名者Alice 是 A s A_s As。对于 s s s的某个值 1 ≤ s ≤ n 1 \leq s \leq n 1≤s≤n,其中所有环成员使用SM2作为他们各自的签名方案。基于SM2算法的环签名方案主要由系统建立、密钥生成、签名和验证3个部分组成。
每个环成员 A i A_i Ai选定一条满足安全要求的椭圆曲线(256 bits),包括参数 N N N椭圆曲线的阶数, G G G椭圆曲线基点, a a a椭圆曲线一次项系数, b b b椭圆曲线的常数项。
q q q为大素数且 q > 2 256 q > 2^{256} q>2256;
m o d q mod\ q mod q是模 q q q的运算;
Z q ∗ Z_q^* Zq∗是由参数 1 , 2 , . . . q − 1 1,2,...q-1 1,2,...q−1组成的整数集合;
[ k ] G [k]G [k]G是椭圆曲线加法群的倍点运算,即 G G G的 k k k倍。
H ( ⋅ ) H(\cdot) H(⋅)为SM3密码杂凑函数的哈希算法,输入为任意长度的比特串 { 0 , 1 } ∗ \{0,1\}^* {0,1}∗,输出为固定长度的密码杂凑函数。
通过随机数发生器产生随机数 k ∈ [ 1 , N − 1 ] k \in [1,N-1] k∈[1,N−1],环成员的公钥集合为 P = { P 1 , P 2 , . . . P n } P = \{P_1, P_2,...P_n\} P={P1,P2,...Pn}
签名者 A s A_s As根据自己公私钥对 { d s , P s } \{d_s, P_s\} {ds,Ps}以及环内成员的公钥集合 P P P,对待签名消息 M M M进行签名。
Step 1. 随机产生 k s ∈ Z q ∗ k_s \in Z_q^* ks∈Zq∗ ,计算 c s + 1 = H ( M , [ k s ] G ) c_{s+1} = H(M,[k_s]G) cs+1=H(M,[ks]G) ;
Step 2. 计算 c i c_i ci,具体如下:
对于每个 i = s + 1 , . . . , n , 1 , . . . , s − 1 i = s+1, ..., n,1,..., s-1 i=s+1,...,n,1,...,s−1,
随机产生 r i ∈ Z q ∗ r_i \in Z_q^* ri∈Zq∗ ,并依次计算
Z i = [ r i + c i ] P i + [ r i ] G Z_i =[r_i + c_i]P_i+[r_i]G Zi=[ri+ci]Pi+[ri]G,
c i + 1 = H ( M , Z i ) c_{i+1}=H(M,Z_i) ci+1=H(M,Zi)。 c 1 = c n + 1 c_1 = c_{n+1} c1=cn+1。
Step 3.根据签名者私钥 d s d_s ds,计算 r s = ( 1 + d s ) − 1 ( k s − c s d s ) m o d q r_s = (1+d_s)^{-1}(k_s-c_sd_s) mod\ q rs=(1+ds)−1(ks−csds)mod q;
Step 4.生成消息 M M M的环签名 σ = ( c 1 , r 1 , . . . , r n ) \sigma=(c_1, r_1,...,r_n) σ=(c1,r1,...,rn)。
验签者 V V V收到消息 M ′ M^{'} M′及其签名 ( c 1 ′ , r 1 ′ , . . . , r n ′ ) (c_1^{'}, r_1^{'},...,r_n^{'}) (c1′,r1′,...,rn′)后,采用以下步骤进行环签名验证:
Step 1. 检验 c 1 ′ ∈ Z q ∗ c_1^{'}\in Z_q^* c1′∈Zq∗是否成立,若不成立则验证不通过;
Step 2. 检验 r i ′ ∈ Z q ∗ r_i^{'}\in Z_q^* ri′∈Zq∗, i ∈ [ 1 , 2... , n ] i\in[1,2...,n] i∈[1,2...,n]是否成立,若不成立则验证不通过;
Step 3.依次计算
Z i ′ = [ r i ′ + c i ′ ] P i + [ r i ′ ] G Z_i^{'} = [r_i^{'} + c_i^{'}]P_i+[r_i^{'}]G Zi′=[ri′+ci′]Pi+[ri′]G
c i + 1 ′ = H ( M , Z i ′ ) c_{i+1}^{'} =H(M,Z_i^{'}) ci+1′=H(M,Zi′)
Step 4. 检验 c 1 ′ = c n + 1 ′ c_{1}^{'}=c_{n+1}^{'} c1′=cn+1′是否成立,若成立则验证通过,否则验证不通过。