前面介绍SM2无证书及隐式证书公钥机制下用户公私密钥对的Python实现(具体参看SM2隐式证书用户公私钥生成python代码实现_sm2 python 密钥生成-CSDN博客),可以看到需由用户和KGC(可信密钥生成中心)共同参与才能计算得到私钥dA。为方便展开过程详解,下面列出过程中涉及的相公私钥对。
公钥名称 | 对应私钥 | 作用说明 | 可见范围 |
UA:用户的部分公钥 | d‘A:用户的部分私钥 | WA=wG+UA dA=tA+d’A | 私钥d'A由用户侧随机生成,公钥UA发送给KGC,对第三方不可见 |
PA:用户的实际公钥 | dA:用户的私钥 | 用户使用dA/PA签名验签、加密解密 | 私钥dA由用户侧与KGC共同计算得到且仅由用户可见,PA允许任意方通过公开参数计算得到 |
Ppub:KGC主公钥 (CA签名公钥) | ms:KGC主私钥 (CA签名私钥) | 参与dA生成计算过程 | ms仅KGC可见,Ppub公开 |
WA:用户的声明公钥 (公钥还原数据) | - | PA=WA+Ppub | 任意方可得到公开的WA、Ppub、计算相关的参数及杂凑算法 |
用户声明公钥WA的引入使用户实际公钥PA不公开,而是通过相关参数计算得到,也正是这些参数保证可信用户身份。具体看用户实际公钥PA的计算过程如下:
PA = WA+Ppub = WA+ Hash(Xwa||Ywa||Hash(ENTLA||IDA||a||b||Xg||Yg||Xpub||Ypub))*Ppub
WA = wG+UA (其中w是KGC产生的随机数)
其中UA是用户部分公钥,IDA是用户标识,Xpub和Ypub则是KGC的主公钥Ppub,从而使PA同时具备用户和KGC的特征。
无证书机制不需要证书实体的参与,具体签名验签和加密解密过程如下:
(1)无证书机制签名验签过程
1.1 签名过程
输入:M - msg内容,IDA - 用户标识,WA - 声明公钥,Ppub - KGC主公钥,SM2椭圆曲线参数,dA - 用户私钥
计算:
HA = SM3(ENTLA||IDA||a||b||Xg||Yg||Xpub||Ypub)
e = SM3(HA||Xwa||Ywa||M)
KG=(X1,Y1),K为随机数
r = (e+X1)mod n
s = (K-rdA)/(dA+1)mod n
输出:(r,s)
1.2验签过程
输入:M - msg内容,IDA - 用户标识,WA - 声明公钥,Ppub - KGC主公钥,SM2椭圆曲线参数,签名值(r,s)
计算:
HA = SM3(ENTLA||IDA||a||b||Xg||Yg||Xpub||Ypub)
= SM3(Xwa||Ywa||HA)
PA = WA + Ppub = dA*G
e = SM3(HA||Xwa||Ywa||M)
sG + (r+S)PA = KG = (X1,Y1)
输出:R = (e + X1)mod n与r是否相同,若是则验签成功
(2)无证书机制加密解密过程
2.1加密过程
输入:M - msg内容,IDA - 用户标识,WA - 声明公钥,Ppub - KGC主公钥,SM2椭圆曲线参数
计算:
HA = SM3(ENTLA||IDA||a||b||Xg||Yg||Xpub||Ypub)
= SM3(Xwa||Ywa||HA)
PA = WA + Ppub = dA*G
C1 = kG,k为随机数
(X2,Y2)= kPA
C2 = M KDF(X2||Y2,mlen)
C3 = SM3(X2||M||Y2)
输出:C1||C3||C2
2.2解密过程
输入:dA - 用户私钥,C1||C3||C2
计算:
dA*C1 = dA*k*G = k*(dA*G) = k*PA = (X2,Y2)
M = C2 KDF(X2||Y2,mlen)
C3' = SM3(X2||M||Y2)
输出:C3'是否与C3相同,若是则明文为M
隐式证书公钥机制则需要遵循隐式证书格式生成证书实体,具体内容下次将讨论。