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算法步骤:
- 选择椭圆曲线,在椭圆曲线上选择基点G;
- 生成随机数k(作为私钥),生成公钥Q=k ⋅ \cdot ⋅G;
- 【加密】生成随机数r,明文M,密文C,C=(rG,M+rQ)
- 【解密】已知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。
公钥加密步骤:
- 生成随机数k;
- 计算C 1 _1 1=k ⋅ \cdot ⋅G;
- 计算点N(x 2 _2 2,y 2 _2 2),N=k ⋅ \cdot ⋅PB;
- 计算t=KDF(x 2 _2 2||y 2 _2 2,klen),KDF是密钥派生函数,生成和明文等长的t,用于和明文异或运算;
- 计算C 2 _2 2=M ⨁ \bigoplus ⨁t;
- 计算C 3 _3 3=Hash(x 2 _2 2 || M || y 2 _2 2);
- 拼接得到密文C=(C 1 _1 1 || C 2 _2 2 || C 3 _3 3)。
私钥解密步骤:
- 拆分密文C,得到C 1 _1 1,C 2 _2 2,C 3 _3 3;
- 利用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;
- 计算t=KDF(x 2 _2 2||y 2 _2 2,klen);
- 计算明文 M ^ \hat{M} M^ = C 2 _2 2 ⨁ \bigoplus ⨁t;
- 检验明文 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存在错误。
签名过程:
- 置 M ˉ \bar{M} Mˉ=Z A _A A || M;
- e=H v _v v( M ˉ \bar{M} Mˉ),长度为v的Hash;
- 生成随机数k;
- 计算点N(x 1 _1 1,y 1 _1 1)=k ⋅ \cdot ⋅G;
- 计算r=(e+x 1 _1 1) mod n;
- 计算s=((1+d A _A A) − 1 ^-1 −1 ⋅ \cdot ⋅(k-r ⋅ \cdot ⋅ d A d_A dA)) mod n;
- 得到的(r,s)是签名,发送M和(r,s)。
验签过程:
- 验签方收到M ∗ ^* ∗和(r ∗ ^* ∗,s ∗ ^* ∗),先检验r ∗ ^* ∗、s ∗ ^* ∗是否满足条件;
- 计算 M ˉ \bar{M} Mˉ ∗ ^* ∗=Z A _A A || M ∗ ^* ∗,Z A _A A是通过P A _A A计算得来的,是公开的;
- 计算e ∗ ^* ∗=H v _v v( M ˉ \bar{M} Mˉ ∗ ^* ∗);
- 计算t=(r ∗ ^* ∗+s ∗ ^* ∗) mod n;
- N ∗ ^* ∗=(x 1 _1 1 ∗ ^* ∗,y 1 _1 1 ∗ ^* ∗)=[s ∗ ^* ∗]G+[t]P A _A A;
- 计算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(这两个相等)就是协商的密钥。
以发送两次为例,具体过程如下:
- A产生随机数 r A r_A rA;
- A计算 R A R_A RA=[ r A r_A rA]G=( x 1 x_1 x1, y 1 y_1 y1),发送给B;
- B产生随机数 r B r_B rB;
- B计算计算 R B R_B RB=[ r B r_B rB]G=( x 2 x_2 x2, y 2 y_2 y2);
- B计算 x 2 ˉ \bar{x2} x2ˉ= 2 w 2^w 2w+( x 2 x_2 x2 & ( 2 w 2^w 2w-1));
- B计算 t B t_B tB=( d B d_B dB+ x 2 ˉ \bar{x2} x2ˉ ⋅ \cdot ⋅ r B r_B rB)mod n;
- 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));
- 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获得的;
- 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);
- 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;
- 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));
- 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;
- 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));
- 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);
- 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);
- 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部分:数字签名算法