SM2算法学习

ECC算法

SM2非对称加密算法先从ECC算法开始。
Elliptic Curve Cryptography 椭圆曲线满足函数:y2=x3+ax+b (4a3+27b2 ≠ \neq = 0) ,
限定条件保证曲线不包含奇点。
椭圆曲线算法的基本要求:1)给定私钥k和椭圆曲线基点G,容易得到Q=k ⋅ \cdot G;2)给定G和Q,求k的值很难。

ECC算法步骤:

  1. 选择椭圆曲线,在椭圆曲线上选择基点G;
  2. 生成随机数k(作为私钥),生成公钥Q=k ⋅ \cdot G;
  3. 【加密】生成随机数r,明文M,密文C,C=(rG,M+rQ)
  4. 【解密】已知C,Q,求解M。M+rQ-k(rG)=M+r ⋅ \cdot k ⋅ \cdot G-k ⋅ \cdot r ⋅ \cdot G=M

SM2公钥加密算法

设:私钥dB,公钥PB,其中PB=dB ⋅ \cdot G,明文M,解密后明文 M ^ \hat{M} M^,密文C,C由3部分拼接组成,C 1 _1 1,C 2 _2 2,C 3 _3 3,明文长度klen。

公钥加密步骤:

  1. 生成随机数k;
  2. 计算C 1 _1 1=k ⋅ \cdot G;
  3. 计算点N(x 2 _2 2,y 2 _2 2),N=k ⋅ \cdot PB
  4. 计算t=KDF(x 2 _2 2||y 2 _2 2,klen),KDF是密钥派生函数,生成和明文等长的t,用于和明文异或运算;
  5. 计算C 2 _2 2=M ⨁ \bigoplus t;
  6. 计算C 3 _3 3=Hash(x 2 _2 2 || M || y 2 _2 2);
  7. 拼接得到密文C=(C 1 _1 1 || C 2 _2 2 || C 3 _3 3)。

私钥解密步骤:

  1. 拆分密文C,得到C 1 _1 1,C 2 _2 2,C 3 _3 3
  2. 利用C 1 _1 1得到点N(x 2 _2 2,y 2 _2 2),N=dB ⋅ \cdot C 1 _1 1=dB ⋅ \cdot k ⋅ \cdot G=k ⋅ \cdot PB
  3. 计算t=KDF(x 2 _2 2||y 2 _2 2,klen);
  4. 计算明文 M ^ \hat{M} M^ = C 2 _2 2 ⨁ \bigoplus t;
  5. 检验明文 Hash(x 2 _2 2 || M || y 2 _2 2)是否等于C 3 _3 3

公钥加密算法需要双方共同知道的数据:明文长度,Hash函数,密钥派生函数。

SM2数字签名算法

SM2数字签名算法使用,A想发送消息M,把M和P A _A A的杂凑值打包,进行非对称加密,得到数字签名(r,s),把M和(r,s)发送出去,收到消息的进行解密,如果正确,就采用M,如果不正确,说明M和P A _A A存在错误。

签名过程:

  1. M ˉ \bar{M} Mˉ=Z A _A A || M;
  2. e=H v _v v( M ˉ \bar{M} Mˉ),长度为v的Hash;
  3. 生成随机数k;
  4. 计算点N(x 1 _1 1,y 1 _1 1)=k ⋅ \cdot G;
  5. 计算r=(e+x 1 _1 1) mod n;
  6. 计算s=((1+d A _A A) − 1 ^-1 1 ⋅ \cdot (k-r ⋅ \cdot d A d_A dA)) mod n;
  7. 得到的(r,s)是签名,发送M和(r,s)。

验签过程:

  1. 验签方收到M ∗ ^* 和(r ∗ ^* ,s ∗ ^* ),先检验r ∗ ^* 、s ∗ ^* 是否满足条件;
  2. 计算 M ˉ \bar{M} Mˉ ∗ ^* =Z A _A A || M ∗ ^* ,Z A _A A是通过P A _A A计算得来的,是公开的;
  3. 计算e ∗ ^* =H v _v v( M ˉ \bar{M} Mˉ ∗ ^* );
  4. 计算t=(r ∗ ^* +s ∗ ^* ) mod n;
  5. N ∗ ^* =(x 1 _1 1 ∗ ^* ,y 1 _1 1 ∗ ^* )=[s ∗ ^* ]G+[t]P A _A A
  6. 计算R=(e ∗ ^* +x 1 _1 1 ∗ ^* ) mod n,如果计算得到的R和收到的r ∗ ^* 相等,说明验签成功。

数字签名算法主要是验证收到的消息和发消息的人,主要原理是通过对N点的加密和验证,通过验证k ⋅ \cdot G=[s ∗ ^* ]G+[t]P A _A A,其中
P A _A A=dAG;
S=((1+d A _A A) − 1 ^-1 1 ⋅ \cdot (k-r ⋅ \cdot d A d_A dA)) ;
t=(r ∗ ^* +s ∗ ^* );
化简之后得到kG=kG-rdAG+rdAG,验证发送方和接收方的点N相同。

SM2密钥交换协议

SM2中的密钥交换协议,通信双方信息传递,计算获得一个由双方共同决定的共享秘密密钥,通信两次或者三次确定这个密钥。

