一种基于SM2算法的密钥分量托管方法和系统与流程

文档序号:11709958阅读:471来源:国知局
一种基于SM2算法的密钥分量托管方法和系统与流程

本发明涉及基于sm2公钥密码算法和密钥分割存储机制的密钥分量托管方法和系统,属于信息安全领域。



背景技术:

在互联网和云计算环境下,出现了大量与网络相关的应用,如网上银行、网上支付、网上购物和互联网医疗等,需要进行网上用户身份认证、网上操作确认和用户隐私保护,以保证网络应用的安全性。解决这种安全需求的最佳手段是使用公钥密码技术来实现数字签名和公钥加密。在使用公钥密码技术时,保证所使用私钥的安全则是关键所在。在通常情况下,为了保证私钥的存储安全和使用安全,用于签名和解密的私钥都要求保存在密码设备内,相应的密码运算也在密码设备内执行。所采用的密码设备在服务器端通常为密码机,在客户端为带cpu的usbkey和ic卡等。但在网络环境和手机移动终端等环境下,使用这些密码设备来保存密钥和执行密码运算就很不方便,因而出现了将密钥保存在手机文件中并在手机上执行密码运算的应用需求。这种软环境给密钥的存储安全和使用安全带来很大隐患。为了提高密钥存储和密码运算的安全性,可以采用密钥分割存储和多方联合计算的方式,将用户的私钥分割为几个分量,各个私钥分量分散保存在不同的密钥托管系统中,在需要使用私钥对一个消息作数字签名时,由多个密钥托管系统联合完成签名计算,最后形成的签名可使用用户端的公钥进行验证。同样地,在需要对用户端公钥加密后的密文进行解密时,由多个密钥托管系统联合完成对密文的解密计算,实现对加密消息的完整解密。针对国密sm2公钥密码算法,已经有了相应的密钥分割方法和联合签名算法(参见申请号为201710157604.0的专利),现在的需求是要建立安全高效的密钥托管系统,为广大用户提供私钥分量的托管服务。当需要密钥分量托管的用户量很大(例如达到亿级或十亿级水平)时,密钥托管系统必须耗费大量的存储资源和密码设备来保存用户的密钥和与用户相关的信息,必将大大降低系统的运行效率和服务水平。



技术实现要素:

本发明针对密钥分割与联合计算需要对大量私钥分量进行托管的应用需求,提出一种基于标识的私钥分量托管方法,并由此构造一种相应的密钥分量托管系统(partialkeyescrow,简称pke),解决大用户量场景下的用户私钥分量托管问题。采用的技术方案是,建立n(n≥1)个密钥分量托管系统,在每个密钥分量托管系统中生成一个主密钥,通过一种标识映射算法,在用户密钥生成阶段,密钥分量托管系统采用系统主密钥对用户提供的识别信息进行一种分散映射,生成对应的私钥分量,但不实际保存这个私钥分量;在用户需使用自已的私钥分量时,按同样的算法恢复用户的私钥分量后,再进行相关密码运算。这里所指的用户识别信息可以是用户标识、用户设置的pin码和用户端设备信息的一种组合或叠加。采用这种方案的有益效果是密钥分量托管系统不需要数据库软件系统和大量的密钥存储设备,对管理的用户数量没有限制,可以大大提高系统的运行效率和服务水平,并且安全性没有任何降低。

本发明所述基于sm2算法的密钥分量托管方法和系统所依托的密码算法为国密sm2公钥密码算法和sm3杂凑算法,与sm2相关的椭圆曲线参数按国密sm2算法标准设置。有限域上的椭圆曲线记为e(fq),其基点记为g,g的阶记为n,sm3杂凑函数记作h(x)。

本发明所述基于sm2算法的密钥分量托管方法和系统涉及到的实体包括用户和n(n≥1)个密钥分量托管系统,n个密钥分量托管系统分别记为pke[1],pke[2],…,pke[n]。在系统运行初期,密钥分量托管系统pke[i]随机生成1个系统主密钥mk[i]和1对sm2非对称密钥,系统主密钥mk[i]也可以用非对称密钥的私钥充当。每个用户面对n个密钥分量托管系统,针对每个密钥分量托管系统,用户需要提供不同的用户识别信息,一个用户的n个识别信息分别记为uid[1],uid[2],…,uid[n]。

所述密钥分量托管系统pke[i]使用一个密钥分量映射生成函数g(x,y),对于每个用户,通过对系统主密钥mk[i]和用户识别信息uid[i]的映射可生成一个私钥分量di=g(mk[i],uid[i]),且di∈[1,n-1]。

