一种数字签名生成方法及系统与流程

文档序号:11436240阅读:321来源:国知局

本发明属于信息安全技术领域,特别是一种sm2数字签名的秘密共享生成方法及系统。



背景技术:

在公开密钥密码体制中,为了保障用户私钥的安全性,用户的私钥通常是存储在专门的密码硬件中使用,如存储在usbkey、smartcard中使用,且私钥不能从密码硬件中导出。但是,在有些情况下,比如,由于成本的原因,或者由于没有合适的密码硬件(如移动通信终端),使得用户无法依赖密码硬件来存储私钥、以及使用私钥进行密码运算。对于这种情况,目前最常用的方法是使用纯软件的密码模块,并将用户私钥保存在用户计算装置本地的永久存储介质中(如个人电脑的磁盘、移动通信终端内的电子盘),并通过pin(personalidentificationnumber)码对私钥进行保护。当需要使用用户私钥时,软件密码模块从用户计算装置的永久存储介质读取用户私钥(必要时要求用户输入pin码),然后进行密码运算。这种采用纯软件密码模、将用户私钥保存在用户计算装置本地的方式存在用户私钥泄露的风险,比如,攻击者通过木马窃取保存在用户计算装置中的用户私钥,破解用户保护私钥的pin码,从而获得用户私钥;而且这种采用纯软件密码模块的方式,用户私钥最终需以明文形式导入到内存中使用,这样攻击者有可能通过一定的攻击方式,窃取存放在内存中的用户私钥。如何在不采用密码硬件的情况下,安全存储和使用用户私钥具有现实的需求,对此问题的解决具有很好的实际应用意义。

对此问题常见的解决方案是,将用户私钥通过一定的方式分割成多份,每份称为秘密份额,然后将每份秘密份额存储到不同的计算装置中,尤其是将部分秘密份额存放在安全保护措施到位、安全条件好的专业的密码服务机构的在线密码服务系统中;当密码应用程序、系统需要使用用户私钥进行密码运算时,如进行数字签名或数据解密时,多个计算装置分别使用自己的秘密份额进行密码运算,最后将各装置计算的结果合并,形成最后的、使用用户私钥进行密码运算的结果(数字签名或数据解密的结果)。

sm2是由国家密码管理局颁布的一种椭圆曲线公钥密码算法(参见《sm2椭圆曲线公钥密码算法》规范,国家密码管理局,2010年12月),基于此算法能实现数字签名、密钥交换及数据加密。但是,由于sm2算法独特的数字签名运算方式,通常的秘密共享(分割)方式及对应的基于秘密共享的密码运算方式,无法适合于使用sm2私钥进行数字签名的情形。



技术实现要素:

本发明的目的是提出一种基于秘密分割(或共享)的sm2数字签名生成方法,以满足没有密码硬件的情况下,安全使用用户sm2私钥进行数字签名的需求。

针对本发明的目的,本发明提出的技术方案是一种sm2数字签名的秘密共享生成方法。

在以下对本发明技术方案的描述中,若p、q是椭圆曲线点群中的元素(点),则p+q表示p、q的点加,[k]p表示k个椭圆曲线点p的点加,即p+p+...+p(共有k个p);省略号“...”,表示多个同样(类型)的数据项或多个同样的运算;c-1表示整数c的模n乘法逆(即cc-1modn=1);多个整数相乘(包括整数符号相乘、常数与整数符号相乘),在不产生二义性的情况下,省略掉乘号“·”,如k1·k2简化为k1k2,3·c,简化位3c;modn表示模n运算(modulooperation),对应于《sm2椭圆曲线公钥密码算法》规范(国家密码管理局,2010年12月)中的modn;还有,模n运算的算子modn的优先级是最低的,如a+bmodn等同于(a+b)modn,a-bmodn等同于(a-b)modn,abmodn等同于(ab)modn。

本发明的方法具体如下。

所述方法涉及两个分别称为装置1、装置2的装置;

装置1分配有秘密份额d1,装置2分配有秘密份额d2,其中d1、d2是[1,n-1]区间内的整数,而n是sm2密码运算所使用的椭圆曲线点群的阶,也即sm2密码运算所使用的椭圆曲线点群的基点g的阶(sm2密码运算所使用的椭圆曲线点群是指由基点g生成的循环群);

两个装置的秘密份额与用户的sm2私钥da满足关系:

(1+da)-1=d1d2modn,其中,(1+da)-1是(1+da)的模n乘法逆(即(1+da)-1(1+da)modn=1);

(两个装置都不拥有da;进行秘密分割、发放初始化操作的可以是一个专门的密钥管理系统,或者是用户计算装置中的一个密码模块、密钥管理工具);

