一种基于sm9算法的密钥应用方法
技术领域
1.本发明属于密钥应用技术领域,特别涉及一种基于sm9算法生成密钥进行加密、解密、签名、验签等应用方法。
背景技术:2.sm9作为一种基于标识的密码系统(identity
‑
based cryptograph,ibc),与pki密码体系相比在密钥管理上存在一定的不足。一方面,用户私钥由密钥生成中心基于用户标识生成,将导致用户不是其私钥的唯一拥有者;另一方面,由于用户的密钥基于用户标识生成,用户标识一般不可更改,导致sm9算法密钥更新、撤销困难,有待改进。
技术实现要素:3.本发明的目的,在于提供一种基于sm9算法的密钥应用方法,提供一种基于skgc和dkgc的sm9密钥安全管理机制,可解决sm9算法的密钥托管、更新、撤销问题。
4.为了达成上述目的,本发明的解决方案是:
5.一种基于sm9算法的密钥应用方法,包括如下步骤:
6.步骤s1,依照sm9算法的密钥生成规则,静态密钥管理中心skgc基于用户标识生成用户的静态密钥;
7.步骤s2,依照sm9算法的密钥生成规则,动态密钥管理中心dkgc通过对用户标识和给定动态变化量构建用户的动态标识,并基于用户动态标识生成用户的动态密钥;
8.步骤s3,用户基于通信对方的静态标识生成静态公钥,基于通信对方的动态标识生成动态公钥,并基于所述静态公钥和动态公钥实现加密或验签的操作;用户自静态密钥管理中心skgc获取静态私钥,自动态密钥管理中心dkgc获取动态私钥,并基于所述静态私钥和动态私钥实现解密或签名的操作;其中,相对应的加密和解密过程使用相同的密钥对,相对应的签名和验签使用相同的密钥对,且所述二密钥对不相同。
9.采用上述方案后,本发明采用基于隐私密钥机构的方案构建skgc和dkgc,skgc解决了sm9的密钥托管问题,dkgc解决sm9的密钥更新与撤销问题。
附图说明
10.图1是本发明的流程图;
11.图2是本发明中私钥提取的流程图;
12.图3是本发明中的加密流程图;
13.图4是本发明中的解密流程图;
14.图5是本发明中的签名流程图;
15.图6是本发明中的验签流程图。
具体实施方式
16.如图1所示,本发明提供一种基于sm9算法的密钥应用方法,包括如下步骤:
17.步骤s01,依照sm9算法的密钥生成规则,静态密钥生成中心skgc基于用户标识生成用户的静态密钥,该静态密钥包含加密密钥对和签名密钥对;
18.步骤s02,依照sm9算法的密钥生成规则,动态密钥管理中心dkgc通过对用户标识和给定动态变化量构建用户的动态标识,并基于用户动态标识生成用户的动态密钥,该动态密钥也包含加密密钥对和签名密钥对;
19.步骤s03,在静态密钥和动态密钥的共同作用下,完成sm9算法的加密、解密、签名和验签功能。
20.所述步骤s01中,静态密钥生成中心skgc采用基于密钥隐私机构的方案,解决了sm9的密钥托管问题,其系统设置和密钥提取的具体实现如下:
21.1)系统设置:
22.a、静态密钥生成中心skgc包含1个kgc和n个kpa,它们使用相同的q阶的群g1、g2和g
t
,双线性对e:g1×
g2→
g
t
,生成元p1∈g1和p2∈g2,密码杂凑函数h
v
,密码函数h1,用户id和私钥生成函数标识符hid,其中q为大素数,h
v
和h1为sm9标准中规定的函数;
23.b、kgc随机选取计算p
pub
=[s0]p1,每个kpa随机选择计算p
kpa
‑
i
=[s
i
]p2;
[0024]
c、设置
[0025]
公开系统参数m
pt
=(g1,g2,g
t
,e,p1,p2,p
pub
,p
kpa
‑
i
,g,h
v
,hid)。
[0026]
2)私钥提取:
[0027]
a、kgc分发用户私钥d0=s0(h0+s0)
‑1p2,其中h0=h1(h
v
,id||hid,q);
[0028]
b、用户生成随机数并计算x=[x]p2和d
′0=x
·
d0;
[0029]
c、对每个kpa,用户发送x和d
′0,要求kpa计算d
i
=s
i
·
d
′0,并通过验证
[0030]
e(h0p1+p
pub
,d
′0)=e(p
pub
,x)
[0031]
来检查用户发来的数据的合法性,而用户通过计算
[0032]
e(h0p1+p
pub
,d
i
)=e(p
pub
,p
kpa
‑
i
)
x
[0033]
来确认计算过程的正确性;
[0034]
d、a将n个kpa发来的结果相加得到:
[0035][0036]
e、通过下式去除盲因子,计算出用户的静态私钥d:
[0037]
d=x
‑1·
d
′
=(s1+s2+
…
+s
n
)s0(h0+s0)
‑1p2[0038]
所述步骤s02中的标识为动态标识,基于用户标识id和动态变量data的动态标识的具体生成方式如下:
[0039]
id
′
=id||data
[0040]
所述步骤s02中,动态密钥生成中心dkgc所采用的系统参数与skgc相同,具体的密
钥生成过程如下:
[0041]
a、dkgc随机选取计算t
pub
=[t0]p1;
[0042]
b、设置g
t
=e(t
pub
,p2);
[0043]
c、动态私钥为d
t
=t0·
(h
t
+t0)
‑1p2,h
t
=h1(h
v
,id
′
||hid,q);
[0044]
d、公开t
pub
和g
t
;
[0045]
步骤s03中所述的静态加密密钥和动态加密密钥在加密过程中的使用,需要对sm9算法作如下修改:
[0046]
a、在标准加密流程的第1步增加计算q
t
=h
t
p1+t
pub
;
[0047]
b、在标准加密流程的第3步增加计算c
t
=[r]q
t
;
[0048]
c、将标准加密流程第5步的计算改为
[0049]
d、在密钥派生函数的输入中增加c
t
,即k=kdf(c1||c
t
||w||id,klen);
[0050]
e、在输出的密文中增加c
t
,即密文为c=c1||c
t
||c3||c2;
[0051]
步骤s03中所述的静态密钥和动态密钥在解密过程中的使用,需要对sm9算法作如下修改:
[0052]
a、在标准解密流程的第1步增加c
t
的提取;
[0053]
b、将标准解密流程的第2步修改为w
′
=e(c1,d)
·
e(c
t
,d
t
);
[0054]
c、在密钥派生函数的输入中增加c
t
,即k
′
=kdf(c1||c
t
||w
′
||id,klen);
[0055]
步骤s03中所述的静态签名密钥和动态签名密钥在签名过程中的使用,需要对sm9算法作如下修改:
[0056]
a、将标准签名流程的第3步修改为
[0057]
b、在标准签名流程的第6步增加计算s2=[l]d
t
‑
s
,其中d
t
‑
s
为动态签名私钥;
[0058]
c、将标准签名流程的第7步的签名信息中增加s2,将签名改为:(h,s1||s2);
[0059]
步骤s03中所述的静态验签密钥和动态验签密钥在验签过程中的使用,需要对sm9算法作如下修改:
[0060]
a、在标准验签流程的第2步增加s2'的检验,即检验s2'∈g1是否成立;
[0061]
b、将标准验签流程的第4步修改为
[0062]
c、在标准验签流程的第5步增加计算h
t
=h1(id'||hid,q);
[0063]
d、在标准验签流程的第6步增加计算p
t
=[h
t
]p2+t
pub
‑
s
,其中t
pub
‑
s
为dkgc公开的签名参数;
[0064]
e、将标准验签流程的第4步修改为:u=e(s
′1,p)
·
e(s
′2,p
t
);
[0065]
以上所述的标准流程可参考“袁峰,程朝辉.sm9标识密码算法综述[j].信息安全研究,2016,2(11):1008
‑
1027.”。
[0066]
所述dkgc具备密钥更新的功能,具体实现方式如下:
[0067]
dkgc管理员可自由设定更新周期,假设预置时间密钥有效期为一周,密钥的更新过程是:dkgc基于用户的标识计算:id
′
=id||next
‑
week,然后重新计算:q
t
=h
t
p1+t
pub
(动态公钥),d
t
=t0·
(h
t
+t0)
‑1p2(动态私钥),即可为用户生成新的一周对应的动态密钥对。
[0068]
所述dkgc具备密钥撤销的功能,具体实现方式如下:
[0069]
对系统中已注销的用户或dkgc管理员需要主动撤销的用户,dkgc管理员可以停止向上述类型用户分发新的动态密钥对。由于密文(签名)发送方加密(签名)用到了动态公钥(动态私钥),密文(签名)接收方由于没有最新的动态私钥(动态公钥)就无法配合解密(验签)接收到的密文(签名消息),从而实现密钥撤销的功能。
[0070]
本发明中增加的skgc与dkgc是两套相互独立的密钥分发系统,skgc执行类似sm9算法中kgc的功能,dkgc独立运行以配合skgc完成相应的密码功能。因此,敌手攻破任一方系统都无法获得完整的静态和动态密钥对,而且要同时攻破两个系统的代价比较高昂。因此,本发明通过增加dkgc,可以实现用户私钥的双重保障,且不影响sm9原有的密钥系统架构,具备较好的鲁棒性、可延展性和功能耦合性,易于开展实际应用部署。
[0071]
以下通过一个具体实施例对本发明的技术方案进行详细说明。
[0072]
一、初始化
[0073]
步骤1:1个kgc、n个kpa和1个dkgc使用相同的素数q阶的群g1、g2和g
t
,双线性对e:g1×
g2→
g
t
,生成元p1∈g1和p2∈g2,用户id,密码杂凑函数h
v
和标识符hid以及密码函数h1、h2,其中h
v
、h1和h2均为sm9标准中规定的函数;
[0074]
步骤2:kgc主密钥对的生成包括:kgc随机选取作为主私钥,计算p
pub
=[s0]p1作为主公钥,其中表示素数q阶乘法群中的整数;
[0075]
步骤3:n个kpa主密钥对的生成包括:每个kpa随机选择作为主私钥,计算p
kpa
‑
i
=[s
i
]p2作为主公钥;
[0076]
步骤4:dkgc时间主密钥对的生成包括:dkgc随机选取作为时间主私钥,计算t
pub
=[t0]p1作为时间主公钥;
[0077]
步骤5:公开系统参数m
pt
如下:
[0078]
m
pt
=(g1,g2,g
t
,e,p1,p2,p
pub
,p
kpa
‑
i
,t
pub
,h
v
,hid)
[0079]
通过执行上述步骤1
‑
5,在skgc和dkgc中分别为用户生成用于加密、解密和签名、验签的密钥对。
[0080]
二、私钥提取(参考图2)
[0081]
步骤1:kgc验证s0是否满足(h1(h
v
,id||hid,q)+s0)modq=0;若满足,则kgc需重新生成s0,并计算和公开主公钥p
pub
;否则继续往下执行;
[0082]
步骤2:kgc分发用户私钥d0=s0(h0+s0)
‑1p2,其中:
[0083]
h0=h1(h
v
,id||hid,q)
[0084]
步骤3:用户生成随机数计算x=[x]p2和d
′0=x
·
d0;
[0085]
步骤4:对n个kpa,用户发送x和d
′0,要求kpa计算d
i
=s
i
·
d
′0,计算结果分别返回给用户。其中,kpa通过验证e(h0p1+p
pub
,d
′0)=e(p
pub
,x)来检查用户数据的合法性;用户通过计算e(h0p1+p
pub
,d
i
)=e(p
pub
,p
kpa
‑
i
)
x
来确认kpa计算结果的正确性;
[0086]
步骤5:用户将n个kpa发送来的计算结果相加得到:
[0087]
[0088]
步骤6:用户通过计算d=x
‑1·
d
′
去除盲因子,得到自己的私钥:
[0089]
d=(s1+s2+
…
+s
n
)s0(h0+s0)
‑1p2[0090]
步骤7:dkgc验证h
t
是否满足(h
t
+t0)modq=0;若满足,则dkgc需重新产生时间主私钥t0,否则继续往下执行。其中,h
t
=h1(h
v
,id
′
||hid,q);
[0091]
步骤8:用户计算d
t
=t0·
(h
t
+t0)
‑1p2得到自己的时间私钥;
[0092]
三、加密(参考图3)
[0093]
假设用户alice使用由用户bob提供的公钥对消息进行加密,与bob进行保密通信。
[0094]
步骤1:用户alice通过计算q
b
=h0p1+p
pub
=h1(h
v
,id
b
||hid,q)p1+p
pub
得到用户bob的加密公钥q
b
,dkgc计算q
bt
=h
t
p1+t
pub
=h1(h
v
,id
′
b
||hid,q)p1+t
pub
并发送q
bt
给用户alice,其中,h
t
=h1(h
v
,id
′
b
||hid,q),密码函数h1()与sm9中所采用的一致;
[0095]
步骤2:用户alice产生随机数:r∈[1,q
‑
1];
[0096]
步骤3:用户alice计算:c1=[r]q
b
,c
t
=[r]q
bt
;
[0097]
步骤4:用户alice计算:g
t
=e(t
pub
,p2);
[0098]
步骤5:用户alice计算:
[0099]
步骤6:根据用户选择的加密方式进行计算;如果是基于密钥派生函数的序列密码算法,则计算整数klen=mlen+k2_len,然后计算k=kdf(c1||c
t
||w||id
b
,klen),令k1为k最左边的mlen比特,k2为剩下的k2_len比特,若k1为全0比特串,则返回步骤2,否则计算如果是结合基于密钥派生函数的分组密码算法,则计算整数klen=k1_len+k2_len,然后计算k=kdf(c1||c
t
||w||id
b
,klen),令k1为k最左边的k1_len比特,k2为剩下的k2_len比特,若k1为全0比特串,则返回步骤32,否则计算c2=enc(k1,m);其中,比特串m是待发送的消息,mlen为m的比特长度,k1_len为分组密码算法中密钥k1的比特长度,k2_len为函数mac(k2,z)中密钥k2的比特长度;
[0100]
步骤7:用户alice计算c3=mac(k2,c2);
[0101]
步骤8:用户alice输出密文c=c1||c
t
||c3||c2给用户bob;
[0102]
四、解密(参考图4)
[0103]
假设用户alice接收到用户bob发来的经用户alice的公钥加密后的消息,用户bob将使用其私钥对接收到的消息进行解密。
[0104]
步骤1:用户bob从收到的密文c中取出比特串c1、c
t
,验证c1∈g1、c
t
∈g1是否成立,若不成立则报错并退出,否则继续执行以下步骤;
[0105]
步骤2:用户bob计算w
′
=e(c1,d
b
)
·
e(c
t
,d
bt
);
[0106]
步骤3:根据用户选择的加密方式进行计算;如果是基于密钥派生函数的序列密码算法,则计算整数klen=mlen+k2_len,然后计算k
′
=kdf(c1||c
t
||w
′
||id
b
,klen),令k
′1为k
′
最左边的mlen比特,k
′2为剩下的k2_len比特,若k
′1为全0比特串,则报错并退出,否则计算明文如果是基于密钥派生函数的分组密码算法,则计算整数klen=k1_len+k2_len,然后计算k
′
=kdf(c1||c
t
||w
′
||id
b
,klen),令k
′1为k
′
最左边的k1_len比特,k
′2为剩下的k2_len比特,若k
′1为全0比特串,则报错并退出,否则计算明文
其中,mlen为密文c=c1||c
t
||c3||c2中c2的比特长度,k1_len为分组密码算法中k1密钥的比特长度,k2_len为函数mac(k2,z)中密钥k2的比特长度;
[0107]
步骤4:用户bob计算u=mac(k
′2,c2),从c中取出比特串c3,若u≠c3,则报错并退出,否则继续执行以下步骤;
[0108]
步骤5:用户bob输出明文m
′
;
[0109]
五、签名(参考图5)
[0110]
设用户bob对比特串n进行签名,并且用户bob已知sm9的系统参数、签名主公钥、签名私钥。
[0111]
步骤1:用户bob计算g
t
=e(p1,t
pub
‑
s
);
[0112]
步骤2:用户bob产生随机数r∈[1,q
‑
1];
[0113]
步骤3:用户bob计算
[0114]
步骤4:用户bob计算整数h=h2(n||w,q),其中比特串n是待签名消息;
[0115]
步骤5:用户bob计算整数l=(r
‑
h)modq,若l=0则返回步骤2;
[0116]
步骤6:用户bob计算s1=[l]d
b
‑
s
、
[0117]
步骤7:用户bob输出消息n的签名为(h,s1||s2);
[0118]
六、验签(参考图6)
[0119]
设用户alice对用户bob的签名进行验证,并且用户alice已知sm9的系统参数、签名主公钥、用户bob的标识信息、接收到的消息n及签名信息(h,s1||s2)。
[0120]
步骤1:用户alice对(h,s1||s2)验证h∈[1,q
‑
1]是否成立,若不成立则验证不通过,否则继续执行以下步骤;
[0121]
步骤2:用户alice验证s1∈g2、s2∈g2是否成立,若不成立则验证不通过,否则继续执行以下步骤;
[0122]
步骤3:用户alice计算g
t
=e(p1,t
pub
‑
s
);
[0123]
步骤4:用户alice计算
[0124]
步骤5:用户alice计算h0=h1(id
b
||hid,q)、h
t
=h1(id
′
b
||hid,q);
[0125]
步骤6:用户alice计算p=[h0]p2+p
pub
‑
s
、p
t
=[h
t
]p2+t
pub
‑
s
;
[0126]
步骤7:用户alice计算u=e(s1,p)
·
e(s2,p
t
);
[0127]
步骤8:用户alice计算w
′
=u
·
t;
[0128]
步骤9:用户alice计算整数h2=h2(n||w
′
,q),检验h2=h是否成立,若成立则验证通过,否则验证不通过。
[0129]
以上实施例仅为说明本发明的技术思想,不能以此限定本发明的保护范围,凡是按照本发明提出的技术思想,在技术方案基础上所做的任何改动,均落入本发明保护范围之内。