A和B确定一个共享密钥,A用随机数生成 R A R_A RA,发给B,同时利用 R A R_A RA经过一系列运算得到 t A t_A tA
B也产生一个 R B R_B RB,利用 R B R_B RB经过一系列运算得到 t B t_B tB。B用 R A R_A RA t B t_B tB经过一些列计算,得到 S B S_B SB,把 R B R_B RB S B S_B SB发送给A,其中 S B S_B SB是可选项,如果发送 S B S_B SB,通信两次就可以确认,如果不发送,还得通信一次。
A收到 R B R_B RB S B S_B SB,利用 R B R_B RB t A t_A tA经过一系列计算,得到 S 1 S_1 S1,对比 S 1 S_1 S1 S B S_B SB,如果相等,就说明协商成功,用计算S的中间变量得到 K A K_A KA K B K_B KB(这两个相等)就是协商的密钥。

以发送两次为例,具体过程如下:

  1. A产生随机数 r A r_A rA
  2. A计算 R A R_A RA=[ r A r_A rA]G=( x 1 x_1 x1, y 1 y_1 y1),发送给B;
  3. B产生随机数 r B r_B rB
  4. B计算计算 R B R_B RB=[ r B r_B rB]G=( x 2 x_2 x2, y 2 y_2 y2);
  5. B计算 x 2 ˉ \bar{x2} x2ˉ= 2 w 2^w 2w+( x 2 x_2 x2 & ( 2 w 2^w 2w-1));
  6. B计算 t B t_B tB=( d B d_B dB+ x 2 ˉ \bar{x2} x2ˉ ⋅ \cdot r B r_B rB)mod n;
  7. B收到 R A R_A RA,用 x 1 x_1 x1计算 x 1 ˉ \bar{x1} x1ˉ= 2 w 2^w 2w+( x 1 x_1 x1 & ( 2 w 2^w 2w-1));
  8. B计算点V=([h] ⋅ \cdot t B t_B tB)( P A P_A PA+ x 1 ˉ \bar{x1} x1ˉ R A R_A RA)=( x v x_v xv, y v y_v yv),其中h是余因子,可以取1, t B t_B tB只有B知道,剩下的是从A获得的;
  9. B计算 K B K_B KB= K D F KDF KDF( x v x_v xv|| y v y_v yv|| Z A Z_A ZA|| Z B Z_B ZB,klen);
  10. B计算 S B S_B SB=Hash(0x02 || y v y_v yv || Hash( y v y_v yv|| Z A Z_A ZA|| Z B Z_B ZB|| x 1 x_1 x1|| y 1 y_1 y1|| x 2 x_2 x2|| y 2 y_2 y2)),把 R B R_B RB S B S_B SB发送给A;
  11. A用自己的 R A R_A RA计算 x 1 ˉ \bar{x1} x1ˉ= 2 w 2^w 2w+( x 1 x_1 x1 & ( 2 w 2^w 2w-1));
  12. A用 x 1 ˉ \bar{x1} x1ˉ结合私钥 d A d_A dA计算 t A t_A tA=( d A d_A dA+ x 1 ˉ \bar{x1} x1ˉ ⋅ \cdot r A r_A rA)mod n;
  13. A用收到的 R B R_B RB计算 x 2 ˉ \bar{x2} x2ˉ= 2 w 2^w 2w+( x 2 x_2 x2 & ( 2 w 2^w 2w-1));
  14. A用 x 2 ˉ \bar{x2} x2ˉ计算点U=([h] ⋅ \cdot t A t_A tA)( P B P_B PB+ x 2 ˉ \bar{x2} x2ˉ R B R_B RB)=( x u x_u xu, y u y_u yu);
  15. A计算 K A K_A KA= K D F KDF KDF( x u x_u xu|| y u y_u yu|| Z A Z_A ZA|| Z B Z_B ZB,klen);
  16. A计算 S 1 S_1 S1=Hash(0x02 || y u y_u yu || Hash( y u y_u yu|| Z A Z_A ZA|| Z B Z_B ZB|| x 1 x_1 x1|| y 1 y_1 y1|| x 2 x_2 x2|| y 2 y_2 y2)),如果 S 1 S_1 S1= S B S_B SB,则协商成功,公共密钥就是 K A K_A KA K B K_B KB,二者相等。

密钥协商算法的关键在于计算的U、V两点相同,假设余因子取1,即需证明:
t A t_A tA( P B P_B PB+ x 2 ˉ \bar{x2} x2ˉ R B R_B RB)= t B t_B tB( P A P_A PA+ x 1 ˉ \bar{x1} x1ˉ R A R_A RA)
化简之后,两边项都是:
d A d_A dA d B d_B dBG+ x 1 ˉ \bar{x1} x1ˉ r A r_A rA d B d_B dBG+ x 2 ˉ \bar{x2} x2ˉ r B r_B rB d A d_A dAG+ x 1 ˉ \bar{x1} x1ˉ x 2 ˉ \bar{x2} x2ˉ r A r_A rA r B r_B rBG
所以U、V两点相同。

参考

信息安全技术 SM2椭圆曲线公钥密码算法 第2部分:数字签名算法

信息安全技术 SM2椭圆曲线公钥密码算法 第4部分:公钥加密算法

信息安全技术 SM2椭圆曲线公钥密码算法 第3部分:密钥交换协议

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值