用户密钥分量托管的具体实现过程分为密钥生成和密钥使用两个阶段,而密钥生成又包含签名密钥生成和加密密钥生成,密钥使用又包含联合签名和联合解密。

一、签名密钥生成

签名密钥生成由所述用户和所述n个密钥分量托管系统协同完成,生成步骤如下:

第1步:所述用户以自已的标识、输入的pin码和硬件设备信息等构造n个用户识别信息uid[1],uid[2],…,uid[n],再设置初始值qn+1=g。

第2步:对于i=n,n-1,…,1,所述用户依次与pke[i]交互执行:

(2a)所述用户以pke[i]的公钥对uid[i]加密生成一个密文c[i],发送c[i]和qi+1到pke[i]。

(2b)所述pke[i]使用私钥对c[i]解密获取所述用户uid[i],计算di=g(mk[i],uid[i]),qi=(di)-1qi+1,回送qi到用户端,将di作为用户的第i个签名私钥分量,但不需保存。

(2c)所述用户保存qi。

第3步:所述用户随机选取d0∈[1,n-1],计算q0=(d0)-1q1,q=q0-g,将d0作为用户端的签名私钥分量保存,将q作为用户的实际签名公钥保存,同时保存q0。

通过上述步骤生成的用户实际签名私钥d=(d0d1d2…dn)-1-1,实际签名公钥q=dg。实际签名私钥在生成过程中并未出现,且对用户和n个密钥分量托管系统都不可知。用户和n个密钥分量托管系统对各自生成的签名私钥分量具有完全自主权,其他用户或任何第三方都不能获取其签名私钥分量的信息。

二、加密密钥生成

所述加密密钥主要用于对消息作公钥加密和私钥解密,由所述用户和所述n个密钥分量托管系统协同完成,生成步骤如下:

第1步:所述用户以自已的标识、输入的pin码和硬件设备信息等构造n个用户识别信息uid’[1],uid’[2],…,uid’[n],再设置初始值q’n+1=g。

第2步:所述用户设置初始值q’n+1=g,对于i=n,n-1,…,1,依次与pke[i]交互执行:

(2a)所述用户以pke[i]的公钥对uid’[i]加密生成一个密文c[i],发送c[i]和q’i+1到pke[i]。

(2b)所述pke[i]使用私钥对c[i]解密获取所述用户uid’[i],计算d’i=g(mk[i],uid’[i]),q’i=d’iq’i+1,回送q’i到用户端,将d’i作为用户的第i个加密私钥分量,但不需保存。

第3步:所述用户随机选取d’0∈[1,n-1],计算q’0=d’0q1,q’=q’0,将d’0作为用户端的加密私钥分量保存,将q’作为用户的实际加密公钥保存。

通过上述步骤生成的用户实际加密私钥d’=d’0d’1d’2…d’n,实际加密公钥q’=d’g。实际加密私钥在生成过程中并未出现,且对用户和n个密钥分量托管系统都不可知。用户和n个密钥分量托管系统对各自生成的私钥分量具有完全自主权,其他用户不能获取其私钥分量的信息。

三、联合签名

本发明所述联合签名是指用户需要对消息作数字签名时,由用户和n个密钥分量托管系统联合按序完成对消息的签名,且签名结果为符合sm2标准的普通签名,签名接收方可以使用用户的实际签名公钥进行验证。

所述签名方法涉及到用户和n个密钥分量托管系统。所述用户具有签名私钥分量d0,所述密钥分量托管系统pke[i]具有签名私钥分量di,所述用户的实际签名公钥为q=((d0d1…dn)-1–1)g。

设待签名的消息为m,e=h(z||m)是对消息m的摘要值,其中z是与用户公钥和用户标识有关的信息。首先由用户和n个密钥分量托管系统按次序联合生成一对随机密钥对,再按相反的次序联合完成对摘要值e的sm2签名。所述多方联合签名步骤如下。

第1步:所述用户以自已的标识、输入的pin码和硬件设备信息等重新构造n个用户的识别信息uid[1],uid[2],…,uid[n],再选择随机数k0,计算r0=k0q0。

第2步:对于i=1,2,…,n,所述用户依次与pke[i]交互执行:

(2a)用户发送ri-1和qi到pke[i];

(2b)pke[i]随机选取ki∈[1,n-1],计算ri=ri-1+kiqi,回送ri到用户;

