Elgamal数字签名
- 生成密钥
Alice选择一个大素数 p p p和一个本原根 g g g,选择一个秘密整数 1 ≤ x ≤ p − 2 1 \leq x\leq p-2 1≤x≤p−2,并计算 y = g x m o d ( p ) , ( p , q , y ) 公开 x 秘密保存 y=g^x\ mod(p),(p,q,y)公开x秘密保存 y=gx mod(p),(p,q,y)公开x秘密保存 - 选择一个安全随机数 k k k,计算 r = g k m o d ( p ) r=g^k\ mod (p) r=gk mod(p),计算 s = k − 1 ( m − x r ) m o d ( p − 1 ) s=k^{-1}(m-xr)\ mod(p-1) s=k−1(m−xr) mod(p−1),Alice签署消息三元组 ( m , r , s ) (m,r,s) (m,r,s)
- Bob确认签名
下载Alice的公钥 ( p , g , y ) (p,g,y) (p,g,y)
计算 v 1 = y r ∗ r s m o d p , v 2 = g m m o d p v_1=y^r*r^s\ mod\ p,v_2=g^m \ mod\ p v1=yr∗rs mod p,v2=gm mod p
当且仅当 v 1 = v 2 m o d p v_1=v_2\ mod\ p v1=v2 mod p时,签名有效
ECC数字签名
签名过程:
- 选择一条椭圆曲线 E p ( a , b ) E_p(a,b) Ep(a,b)
- 选取一个随机数 k k k,n为 E p ( a , b ) E_p(a,b) Ep(a,b)的阶
- 选取 E p ( a , b ) E_p(a,b) Ep(a,b)的一个基点 G G G,计算 K = k ∗ G K=k*G K=k∗G
- 计算 r = x k m o d n r=x_k\ mod\ n r=xk mod n
- 如果 r = 0 r=0 r=0另选一个 k k k并重新计算
- 获取 M M M的哈希值 z z z,计算 s = k − 1 ( z + r d A ) m o d n s=k^{-1}(z+rd_A)\ mod\ n s=k−1(z+rdA) mod n
- 如果 s = 0 s=0 s=0另选一个 k k k并重新计算
- 输出签名 ( r , s ) (r,s) (r,s)
验证过程:
- 计算整数 u 1 = s − 1 z m o d n u_1=s^{-1}z\ mod\ n u1=s−1z mod n
- 计算整数 u 2 = s − 1 r m o d n u_2=s^{-1}r\ mod\ n u2=s−1r mod n
- 计算 P = u 1 G + u 2 H A = ( s − 1 z G + s − 1 r H A ) m o d n = s − 1 G ( z + r d a ) m o d n P=u_1G+u_2H_A=(s^{-1}zG+s^{-1}rH_A)\ mod\ n=s^{-1}G(z+rd_a)\ mod\ n P=u1G+u2HA=(s−1zG+s−1rHA) mod n=s−1G(z+rda) mod n
- 当且仅当 r = x p m o d n r=x_p\ mod\ n r=xp mod n的时候,签名才能成功验证