密码学学习 -- 签名算法

1 Elgamal 签名

1.1 公共参数

  • α \alpha α q q q 的原根。

1.2 Gen 过程

  • 随机选择 X A ∈ Z X_A \in \mathbb{Z} XAZ 1 < X A < q − 1 1 < X_A < q - 1 1<XA<q1

  • 计算 Y A = α X A   m o d   q Y_A = \alpha^{X_A}\bmod q YA=αXAmodq

  • 私钥 { X A } \{X_A\} {XA},公钥 { Y A } \{Y_A\} {YA}

1.3 Sign 过程

  • m = H ( M ) m = H(M) m=H(M) 0 ≤ m ≤ q − 1 0 \leq m \leq q-1 0mq1

  • 随机选择 K ∈ Z K \in \mathbb{Z} KZ 1 ≤ K ≤ q − 1 1 \leq K \leq q-1 1Kq1 g c d ( K , q − 1 ) = 1 gcd(K,q-1)=1 gcd(K,q1)=1

  • 计算 S 1 = α K   m o d   q S_1 = \alpha^{K}\bmod q S1=αKmodq

  • 计算 S 2 = [ K − 1 ( m − X A S 1 ) ]   m o d   ( q − 1 ) S_2 = [K^{-1}(m - X_AS_1)]\bmod(q-1) S2=[K1(mXAS1)]mod(q1)

  • 输出签名 ( S 1 , S 2 ) (S_1, S_2) (S1,S2)