第3步:设rn=(x1,y1),所述用户计算r=(e+x1)(modn),并记sn+1=r。

第4步:对于i=n,n-1,…,1,所述用户依次与pke[i]交互执行:

(4a)所述用户以所述pke[i]的公钥对uid[i]|ri加密生成一个密文c[i],发送c[i]和si+1到pke[i];

(4b)所述pke[i]对c[i]作私钥解密获取uid[i]和ri’,验证ri’=ri是否成立,若成立,再计算签名私钥分量di=g(mk[i],uid[i])和部分签名si=ki+si+1di(modn),回送所述部分签名si到用户端;

(4c)所述用户在收到所述pke[i]的部分签名si后,计算r’=ri-1+siqi–rg,检验r’=rn是否成立,若成立,则接受pke[i]的部分签名si。

第5步:所述用户计算s=k0+s1d0–r(modn),生成最终签名(r,s)。

按此步骤生成的签名(r,s)可以使用公钥q按sm2签名的验证算法进行验证,具体的证明过程可参见申请号为201710157604.0的专利。

四、联合解密

当用户需要对使用用户的加密公钥加密的密文解密时,可由用户和n个密钥分量托管系统联合完成对密文的解密。

所述解密方法涉及到用户和n个密钥分量托管系统。用户具有加密私钥分量d’0,密钥分量托管系统pke[i]具有加密私钥分量d’i,用户的实际加密私钥为d’=d’0d’1…d’n(modn),实际加密公钥为q’=(d’0d’1…d’n)g。

设待解密的密文为c1||c2||c3,其中c1是一个椭圆曲线点。按照sm2解密算法,用户需要首先计算d=d’c1,然后再进行其它解密步骤。由用户和n个密钥分量托管系统联合完成解密的关键点就是联合计算d=d’c1。所述多方联合解密方案的步骤如下。

第1步:所述用户以自已的标识、输入的pin码和硬件设备信息等重新构造用户的识别信息uid’[1],uid’[2],…,uid’[n],再随机选取k0∈[1,n-1],且k0≠(d’0)-1,计算dn+1=k0c1。

第2步:对于i=n,n-1,…,1,所述用户依次与所述pke[i]交互执行:

(2a)所述用户从所述pke[i]获取一个随机数r[i]。

(2b)所述用户以所述pke[i]的公钥对uid’[i]||r[i]加密生成一个密文c[i],发送di+1和c[i]到pke[i]。

(2c)所述pke[i]对c[i]作私钥解密获取uid’[i]和r’[i],验证r’[i]=r[i]是否成立,若成立,计算d’i=g(mk[i],uid’[i])(modn)和di=d’idi+1,回送di到用户端。

第3步:所述用户计算d=(k0)-1d’0d1。

第4步:由于(k0)-1d’0d1=(k0)-1(d’0d’1…d’n)k0c1=d’c1,所以通过联合计算得出的d正是私钥解密所需要的计算结果,再按sm2解密算法的后续步骤即可解出明文。

附图说明

为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

图1为本发明所述密钥分量托管系统与用户端关系结构图。

图2为本发明所述密钥分量托管系统内部结构图。

图3为本发明所述签名密钥生成流程图。

图4为本发明所述加密密钥生成流程图。

图5为本发明所述联合签名流程图。

图6为本发明所述联合解密流程图。

具体实施方式

下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

本发明提出了一种基于sm2算法的密钥分量托管方法和系统,下面根据附图详细说明本发明的具体实施方式。

本发明所述基于sm2算法的密钥分量托管方法和系统所依托的密码算法为国密sm2公钥密码算法和sm3杂凑算法,与sm2相关的椭圆曲线参数按国密sm2算法标准设置。有限域上的椭圆曲线记为e(fq),其基点记为g,g的阶记为n,sm3杂凑函数记作h(x)。

图1所示为基于sm2算法的密钥分量托管系统的整体结构图。整个系统由n(n≥1)个密钥分量托管系统和众多用户端组成,用户端个数不受限制。每个用户端面对n个密钥托管系统,用户端私钥在生成时即被分割成n+1个分量,分别由用户端和n个密钥分量托管系统管理。密钥分量托管系统所管理的用户端私钥分量并不实际保存,而是通过一种映射算法,由密钥分量托管系统的系统主密钥和用户端的识别信息计算得出,在密钥生成阶段确定,在密钥使用阶段重新计算后恢复,使用完成后自动销毁。这种密钥分量托管方式的有益效果是不需要实际存储用户端私钥分量,节省大量的存储资源和密码设备,对用户端数量没有限制,大大提高系统的运行效率和服务水平。