当需要使用用户的sm2私钥da针对消息m进行数字签名时,两个装置按如下方式进行数字签名的生成(需要使用用户的sm2私钥da、针对消息m进行数字签名的主体可以是调用这两个装置的密码应用程序、系统或密码模块,或者两个装置之一中的密码应用程序、系统):

首先,两个装置通过交互计算得到q=[b(k1+k2)]g,r=(e+x1)modn,且得到的r、q满足:r≠0且[r]g+q不是sm2椭圆曲线点群的零元(无穷远点),其中k1、k2是计算q的过程中装置1、装置2分别在区间[1,n-1]中随机选择的整数,b是区间[1,n-1]中的只有装置1才知道的整数常数(秘密),或者b是计算q的过程中装置1在区间[1,n-1]中随机选择的一个整数,g是sm2椭圆曲线点群的基点,x1取自(x1,y1)=q,e是从用户标识和消息m导出的杂凑值(即散列值)(本发明中的b不是椭圆曲线方程的参数b;按sm2算法,e是从用户标识ida等参数导出的杂凑值za同消息m合并后的数据的杂凑值,参见sm2规范);

之后,装置1计算s1=(k1+b-1r)modn,然后将s1发送给装置2;

装置2接收到装置1的s1后,计算s2=d2(k2+s1)modn,然后将s2发送给装置1;

装置1接收到装置2的s2后,计算s=(d1bs2-r)modn;(r,s)就是生成的针对消息m的数字签名。

这里r是非保密数据,根据需要可在两个装置之间传递。

若b是区间[1,n-1]中的只有装置1才知道的整数常数(秘密),则在数字签名生成之前的初始化过程中,(由初始化工具或系统或用户计算装置中的密码模块或密钥管理工具)计算gb=[b]g,装置1、装置2分别保存gb;在针对消息m进行数字签名时,装置1和装置2分别从本地保存的数据中获得gb;

若b是计算q的过程中装置1在区间[1,n-1]中随机选择的一个整数,则在针对消息m进行数字签名时,装置1在区间[1,n-1]中随机选择一个整数b,计算得到gb=[b]g,然后将gb发送给装置2,由此装置1和装置2都获得gb。

在针对消息m进行数字签名时,两个装置按如下方式,或者按与如下方式等同的方式,通过交互计算得到q=[b(k1+k2)]g,r=(e+x1)modn,且得到的r、q满足:r≠0且[r]g+q不是sm2椭圆曲线点群的零元(无穷远点):

首先,装置1和装置2分别从本地保存的数据中或通过实时计算和交换获得gb,其中gb=[b]g;

之后,装置1在区间[1,n-1]中随机选择一个整数k1,计算得到q1=[k1]gb;

装置2在区间[1,n-1]中随机选择一个整数k2,计算得到q2=[k2]gb,然后将q2发送给装置1;

装置1接收到q2后,计算q=q1+q2,此时q=[b(k1+k2)]g;

装置1检查q是否是sm2椭圆曲线点群的零元(无穷远点),若是,则装置1重新选择k1,重新计算q1=[k1]gb,重新计算q=q1+q2,重新判断q是否是零元,重复此过程,直到q不是零元为止;若q不是零元,则装置1取(x1,y1)=q,计算r=(e+x1)modn;

若计算得到的r、q满足:r≠0且[r]g+q不是sm2椭圆曲线点群的零元(无穷远点),则q、r的计算完成;否则,装置1重新在区间[1,n-1]中随机选择一个整数k1,然后重新计算q1,q=q1+q2,重新判断q是否是零元,以及在q不是零元时计算r,重复此过程,直到r≠0且[r]g+q不是sm2椭圆曲线点群的零元(无穷远点);

或者,若r=0或[r]g+q是sm2椭圆曲线点群的零元(无穷远点),则两个装置一起从头重新进行q、r的计算(即装置1和装置2重新得到gb,装置1重新选择k1,装置2重新选择k2,然后计算q=q1+q2,判断q是否是零元,以及在q不是零元时计算r=(e+x1)modn),重复此过程,直到r≠0且[r]g+q不是sm2椭圆曲线点群的零元(无穷远点);

所述等同的方式,即同样能得到q=[b(k1+k2)]g、并依据q计算得到r,且使得r、q满足r≠0且[r]g+q不是sm2椭圆曲线点群的零元的方式。

若装置1在计算得到q、r时,仅检查r是否为零,不检查[r]g+q是否是sm2椭圆曲线点群的零元(无穷远点),且仅在r=0时重新进行q、r的计算(只要r≠0就不重新进行q、r计算),则:

装置1计算得到s后,若检查发现(s+r)modn=0,则放弃计算得到的s,装置1重新在区间[1,n-1]中随机选择一个整数k1,重新计算q1,q=q1+q2,重新判断q是否是零元,以及在q不是零元时计算r=(e+x1)modn,之后两个装置重新计算s1、s2、s,重复此过程,直到(s+r)modn≠0;

或者装置1计算得到s后,若检查发现(s+r)modn=0,则两个装置一起从头重新进行q、r的计算(即装置1和装置2重新得到gb,装置1重新选择k1,计算q1,装置2重新选择k2,计算q2,然后装置1重新计算q=q1+q2,判断q是否是零元,以及在q不是零元时计算r=(e+x1)modn),两个装置重新计算s1、s2、s,直到(s+r)modn≠0。

在以上方案中,若b是计算q的过程中装置1在区间[1,n-1]中随机选择的一个整数,则k1既可以是计算q1时装置1在区间[1,n-1]中随机选择的一个整数,也可以是区间[1,n-1]中的只有装置1才知道的整数常数(每次计算q1时都使用同一个k1)。

在本发明的方案中,用户的公钥仍然是dag,在进行数字签名前计算并公开发布。

从以上发明内容可以看到,基于本发明的sm2数字签名的秘密共享生成方法,当用户没有硬件密码装置存放sm2私钥时,可以将与用户的私钥da相关的秘密数据(1+da)-1分割成两份秘密份额,分别存放在不同密码服务机构的密码服务系统,在需要使用用户的sm2私钥对消息进行签名时,两个机构的密码服务系统分别使用各自具有的秘密份额,通过交互最后生成针对消息的数字签名;或者,两份秘密份额中的一份存放在一个密码服务机构的密码服务系统中,另一份存放到用户的计算装置中,当在需要使用用户的sm2私钥对消息进行签名时,用户的计算装置和密码服务机构的密码服务系统分别使用各自具有的秘密份额,通过交互最后生成针对消息的数字签名;由于攻击者同时获得在两个不同密码服务机构的密码服务系统中的秘密份额,或者同时获得在用户计算装置和密码服务机构的密码服务系统中的秘密份额的可能性极低,这就大大提高了在没有密码硬件的情况下,用户sm2私钥使用的安全性。

具体实施方式

下面结合实施例对本发明作进一步的描述。以下实施例不作为对本发明的限定。

将秘密(1+da)-1分割为d1、d2,且(1+da)-1=d1d2modn是很容易的:在[1,n-1]中随机选择一个整数作为d1,之后,计算d2=(d1)-1(1+da)-1modn即可。

实施例1、

在此实施例中,用户的计算装置(如个人电脑、移动通信终端)是本发明的sm2数字签名分割生成方法中的两个装置中的一个(装置1或装置2),另一个装置是一个密码服务系统中的密码服务器(作为装置2或装置1);用户的计算装置和密码服务器都不保存用户的sm2私钥da、(1+da)-1;(1+da)-1的秘密份额d1、d2,一份保存在用户计算装置中,另一份保存在密码服务器中;当用户计算装置中的密码应用程序或系统要使用用户的sm2私钥da对消息进行签名时,用户计算装置(实际上,通常是用户计算装置中的密码模块)与密码服务器交互,应用本发明的方法、使用秘密份额d1、d2生成消息的数字签名。

实施例2、

在此实施例中,本发明的sm2数字签名分割生成方法中的一个装置是一个机构的密码服务系统中的密码服务器,另一个装置是另一个机构的密码服务系统中的密码服务器;用户计算装置以及两个密码服务机构的密码服务器都不保存用户的sm2私钥da、(1+da)-1;(1+da)-1的两份秘密份额d1、d2,分别保存在两个密码服务系统的密码服务器中;当用户计算装置中的密码应用程序或系统要使用用户的sm2私钥da对消息进行签名时,用户计算装置(通常是用户计算装置中的密码模块)将请求发送到一个密码服务系统,之后两个密码服务系统的密码服务器通过交互,应用本发明的方法、使用秘密份额d1、d2生成消息的数字签名,然后将生成的签名被返回给用户计算装置;在数字签名生成过程中,分属两个密码服务系统的两个密码服务器中的任一个可以都作为本发明的数字签名生成方法中的装置1,另一个作为装置2。

基于本发明的方法,很容易构建实施本发明方法的系统。

基于本发明的方法构建的sm2数字签名生成系统包括两个装置,其中,一个装置是用户计算装置,另一个是密钥服务系统的密码服务器,或者两个装置都是密钥服务系统的密码服务器;两个装置按前面所述sm2数字签名的秘密共享生成方法,生成使用用户sm2私钥da对消息m的数字签名。

其他未说明的具体技术实施,对于相关领域的技术人员而言是众所周知,不言自明的。

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