1.4 Vrfy 过程

  • 计算 V 1 = α m   m o d   q V_1 = \alpha^m\bmod q V1=αmmodq

  • 计算 V 2 = [ ( Y A ) S 1 ′ ( S 1 ′ ) S 2 ′ ]   m o d   q V_2 = [(Y_A)^{S'_1}(S'_1)^{S'_2}]\bmod q V2=[(YA)S1(S1)S2]modq

  • 验证 V 1 = ? V 2 V_1 \overset{\text{?}}= V_2 V1=?V2

2 Schnorr 签名

2.1 公共参数

  • 选择素数 p p p q q q p − 1 = 0   m o d   q p - 1 = 0\bmod q p1=0modq

  • 选择 α ∈ Z \alpha \in \mathbb{Z} αZ α q = 1   m o d   p \alpha^q = 1\bmod p αq=1modp

2.2 Gen 过程

  • 随机选择 s ∈ Z s \in \mathbb{Z} sZ 0 < s < q 0 < s < q 0<s<q

  • 计算 v = α − s   m o d   p v = \alpha^{-s}\bmod p v=αsmodp

  • 私钥 { s } \{s\} {s},公钥 { v } \{v\} {v}

2.3 Sign 过程

  • 随机选择 r ∈ Z r \in \mathbb{Z} rZ 0 < r < q 0 < r < q 0<r<q

  • 计算 x = α r   m o d   p x = \alpha^r\bmod p x=αrmodp

  • 计算 e = H ( M ∥ x ) e = H(M\|x) e=H(Mx)

  • 计算 y = ( r + s e )   m o d   q y = (r + se)\bmod q y=(r+se)modq

  • 输出签名 ( e , y ) (e, y) (e,y)

2.4 Vrfy 过程

  • 计算 x ′ = ( α y ′ v e ′ )   m o d   p x' = (\alpha^{y'}v^{e'})\bmod p x=(αyve)modp

  • 验证 e ′ = ? H ( M ∥ x ′ ) e' \overset{\text{?}}= H(M\|x') e=?H(Mx)

3 DSA 签名

3.1 公共参数

  • 选择素数 p p p 2 L − 1 < p < 2 L 2^{L-1} < p < 2^L 2L1<p<2L 512 ≤ L ≤ 1024 512\leq L\leq 1024 512L1024 L = 0   m o d   64 L = 0\bmod 64 L=0mod64

  • 选择素数 q q q p − 1 = 0   m o d   q p - 1 = 0\bmod q p1=0modq 2 N − 1 < q < 2 N 2^{N-1} < q < 2^N 2N1<q<2N

  • 选择 h ∈ Z h \in \mathbb{Z} hZ h ( p − 1 ) / q   m o d   p > 1 h^{(p - 1) / q}\bmod p > 1 h(p1)/qmodp>1 1 < h < p − 1 1 < h < p - 1 1<h<p1

  • 计算 g = [ h ( p − 1 ) / q ]   m o d   p g = [h(p - 1)/q]\bmod p g=[h(p1)/q]modp

3.2 Gen 过程

  • 随机选择 x ∈ Z x\in \mathbb{Z} xZ 0 < x < q 0 < x < q 0<x<q

  • 计算 y = g x   m o d   p y = g^x\bmod p y=gxmodp

  • 私钥 { x } \{x\} {x},公钥 { y } \{y\} {y}

3.3 Sign 过程

  • 随机选择 k ∈ Z k \in \mathbb{Z} kZ 0 < k < q 0 < k < q 0<k<q

  • 计算 r = ( g k   m o d   p )   m o d   q r = (g^k\bmod p)\bmod q r=(gkmodp)modq

  • 计算 s = [ k − 1 ( H ( M ) + x r ) ]   m o d   q s = [k^{-1}(H(M) + xr)]\bmod q s=[k1(H(M)+xr)]modq

  • 输出签名 ( r , s ) (r, s) (r,s)

3.4 Vrfy 过程

  • 计算 w = ( s ′ ) − 1   m o d   q w = (s')^{-1}\bmod q w=(s)1modq

  • 计算 u 1 = [ H ( M ′ ) w ]   m o d   q u_1 = [H(M')w]\bmod q u1=[H(M)w]modq

  • 计算 u 2 = ( r ′ w )   m o d   q u_2 = (r'w)\bmod q u2=(rw)modq

  • 计算 v = [ ( g u 1 y u 2 )   m o d   p ]   m o d   q v = [(g^{u_1}y^{u_2})\bmod p]\bmod q v=[(gu1yu2)modp]modq

  • 验证 v = ? r ′ v \overset{\text{?}}= r' v=?r

4 ECDSA 签名

4.1 公共参数

  • 选择素数 q q q

  • 选择 a ∈ Z p a\in Z_p aZp b ∈ Z p b\in Z_p bZp,定义椭圆曲线 y 2 = ( x 3 + a x + b )   m o d   q y^2 = (x^3 + ax + b)\bmod q y2=(x3+ax+b)modq

  • 椭圆曲线的基点 G = ( x g , y g ) G = (x_g, y_g) G=(xg,yg)

  • 基点 G G G 的阶为 n n n

4.2 Gen 过程

  • 随机选择 d ∈ Z d\in \mathbb{Z} dZ 1 ≤ d ≤ n − 1 1\leq d\leq n - 1 1dn1

  • 计算 Q = d G Q = dG Q=dG

  • 私钥 { d } \{d\} {d},公钥 { Q } \{Q\} {Q}

4.3 Sign 过程

  • 随机选择 k ∈ Z k\in \mathbb{Z} kZ 1 ≤ k ≤ n − 1 1\leq k\leq n - 1 1kn1

  • 计算 P = ( x , y ) = k G P = (x, y)= kG P=(x,y)=kG r = x   m o d   n r = x\bmod n r=xmodn,如果 r = 0 r = 0 r=0 则重新选择。

  • 计算 e = H ( m ) e = H(m) e=H(m)

  • 计算 s = [ k − 1 ( e + d r ) ]   m o d   n s = [k^{-1}(e + dr)]\bmod n s=[k1(e+dr)]modn,如果 s = O s = O s=O 则重新选择。

  • 输出签名 ( r , s ) (r, s) (r,s)

4.4 Vrfy 过程

  • 检验 r ′ r' r s ′ s' s 是否是 [ 1 , n − 1 ] [1, n - 1] [1,n1] 中的整数。

  • 计算 e ′ = H ( m ′ ) e' = H(m') e=H(m)

  • 计算 w = s ′ − 1   m o d   n w = s'^{-1}\bmod n w=s1modn

  • 计算 u 1 = e ′ w u_1 = e'w u1=ew

  • 计算 u 2 = r ′ w u_2 = r'w u2=rw

  • 计算 X = ( x 1 , y 1 ) = u 1 G + u 2 Q X = (x_1, y_1) = u_1G + u_2Q X=(x1,y1)=u1G+u2Q,如果 X = O X = O X=O 则拒绝。

  • 计算 v = x 1   m o d   n v = x_1\bmod n v=x1modn

  • 验证 v = ? r ′ v \overset{\text{?}}= r' v=?r

5 RSA 签名

5.1 Gen 过程

  • 选择两个 n n n 比特的素数 p p p q q q

  • 计算 n = p × q n = p\times q n=p×q

  • 计算 ϕ ( n ) = ( p − 1 ) × ( q − 1 ) \phi(n) = (p - 1)\times (q - 1) ϕ(n)=(p1)×(q1)

  • 随机选择 e ∈ Z e\in \mathbb{Z} eZ 0 < e < ϕ ( n ) 0 < e < \phi(n) 0<e<ϕ(n) g c d ( e , ϕ ( n ) ) = 1 gcd(e, \phi(n)) = 1 gcd(e,ϕ(n))=1

  • 计算 d = e − 1   m o d   ϕ ( n ) d = e^{-1}\bmod \phi(n) d=e1modϕ(n)

  • 私钥 { p , q , d } \{p, q, d\} {p,q,d},公钥 { n , e } \{n, e\} {n,e}

5.2 Sign 过程

  • 计算 σ = m d   m o d   n \sigma = m^d\bmod n σ=mdmodn

  • 输出签名 σ \sigma σ

5.3 Vrfy 过程

  • 计算 m ′ ′ = σ ′ e   m o d   n m'' = \sigma'^e\bmod n m′′=σemodn

  • 验证 m ′ = ? m ′ ′ m' \overset{\text{?}}= m'' m=?m′′

6 SM2 签名

6.1 公共参数

  • 椭圆曲线 E ( F q ) E(F_q) E(Fq) 的规模 q q q 和两个元素 a , b ∈ F q a,b\in F_q a,bFq

  • 椭圆曲线的基点 G = ( x G , y G ) G = (x_G, y_G) G=(xG,yG)

  • 基点 G G G 的阶。

6.2 Gen 过程

  • 随机选择 d A ∈ Z d_A\in \mathbb{Z} dAZ 1 ≤ d A ≤ n − 1 1\leq d_A\leq n - 1 1dAn1

  • 计算 P A = [ d A ] G = ( x A , y A ) P_A = [d_A]G = (x_A, y_A) PA=[dA]G=(xA,yA)

  • 私钥 { d A } \{d_A\} {dA},公钥 { P A } \{P_A\} {PA}

6.3 Sign 过程

  • 计算 Z A = H ( E N T L A ∥ I D A ∥ a ∥ b ∥ x G ∥ y G ∥ x A ∥ y A ) Z_A = H(ENTL_A\|ID_A\|a\|b\|x_G\|y_G\|x_A\|y_A) ZA=H(ENTLAIDAabxGyGxAyA)

  • 计算 M ‾ = Z A ∥ M \overline{M} = Z_A\|M M=ZAM

  • 计算 e = H ( M ‾ ) e = H(\overline{M}) e=H(M)

  • 随机选择 k ∈ Z k\in \mathbb{Z} kZ 1 ≤ k ≤ n − 1 1\leq k\leq n - 1 1kn1.

  • 计算 ( x 1 , y 1 ) = [ k ] G (x_1, y_1) = [k]G (x1,y1)=[k]G

  • 计算 r = ( e + x 1 )   m o d   n r = (e + x_1)\bmod n r=(e+x1)modn,若 r = 0 r = 0 r=0 r + k = n r + k = n r+k=n 则重新选择。

  • 计算 s = [ ( 1 + d A ) − 1 × ( k − r d A ) ]   m o d   n s = [(1 + d_A)^{-1}\times (k - rd_A)]\bmod n s=[(1+dA)1×(krdA)]modn,若 s = 0 s = 0 s=0 则重新选择。

  • 输出签名 ( r , s ) (r, s) (r,s)

6.4 Vrfy 过程

  • 检验 r ′ r' r s ′ s' s 是否是 [ 1 , n − 1 ] [1, n - 1] [1,n1] 中的整数。

  • 计算 M ‾ ′ = Z A ∥ M ′ \overline{M}' = Z_A\|M' M=ZAM

  • 计算 e ′ = H ( M ‾ ′ ) e' = H(\overline{M}') e=H(M)

  • 计算 t = r ′ + s ′ t = r' + s' t=r+s,若 t = 0 t = 0 t=0 则不通过。

  • 计算 ( x 1 ′ + y 1 ′ ) = [ s ′ ] G + [ t ′ ] P A (x'_1 + y'_1) = [s']G + [t']P_A (x1+y1)=[s]G+[t]PA

  • 计算 R = ( e ′ + x 1 ′ )   m o d   n R = (e' + x'_1)\bmod n R=(e+x1)modn

  • 验证 R = ? r ′ R \overset{\text{?}}= r' R=?r

7 BLS 签名

7.0 预备知识

  • 双线性映射:对于阶数均为素数 p p p 的加性群 G 1 G_1 G1 G 2 G_2 G2,乘性群 G T G_T GT G 1 G_1 G1 的生成元为 P P P G 2 G_2 G2 的生成元为 Q Q Q。双线性映射 e : G 1 × G 2 → G T e:G_1\times G_2\rightarrow G_T e:G1×G2GT 满足以下性质:

    • 双线性性: ∀ a , b ∈ Z : e ( a P , b Q ) = e ( P , Q ) a b \forall a,b\in \mathbb{Z}:e(aP, bQ) = e(P,Q)^{ab} a,bZ:e(aP,bQ)=e(P,Q)ab

    • 非退化性: e ( P , Q ) ≠ 1 e(P,Q)\neq 1 e(P,Q)=1

    • 出于应用目的, e e e 的计算应是可高效计算的。

    特别地,当 G 1 = G 2 = G G_1 = G_2 = G G1=G2=G 时,称 e e e 是对称的;当 G G G 是循环群时, e e e 是可交换的,即 e ( P , Q ) = e ( g p , g q ) = e ( g , g ) p q = e ( g q , g p ) = e ( Q , P ) e(P,Q) = e(g^p, g^q) = e(g, g)^{pq} = e(g^q, g^p) = e(Q, P) e(P,Q)=e(gp,gq)=e(g,g)pq=e(gq,gp)=e(Q,P)

  • Computational Diffie-Hellman Problem, CDHP:对于 G G G,给定 g a , g b ∈ G g^a, g^b\in G ga,gbG,计算 g a b g^{ab} gab 是困难的。

  • Decisional Diffie-Hellman Problem, DDHP:对于 G G G,以下两个三元组的概率分布是计算不可区分的:

    • ( g a , g b , g a b ) (g^a, g^b, g^{ab}) (ga,gb,gab),其中 a , b a,b a,b 是从 Z q \mathbb{Z}_q Zq 中独立且随机抽取的;

    • ( g a , g b , g c ) (g^a, g^b, g^c) (ga,gb,gc),其中 a , b , c a,b,c a,b,c 是从 Z q \mathbb{Z}_q Zq 中独立且随机抽取的。

  • Computational co-Diffie-Hellman, co-CDH:对于 ( G 1 , G 2 ) (G_1, G_2) (G1,G2),给定 g 2 , g 2 a ∈ G 2 g_2, g_2^a\in G_2 g2,g2aG2 h ∈ G 1 h\in G_1 hG1,计算 h a ∈ G 1 h^a\in G_1 haG1 是困难的。

  • Decisional co-Diffie-Hellman, co-DDH:对于 ( G 1 , G 2 ) (G_1, G_2) (G1,G2),给定 g 2 , g 2 a ∈ G 2 g_2, g_2^a\in G_2 g2,g2aG2 h , h b ∈ G 1 h, h^b\in G_1 h,hbG1,判断 a = ? b a\overset{\text{?}}= b a=?b。如果 a = b a = b a=b,则称 ( g 2 , g 2 a , h , h a ) (g_2, g_2^a, h, h^a) (g2,g2a,h,ha) 是 co-DDH 元组。

7.1 公共参数

  • Gap co-Diffie-Human group pair ( G 1 , G 2 ) (G_1, G_2) (G1,G2) ∥ G 1 ∥ = ∥ G 2 ∥ = p \|G_1\| = \|G_2\| = p G1=G2=p,co-CDH 计算困难,co-DDH 计算简单。

7.2 Gen 过程

  • 随机选择 x ∈ Z p x\in \mathbb{Z}_p xZp

  • 计算 v = g 2 x ∈ G 2 v = g_2^x\in G_2 v=g2xG2

  • 私钥 { x } \{x\} {x},公钥 { v } \{v\} {v}

7.3 Sign 过程

  • 计算 h = H ( M ) ∈ G 1 h = H(M)\in G_1 h=H(M)G1

  • 计算 σ = h x ∈ G 1 \sigma = h^x\in G_1 σ=hxG1

  • 输出签名 σ \sigma σ

7.4 Vrfy 过程

  • 验证 ( g 2 , v , h , σ ) (g_2, v, h, \sigma) (g2,v,h,σ) 是否为 co-DDH 元组。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值