图2所示是密钥分量托管系统的内部结构。所述密钥分量托管系统由服务单元、密钥生成单元、签名运算单元、解密运算单元构成。服务单元接受用户端请求,与用户端之间进行安全通信,对用户端身份进行确认,为用户端提供密钥生成、联合签名和联合解密服务。密钥生成单元采用系统主密钥对用户端提供的识别信息进行一种分散映射,在用户端密钥生成阶段和用户端密钥使用阶段,为用户端生成或恢复私钥分量。签名运算单元执行联合签名运算,以用户端的私钥分量对所述消息摘要值进行部分签名运算。解密运算单元执行联合解密运算,以用户端的私钥分量对所述数据进行部分解密运算。

为帮助理解本发明的实质内容,图3到图6给出了具体的密钥生成和密钥使用的实施步骤,并给出一个具体的映射函数g(mk,uid)=h(mk||uid)(modn),其中h(x)为sm3杂凑函数。

图3所示为本发明所述签名密钥生成流程,包括以下几个步骤:

步骤(1):所述用户端设置用户端识别信息uid[i],再设置初始公钥参数qn+1=g。

步骤(2):所述用户端以pke[n]的公钥对uid[n]加密,发送加密的uid[n]和qn+1到pke[n]。pke[n]使用私钥解密获取所述用户端uid[n],计算dn=h(mk[n]||uid[n])(modn),qn=(dn)-1qn+1,回送qn到用户端,将dn作为用户端的第n个签名私钥分量,但不需要保存。

步骤(3):对于i=n-1,…,2,所述用户端以pke[i]的公钥对uid[i]加密,发送加密的uid[i]和qi+1到pke[i]。pke[i]使用私钥解密获取所述用户端uid[i],计算di=h(mk[i]||uid[i])(modn),qi=(di)-1qi+1,回送qi到用户端,将di作为用户端的第i个签名私钥分量,但不需要保存。

步骤(4):所述用户端以pke[1]的公钥对uid[1]加密,发送加密的uid[1]和q2到pke[1]。pke[1]使用私钥解密获取所述用户端uid[1],计算d1=h(mk[1]||uid[1])(modn),q1=(d1)-1q2,回送q1到用户端,将d1作为用户端的第1个签名私钥分量,但不需要保存。

步骤(5):所述用户端随机选取d0∈[1,n-1],计算q0=(d0)-1q1,q=q0-g,将d0作为用户端的签名私钥分量保存,将q作为用户端的实际签名公钥保存,同时保存{q0,q1,…,qn}。

图4所示为本发明所述加密密钥生成流程,包括以下几个步骤:

步骤(6):所述用户端以自已的标识、输入的pin码和硬件设备信息等构造一组用户端识别信息,并将所述用户端识别信息记为uid’[i],再设置初始值q’n+1=g。

步骤(7):所述用户端以pke[n]的公钥对uid’[n]加密,发送加密的uid’[n]和q’n+1到pke[n]。pke[n]使用私钥解密获取所述用户端uid’[n],计算d’n=h(mk[n]||uid’[n])(modn),q’n=d’nqn+1,回送q’n到用户端,将d’n作为用户端的第n个加密私钥分量,但不需要保存。

步骤(8):对于i=n-1,…,2,所述用户端以pke[i]的公钥对uid’[i]加密,发送加密的uid’[i]和q’i+1到pke[i]。pke[i]使用私钥解密获取所述用户端uid’[i],计算d’i=h(mk[i]||uid’[i])(modn),q’i=d’iqi+1,回送q’i到用户端,将d’i作为用户端的第i个加密私钥分量,但不需要保存。

步骤(9):所述用户端以pke[1]的公钥对uid’[1]加密,发送加密的uid’[1]和q’2到pke[1]。pke[1]使用私钥解密获取所述用户端uid’[1],计算d’1=h(mk[1]||uid’[1])(modn),q’1=d’1q2,回送q’1到用户端,将d’1作为用户的第1个加密私钥分量,但不需要保存。

步骤(10):所述用户端随机选取d’0∈[1,n-1],计算q’0=d’0q1,q’=q’0,将d’0作为用户端的加密私钥分量保存,将q’作为用户端的实际加密公钥保存。

图5所示为本发明所述联合签名流程,包括以下几个步骤:

步骤(11):所述用户端以自已的标识、输入的pin码和硬件设备信息等重新构造用户端的识别信息uid[i],再随机选取k0∈[1,n-1],计算r0=k0q0。设待签名的消息为m,所述用户端计算摘要值e=h(z||m),其中z为所述用户端的标识信息和公钥信息。

步骤(12):所述用户端发送r0和q1到pke[1],pke[1]随机选取k1∈[1,n-1],计算r1=r0+k1q1,回送r1到用户端。

步骤(13):对于i=2,…,n-1,所述用户端发送ri-1和qi到pke[i],pke[i]随机选取ki∈[1,n-1],计算ri=ri-1+kiqi,回送ri到用户端。

步骤(14):所述用户端发送rn-1和qn到pke[n],pke[n]随机选取kn∈[1,n-1],计算rn=rn-1+knqn,回送rn到用户端。

步骤(15):设rn=(x1,y1),所述用户端计算r=(e+x1)(modn)。

步骤(16):所述用户端以所述pke[n]的公钥对uid[n]||rn加密,连同r发送到pke[n]。所述pke[n]用私钥解密获取uid[n]和ri’,验证r’n=rn是否成立,若成立,再计算签名私钥分量dn=h(mk[n]||uid[n])(modn)和部分签名sn=kn+rdi(modn),回送所述部分签名sn到用户端。

步骤(17):所述用户端在收到所述pke[n]的部分签名sn后,计算r’=rn-1+snqn–rg,检验r’=rn是否成立,若成立,则接受所述pke[n]的部分签名sn。

步骤(18):对于i=n-1,…,2,所述用户端以所述pke[i]的公钥对uid[i]||ri加密,连同si+1发送到pke[i]。所述pke[i]用私钥解密获取uid[i]和ri’,验证ri’=ri是否成立,若成立,再计算签名私钥分量di=h(mk[i]||uid[i])(modn)和部分签名si=ki+si+1di(modn),回送所述部分签名si到用户端。所述用户端在收到所述pke[i]的部分签名si后,计算r’=ri-1+siqi–rg,检验r’=rn是否成立,若成立,则接受pke[i]的部分签名si。

步骤(19):所述用户端以所述pke[1]的公钥对uid[1]||r1加密,连同s2发送到pke[1]。所述pke[1]用私钥解密获取uid[1]和r1’,验证r1’=r1是否成立,若成立,再计算签名私钥分量d1=h(mk[1]||uid[1])(modn)和部分签名s1=k1+s2d1(modn),回送所述部分签名s1到用户端。

步骤(20):所述用户端在收到所述pke[1]的部分签名s1后,计算r’=r0+s1qi–rg,检验r’=rn是否成立,若成立,则接受pke[1]的部分签名s1。所述用户端再计算s=k0+s1d0–r(modn),生成最终签名(r,s)。

图6所示为本发明所述联合解密流程,包括以下几个步骤:

步骤(21):所述用户端以自已的标识、输入的pin码和硬件设备信息等重新构造用户端的识别信息uid’[i],再随机选取k0∈[1,n-1],且k0≠(d’0)-1,计算dn+1=k0c1。

步骤(22):所述用户端以所述pke[n]的公钥对uid’[n]加密,连同dn+1发送到pke[n]。所述pke[n]用私钥解密获取uid’[n],计算d’n=h(mk[n]||uid’[n])(modn)和dn=d’ndn+1,回送dn到用户端。

步骤(23):对于i=n-1,…,2,所述用户端以所述pke[i]的公钥对uid’[i]加密,连同di+1发送到pke[i]。所述pke[i]用私钥解密获取uid’[i],计算d’i=h(mk[i]||uid’[i])(modn)和di=d’idi+1,回送di到用户端。

步骤(24):所述用户端以所述pke[1]的公钥对uid’[1]加密,连同d2发送到pke[1]。所述pke[1]用私钥解密获取uid’[1],计算d’1=h(mk[1]||uid’[1])(modn)和d1=d’1d2,回送d1到用户端。

步骤(25):所述用户端计算d=(k0)-1d’0d1。

步骤(26):所述用户端按sm2解密算法的后续步骤解出明文。

上述实施例仅从原理上描述了本发明的内容,应理解,此处给出的实施例和映射函数仅用于说明本发明的基本思想,并不能限制本发明所具有的一般性。任何对本发明实质内容所作的数学上的变形和修饰都包含在本发明专利的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1