密钥获取方法、数字签名方法和装置与流程

文档序号:12067811阅读:506来源:国知局
密钥获取方法、数字签名方法和装置与流程

本发明涉及密码算法技术领域,尤其是涉及一种密钥获取方法、数字签名方法和装置。



背景技术:

SM2椭圆曲线公钥密码算法是一种更为先进安全的密码算法。在多倍点运算中,已知多倍点与基点,求解倍数的问题成为椭圆曲线离散对数问题。与大数分解问题及有限域上离线对数问题相比,椭圆曲线离散对数问题的求解难度要大很多。因此,在相同安全程度要求下,椭圆曲线密码较其他公钥密码所需的密钥规模要小很多。

在进行基于SM2的数字签名算法的研发中,需要对签名算法的安全性进行测试。现有的测试方式主要是在数字签名的过程中注入一定的错误数据,并获得验签结果,继而判断是否能够获得上述签名算法中的密钥,以确定上述签名算法是否符合安全性标准;然而,上述获取密钥的方式通常要求签名过程中产生的随机数具有一定的范围,该限制大大降低了对数字签名算法测试的有效性和可实施性。

针对上述获取密钥的方式限制性较大的问题,尚未提出有效的解决方案。



技术实现要素:

有鉴于此,本发明的目的在于提供一种密钥获取方法、数字签名方法和装置,以降低获取密钥的方式限制性。

第一方面,本发明实施例提供了一种密钥获取方法,该密钥用于基于SM2椭圆曲线公钥密码算法的数字签名算法中,该方法包括:设置密钥的最高字节位置为目标字节位置,进行下述字节值获取操作:采用物理方式更改目标字节位置的数据,生成与密钥字节长度相同的伪密钥;其中,该物理方式包括激光照射方式或电泳刺激方式;根据伪密钥进行数字签名,记录数字签名过程中生成的第一椭圆曲线点和签名结果;根据签名结果进行数字签名的验签,记录验签过程中生成的第二椭圆曲线点;根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值;根据字节差值,设置密钥的目标字节位置的字节值的取值范围;根据取值范围确定密钥的目标字节位置的字节值;设置目标字节位置的下一个字节位置为新的目标字节位置,继续进行上述字节值获取操作,直至获取到密钥的所有字节位置的字节值,将所有字节位置的字节值确定为密钥。

结合第一方面,本发明实施例提供了第一方面的第一种可能的实施方式,其中,上述根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值包括:设置字节差值的初始值d=00,进行下述字节差值搜索操作:判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为基点G的阶;如果否,更新d=d+1,继续进行上述字节差值搜索操作,直至d=FF;如果是,记录字节差值;或者;设置字节差值的初始值d=-01,进行下述字节差值搜索操作:判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为椭圆曲线基点G的阶;(r,s)为发送的签名;x||y为x与y的拼接;如果否,更新d=d-1,继续进行上述字节差值搜索操作,直至d=-FF;如果是,记录字节差值。

结合第一方面的第一种可能的实施方式,本发明实施例提供了第一方面的第二种可能的实施方式,其中,上述第二椭圆曲线点(x1’,y1’)通过下述方式获得:(x1’,y1’)=[s’]G+[t]PA=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[k-r*dA’+r*dA]G;其中,PA=[dA]G;(r’,s’)为收到的签名;t=(r’+s’)mod n;PA为用户A的公钥;dA为用户A的私钥;dA’为伪密钥;k为随机数发生器产生的随机数,且k∈[1,n-1];[k]G=(r-e)mod n;或者;(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[(1+dA)(1+dA’)-1(k-r*dA)+r*dA]G=[k+(dA-dA’)(k-r*dA)]G=[k]G+[(dA-dA’)k]G–[(dA-dA’)r]PA;其中,(r’,s’)为收到的签名;t=(r’+s’)mod n;PA为用户A的公钥;dA为用户A的私钥;dA’为伪密钥;k为随机数发生器产生的随机数,且k∈[1,n-1];[k]G=(r-e)mod n。

结合第一方面,本发明实施例提供了第一方面的第三种可能的实施方式,其中,上述根据字节差值,设置密钥的目标字节位置的字节值的取值范围包括:设置密钥的目标字节位置的字节值d1=d+d2的取值范围M=[d,FF];其中,d为字节差值,且d≥0;d2为伪密钥的目标字节位置的字节值;d2、d1和d为十六进制的两位数,且0≤d2≤FF;或者;设置密钥的目标字节位置的字节值d1=d+d2的取值范围M=[00,FF+d];其中,d为字节差值,且d≤0;d2为伪密钥的目标字节位置的字节值;d2、d1和d为十六进制的两位数,且0≤d2≤FF。

结合第一方面,本发明实施例提供了第一方面的第四种可能的实施方式,其中,上述根据取值范围确定密钥的目标字节位置的字节值包括:判断取值范围中最大值和最小值是否相同;如果否,继续进行字节值获取操作;如果是,确定最大值和/或最小值为密钥的目标字节位置的字节值。

第二方面,本发明实施例提供了一种数字签名方法,该方法包括:将接收到的待签名的消息M与预先存储的ZA进行拼接处理,获得拼接处理结果其中,ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;进行下述生成签名结果的操作:根据密码杂凑函数,对进行处理,获得密码杂凑函数作用于消息M的输出值其中,Hv()为消息摘要长度为v比特的密码杂凑函数;通过随机数发生器获取随机数k;其中,k∈[1,n-1];n为n为椭圆曲线基点G的阶;获取第一椭圆曲线点(x1,y1)=[k]G;获取r=(e+x1)mod n;判断r=0或者r+k=n是否成立;如果是,继续进行上述生成签名结果的操作;如果否,获取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均为预先存储的数据;dA为用户A的私钥;判断s是否等于0;如果s等于0,继续进行上述生成签名结果的操作;如果s不等于0,确定数字签名结果(r,s)。

第三方面,本发明实施例提供了一种密钥获取装置,该密钥用于基于SM2椭圆曲线公钥密码算法的数字签名算法中,该装置包括:目标字节位置设置模块,用于设置密钥的最高字节位置为目标字节位置,进行下述字节值获取操作:伪密钥生成模块,用于采用物理方式更改目标字节位置的数据,生成与密钥字节长度相同的伪密钥;其中,该物理方式包括激光照射方式或电泳刺激方式;数字签名模块,用于根据伪密钥进行数字签名,记录数字签名过程中生成的第一椭圆曲线点和签名结果;验签模块,用于根据签名结果进行数字签名的验签,记录验签过程中生成的第二椭圆曲线点;字节差值搜索模块,用于根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值;取值范围设置模块,用于根据字节差值,设置密钥的目标字节位置的字节值的取值范围;字节值确定模块,用于根据取值范围确定密钥的目标字节位置的字节值;密钥确定模块,用于设置目标字节位置的下一个字节位置为新的目标字节位置,继续进行上述字节值获取操作,直至获取到密钥的所有字节位置的字节值,将所有字节位置的字节值确定为密钥。

结合第三方面,本发明实施例提供了第三方面的第一种可能的实施方式,其中,上述字节差值搜索模块包括:第一初始值设置单元,用于设置字节差值的初始值d=00,进行下述字节差值搜索操作:第一判断单元,用于判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为基点G的阶;第一更新单元,用于如果字节差值d的[d*2248*r mod n]G的坐标不等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),更新d=d+1,继续进行上述字节差值搜索操作,直至d=FF;第一记录单元,用于如果字节差值d的[d*2248*r mod n]G的坐标等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),记录字节差值;或者;第二初始值设置单元,用于设置字节差值的初始值d=-01,进行下述字节差值搜索操作:第二判断单元,用于判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为椭圆曲线基点G的阶;(r,s)为发送的签名;x||y为x与y的拼接;第二更新单元,用于如果字节差值d的[d*2248*r mod n]G的坐标不等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),更新d=d-1,继续进行上述字节差值搜索操作,直至d=-FF;第二记录单元,用于如果字节差值d的[d*2248*r mod n]G的坐标等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),记录字节差值。

结合第三方面,本发明实施例提供了第三方面的第二种可能的实施方式,其中,上述字节值确定模块包括:第三判断单元,用于判断取值范围中最大值和最小值是否相同;继续操作单元,用于如果取值范围中最大值和最小值不相同,继续进行字节值获取操作;字节值确定单元,用于如果取值范围中最大值和最小值相同,确定最大值和/或最小值为密钥的目标字节位置的字节值。

第四方面,本发明实施例提供了一种数字签名装置,该装置包括:拼接处理模块,用于将接收到的待签名的消息M与预先存储的ZA进行拼接处理,获得拼接处理结果其中,ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;进行下述生成签名结果的操作:处理模块,用于根据密码杂凑函数,对进行处理,获得密码杂凑函数作用于消息M的输出值其中,Hv()为消息摘要长度为v比特的密码杂凑函数;随机数获取模块,用于通过随机数发生器获取随机数k;其中,k∈[1,n-1];n为n为椭圆曲线基点G的阶;第一椭圆曲线点获取模块,用于获取第一椭圆曲线点(x1,y1)=[k]G;r获取模块,用于获取r=(e+x1)mod n;第一判断模块,用于判断r=0或者r+k=n是否成立;第一继续操作模块,用于如果r=0或者r+k=n成立,继续进行上述生成签名结果的操作;s获取模块,用于如果r=0或者r+k=n不成立,获取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均为预先存储的数据;dA为用户A的私钥;第二判断模块,用于判断s是否等于0;第二继续操作模块,用于如果s等于0,继续进行上述生成签名结果的操作;数字签名结果确定模块,用于如果s不等于0,确定数字签名结果(r,s)。

本发明实施例带来了以下有益效果:

本发明实施例提供的一种密钥获取方法,根据生成的伪密钥进行数字签名和验签,可以获得数字签名过程中生成的第一椭圆曲线点和验签过程中生成的第二椭圆曲线点;根据该第一椭圆曲线点和第二椭圆曲线点的差值,搜索密钥与伪密钥的目标字节位置的字节差值,并设置密钥的目标字节位置的字节值的取值范围;根据该取值范围可以确定密钥的目标字节位置的字节值;当获取到密钥的所有字节位置的字节值后,将所有字节位置的字节值确定为密钥。上述方式大大降低了获取密钥的方式限制性,对于SM2椭圆曲线公钥密码算法的密钥具有较好的普适性和可实施性;且当上述密钥获取方法应用于测试基于SM2椭圆曲线公钥密码算法的数字签名算法的抗差分错误分析的能力时,可以有效地发现上述数字签名算法的漏洞,进而提高了上述数字签名算法的安全性。

本发明实施例提供的一种数字签名方法,将用户A的私钥dA与(1+dA)-1均预先存储,可以使用户在进行数字签名中直接获取dA与(1+dA)-1数据,相较于现有技术中对(1+dA)-1进行实时计算的方式,该方式可以防御在读取dA时进行密钥的获取操作,提高了数字签名方法的安全性和可靠性。

本发明的其他特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。本发明的目的和其他优点在说明书、权利要求书以及附图中所特别指出的结构来实现和获得。

为使本发明的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。

附图说明

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

图1为本发明实施例提供的一种密钥获取方法的流程图;

图2为本发明实施例提供的一种数字签名方法的流程图;

图3为本发明实施例提供的一种密钥获取装置的结构示意图;

图4为本发明实施例提供的一种数字签名装置的结构示意图。

具体实施方式

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

考虑到现有技术中获取密钥的方式限制性较大的问题,本发明实施例提供了一种密钥获取方法、数字签名方法和装置,该技术可以用于测试在嵌入式系统或智能卡芯片内实现的基于SM2椭圆曲线公钥密码算法的数字签名算法的抗差分错误分析的能力,该技术可以采用相关的软件和硬件实现,下面通过实施例进行描述。

实施例一:

参见图1所示的一种密钥获取方法的流程图,该密钥用于基于SM2椭圆曲线公钥密码算法的数字签名算法中,该方法包括如下步骤:

步骤S102,设置密钥的最高字节位置为目标字节位置,进行下述字节值获取操作:

步骤S104,采用物理方式更改目标字节位置的数据,生成与密钥字节长度相同的伪密钥;其中,该物理方式包括激光照射方式或电泳刺激方式;采用物理方式更改目标字节位置的数据时,该数据的变化是随机的,也是未知的;由于基于SM2椭圆曲线公钥密码算法中使用的密钥长度是32个字节,因此,随机生成的为密钥的字节长度也为32个字节;

步骤S106,根据上述伪密钥进行数字签名,记录数字签名过程中生成的第一椭圆曲线点和签名结果;

步骤S108,根据签名结果进行数字签名的验签,记录验签过程中生成的第二椭圆曲线点;

步骤S110,根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值;

在实际实现中,上述密钥和生成的伪密钥均未知;但是基于SM2椭圆曲线公钥密码算法的数字签名和验签过程中,指定了特定的椭圆曲线,该曲线的数学域和曲线的加法群参数都是确定的,因此,根据伪密钥进行数字签名过程中生成的第一椭圆曲线点和验签过程中生成的第二椭圆曲线点的差值,可以搜索出真实密钥和伪密钥的目标字节位置的字节差值。

进一步地,由于椭圆曲线基于离散对数难题,很难通过坐标值解出系数;因此可以采用正向搜索的方式,例如,00、01、02、…、FF。

步骤S112,根据字节差值,设置密钥的目标字节位置的字节值的取值范围;

步骤S114,根据取值范围确定密钥的目标字节位置的字节值;

上述密钥和伪密钥的目标字节位置的字节值的范围均为00-FF;对于某一确定的密钥,没生成一个伪密钥即可获得一个字节差值,该字节差值可以缩小密钥的目标字节位置的字节值的可能取值范围,因此,当多次生成伪随机密钥后,上述密钥的目标字节位置的字节值的可能取值范围会逐步缩小,并无限逼近密钥的目标字节位置的字节值,且该字节值为十六进制的正数,进而获得密钥的目标字节位置的字节值。

步骤S116,设置目标字节位置的下一个字节位置为新的目标字节位置,继续进行上述字节值获取操作,直至获取到密钥的所有字节位置的字节值,将所有字节位置的字节值确定为密钥。

本发明实施例提供的一种密钥获取方法,根据生成的伪密钥进行数字签名和验签,可以获得数字签名过程中生成的第一椭圆曲线点和验签过程中生成的第二椭圆曲线点;根据该第一椭圆曲线点和第二椭圆曲线点的差值,搜索密钥与伪密钥的目标字节位置的字节差值,并设置密钥的目标字节位置的字节值的取值范围;根据该取值范围可以确定密钥的目标字节位置的字节值;当获取到密钥的所有字节位置的字节值后,将所有字节位置的字节值确定为密钥。上述方式大大降低了获取密钥的方式限制性,对于SM2椭圆曲线公钥密码算法的密钥具有较好的普适性和可实施性;且当上述密钥获取方法应用于测试基于SM2椭圆曲线公钥密码算法的数字签名算法的抗差分错误分析的能力时,可以有效地发现上述数字签名算法的漏洞,进而提高了上述数字签名算法的安全性。

考虑到上述字节差值可能为正数也可能为负数,上述根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值,具体可以以下述方式实现,该方式中,字节差值从00开始搜索,直至FF,包括:

(1)设置字节差值的初始值d=00,进行下述字节差值搜索操作:

(2)判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为基点G的阶;

(3)如果否,更新d=d+1,继续进行上述字节差值搜索操作,直至d=FF;

(4)如果是,记录字节差值。

上述根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值,具体还可以以下述方式实现,该方式中,字节差值从-01开始搜索,直至-FF,包括:

(1)设置字节差值的初始值d=-01,进行下述字节差值搜索操作:

(2)判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为椭圆曲线基点G的阶;(r,s)为发送的签名;x||y为x与y的拼接;

(3)如果否,更新d=d-1,继续进行上述字节差值搜索操作,直至d=-FF;

(4)如果是,记录字节差值。

上述搜索方式可以高效地获得与第一椭圆曲线点和第二椭圆曲线点的差值相匹配的字节差。

在数字签名的验签过程中,上述第二椭圆曲线点(x1’,y1’)可以通过多种方式获得,方式一为:(x1’,y1’)=[s’]G+[t]PA=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[k-r*dA’+r*dA]G;其中,PA=[dA]G;(r’,s’)为收到的签名;t=(r’+s’)mod n;PA为用户A的公钥;dA为用户A的私钥;dA’为伪密钥;k为随机数发生器产生的随机数,且k∈[1,n-1];[k]G=(r-e)mod n;

方式二为:(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[(1+dA)(1+dA’)-1(k-r*dA)+r*dA]G=[k+(dA-dA’)(k-r*dA)]G=[k]G+[(dA-dA’)k]G–[(dA-dA’)r]PA;其中,(r’,s’)为收到的签名;t=(r’+s’)mod n;PA为用户A的公钥;dA为用户A的私钥;dA’为伪密钥;k为随机数发生器产生的随机数,且k∈[1,n-1];[k]G=(r-e)mod n。

具体地,上述方式一为将伪密钥植入至数字签名算法中的模乘过程中;上述方式二为将伪密钥植入至数字签名算法中的求逆过程中。

进一步地,根据字节差值的正负,上述根据字节差值,设置密钥的目标字节位置的字节值的取值范围,可以通过下述方式实现,方式一:设置密钥的目标字节位置的字节值d1=d+d2的取值范围M=[d,FF];其中,d为字节差值,且d≥0;d2为伪密钥的目标字节位置的字节值;d2、d1和d为十六进制的两位数,且0≤d2≤FF;

方式二:设置密钥的目标字节位置的字节值d1=d+d2的取值范围M=[00,FF+d];其中,d为字节差值,且d≤0;d2为伪密钥的目标字节位置的字节值;d2、d1和d为十六进制的两位数,且0≤d2≤FF。

进一步地,上述根据取值范围确定密钥的目标字节位置的字节值,包括如下步骤:(1)判断取值范围中最大值和最小值是否相同;(2)如果否,继续进行字节值获取操作;(3)如果是,确定最大值和/或最小值为密钥的目标字节位置的字节值。

例如,当d=-0x33时,M1=[00,CC],可见,d1的取值范围发生了缩小;再次随机生成伪密码,并获得一个字节差值,例如,当d=0x78时,M2=[78,FF];再如,当d=-0x87时,M3=[-87,78];根据M2和M3的交集,即可确定密钥的目标字节位置的字节值d1

上述方法可以高效准确地获取密钥的字节值,进而获取完整的密钥,且具有较强的可实施性。

实施例二:

参见图2所示的一种数字签名方法的流程图,该方法可以防御通过上述实施例一中提供的密钥获取方法进行密钥获取,该方法包括如下步骤:

步骤S202,将接收到的待签名的消息M与预先存储的ZA进行拼接处理,获得拼接处理结果其中,ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;

进行下述生成签名结果的操作:

步骤S204,根据密码杂凑函数,对进行处理,获得密码杂凑函数作用于消息M的输出值其中,Hv()为消息摘要长度为v比特的密码杂凑函数;

步骤S206,通过随机数发生器获取随机数k;其中,k∈[1,n-1];n为n为椭圆曲线基点G的阶;

步骤S208,获取第一椭圆曲线点(x1,y1)=[k]G;

步骤S210,获取r=(e+x1)mod n;

步骤S212,判断r=0或者r+k=n是否成立;如果是,执行步骤S204;如果否,执行步骤S214;

步骤S214,获取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均为预先存储的数据;dA为用户A的私钥;

步骤S216,判断s是否等于0;如果s等于0,执行步骤S204;如果s不等于0,执行步骤S218;

步骤S218,确定数字签名结果(r,s)。

本发明实施例提供的一种数字签名方法中,将用户A的私钥dA与(1+dA)-1均预先存储,可以使用户在进行数字签名中直接获取dA与(1+dA)-1数据,相较于现有技术中对(1+dA)-1进行实时计算的方式,该方式可以防御在读取dA时进行密钥的获取操作,提高了数字签名方法的安全性和可靠性。

实施例三:

对应于上述实施例一中提供的密钥获取方法和实施例二中提供的数字签名方法,本发明实施例提供了一种SM2签名算法过程的差分错误注入测试方法及防御方法。

现有的嵌入式密码设备,以智能卡和USB key为例,是基于硬件平台和软件编程实现的。随着上世纪90年代提出的一些攻击方法的提出,人们逐渐意识到,密码算法的安全性不仅仅取决于数学安全性,同时这些支持密码算法的设备的实现方式也会对密码算法的安全性造成威胁。目前该领域有很多研究者已经提出了各种各样的侧信道攻击方法,这些方法可以使攻击者很容易攻击获取密码学算法的密钥。这些常用的方法包括:时间攻击、功耗分析、电磁辐射分析、声音分析、探针分析、测试电路的重利用分析、缓存攻击以及错误注入攻击、等分电磁分析方法。上述侧信道攻击方法目前最有效的攻击方法包括功耗分析、错误注入攻击等。

上述错误注入方式是自1997年Dan Boneh等提出了经典的CRT-RSA算法攻击方法。在1997年,li Biham和Adi Shamir(同时也是RSA算法的发明人之一)发表了针对对称加密算法的错误攻击方法,并第一次提出并命名为差分错误分析(Differential Fault Analysis,简称DFA)的攻击方法,沿用至今。2002年,对CRT-RSA算法的实际实验攻击。英飞凌公司的C.Aumuller等人基于学者们提出的错误攻击模型,对CRT-RSA算法实际进行了攻击,并取得了成功。同年,P.Dusart等人对AES的错误注入进行了系统分析。他们认为对于AES的攻击不能简单借鉴对DES的攻击思想,因为两者在运算结构上存在不同。2008年的CHES会议上,学者David Vigilant提出了一种新的CRT-RSA算法实现方式。2010年,对于文献提出的防护算法,Jean-S′ebastien Coron等人通过分析找出了理论上的漏洞。

而SM2算法是基于椭圆曲线算法实现的。目前,对于椭圆曲线算法的攻击主要是从三个方面入手。一个是操作椭圆曲线群上的操作,使运算发生在一个具有弱安全性的新的群上。这种攻击方法可以通过检查结果是否在椭圆曲线上的方式进行防御。另外一种,Blomer等人假设中间值的符号可以被改变。这种攻击方式,结果仍然是椭圆曲线的有效点。因此,上面提到的防御方法不再有效,需要更复杂的防御方法才能抵御这种攻击。还有一种是safe-error方式,为了防御简单功耗分析,椭圆曲线算法通常使用总是加法和倍点的方式实现,而有些加法是冗余的。攻击者可以通过针对这些加法过程注入临时性错误,观察是否有错误结果产生,如果产生,证明该过程是有效的,而没有错误的话,证明该加法是冗余的,从而逐步确认每个比特位的值。

针对目前SM2签名算法的差分错误注入测试大多具有不可实施性,本发明提出的针对SM2签名算法的差分错误注入的测试方法,使差分错误注入测试具有可实施性,且该方法对目前的SM2签名算法实现过程具有一定的普适性;同时,针对上述差分错误注入测试方法,提出了一种防御方法的建议,可以有效各种错误注入的攻击。

对了更加清楚地描述SM2签名算法的差分错误注入的测试方法和防御方法,首先对SM2签名算法进行介绍。SM2算法是基于椭圆曲线实现的。该算法指定了特定的椭圆曲线,曲线的数学域和曲线的加法群参数都是确定的。数字签名算法的过程如下:

A1、置M=ZA||M;

A2、计算e=Hv(M)

A3、使用随机数发生器产生随机数k属于[1,n-1]

A4、计算椭圆曲线点(x1,y1)=[k]G

A5、计算r=(e+x1)mod n,若r=0或者r+k=n则返回A3。

A6、计算s=((1+dA)-1(k-r*dA))mod n,若s=0则返回A3。

上述过程得到的(r,s)即为签名结果。

数字签名的验签过程如下:

B1、检验r’是否属于[1,n-1],不成立则不通过;

B2、检验s’是否属于[1,n-1],不成立则不通过;

B3、值M’=ZA||M’;

B4、计算e=Hv(M’);

B5、计算t=(r’+s’)mod n,若t=0,则验证不通过。

B6、计算椭圆曲线点(x1’,y1’)=[s’]G+[t]PA

B7、计算R=(e+x1’)mod n,验证r’==R,若成立则通过,否则验证不通过。

上述提到的现有技术中几种针对椭圆曲线密码算法的错误注入的方法,对SM2的签名算法都不具有可实施性。这些方法都是针对数字签名过程的A4步骤,同时,要求A4步骤中使用的随机数k固定并且可以多次重复使用。而从A3步骤得知,k是随机数,每次都是随机产生,因此前面提到的错误注入方式都不具有可实施性。

考虑到基于椭圆曲线的数字签名算法的独特性,Jorn-Marc Schmidt等人提出了针对椭圆曲线数字签名算法的错误注入方式。但是这种方法无法对SM2签名算法实施,首先这种方式适合的算法流程和SM2算法的流程有差异,另外该作者提出的攻击方法的假设要求比较苛刻,要求注入错误使代码流程发生改变,没有可实施性。

综上,本发明实施例提供了第一种SM2签名算法过程的差分错误注入测试方法,该方法针对SM2数字签名算法的A6步骤;A6步骤中的(1+dA)-1可以作为常数存储,也可以通过dA计算出该值;然后计算r*dA的值(该实施例中的“*”表示为相乘)、计算(k-r*dA)mod n的值、最后计算两个大数的模乘(1+dA)-1(k-r*dA)。该测试方案是在计算r*dA时进行错误注入。

SM2使用的dA长度是32个字节,记为d31d30…d1d0,其中d31是dA的最高字节,而d0是dA的最低字节;在智能卡或者嵌入式系统中,dA是以字节形式存储在FLASH或者EEPROM中;在计算时,系统从Flash或者EEPROM中读取dA,假设在测试过程中对d31字节进行了错误注入;这时,r*dA的结果记为r*dA’,而(dA-dA’)=(d31’,0…,0,0),其中d31’是与dA和dA’的首字节差值;需要注意的是,由于dA和dA’的大小关系没有确定,d31’可以带有符号;将dA’代入A6步骤运算,得到了s’。

然后,将上述签名结果(r,s’)代入验签过程,得到:(x1’,y1’)=[s’]G+[t]PA,而PA=[dA]G;代入公式有:(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[k-r*dA’+r*dA]G;已知[k]G的x坐标为(r-e)mod n;因此可以计算[k]G与(x1’,y1’)的差,即:[k]G–(x1’,y1’)=[r*dA’–r*dA]G=[r*(d31’,0…,0,0)]G。

由于椭圆曲线基于离散对数问题,很难通过坐标值解出系数。因此采用正向搜索的方式,这时需要分两种情况来分析:一是d31’为正,二是d31’为负;当d31’为正时,直接采用该值,而d31’为负时,需要使用n-(|d31’|,0…,0,0)代替(d31’,0…,0,0)即可,其中|d31’|为绝对值,n是椭圆曲线的阶,为固定常数。

搜索时,私钥d首字节从0x00-0xFF,其它字节补充为0,计算该值与r乘积的倍点(其中0x表示十六进制);然后计算n与d的差值,计算该值与r乘积的倍点,观察所有的256*2个数据中哪个与得到[k]G–(x1’,y1’)相等,即可获取当前错误值。

假设错误的模型是完全随机的,即对单字节来讲无论d31为何值,d31’可以是0x00-0xFF的任意值;根据前面分析可以得知,对固定值d31,(dA’-dA)的值只可能是00,01…,d31,n-1,n-2…,n+0xFF-d31。因此,在错误发生次数足够多的情况下,利用差值可以逼近出首字节的值。

上述测试过程举例如下:

SM2算法的阶n=0xFFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123;

设dA=0x787968B4FA32C3FD 2417842E 73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498;

对dA的最高字节进行错误注入,d31被改写为AB,即

dA’=0xAB7968B4 FA32C3FD 2417842E 73BBFEFF 2F3C848B 6831D7E0 EC65228B 3937E498;

则d31’=-0x33。

为了搜索出d31的密钥值,首先通过计算[0x 00*2248*r mod n]G的坐标是否等于[k]G–(x1’,y1’)。然后计算[0x 01*2248*r mod n]G的坐标是否等于[k]G–(x1’,y1’),依次计算到:[0xFF*2248*r mod n]G的坐标是否等于[k]G–(x1’,y1’)。考虑到d31’可能是负数,同样,搜索:[(n-0x 00*2248)*r mod n]G的坐标是否等于[k]G–(x1’,y1’);然后计算[(n-0x 01*2248)*r mod n]G的坐标是否等于[k]G–(x1’,y1’);最后到:[(n-0x FF*2248)*r mod n]G的坐标是否等于[k]G–(x1’,y1’)。

依次搜索,这256*2数据中,会发现[(n-0x 33*2248)*r mod n]G的倍点坐标是否等于[k]G–(x1’,y1’)。因此,推导得到则d31’=-0x33。考虑到该值,d31的值应该小于0xCC,因为当d31大于0xCC时任何错误值都不能使d31’=-0x33。

再次注入错误,如果发生了错误,同样判断d31’的值,并且有d31’值缩小d31字节的范围。如果错误出现了d31’=0x78和d31’=-0x87时,即可确定d31字节的值为0x78。

其它字节的分析方法与首字节相同,对所有字节依次采用这种方法,即可获取基于SM2签名算法的密钥。

该方法具有很强的可实施性。首先,该方案没有对签名过程计算椭圆曲线多倍点过程进行错误注入,而是对私钥运算过程进行错误注入,多倍点系数为随机数,而私钥为固定值,因此对私钥的错误注入更具实施性;其次,该方案采用的错误模型也具有很强的操作性。由于在智能卡中数据拷贝及运算过程中都是以字节或字为单位,因此在错误注入时该单元出错的可能性比较高,并且该方案只需要确认字节的位置即可,错误注入难度不大。因此该算法的可实施性很强。同时,该字节模型也可以扩展到字模型,对于字模型搜索空间增加,但依然具有很强的可操作性。

本发明实施例提供了第二种SM2签名算法过程的差分错误注入测试方法,该方法针对SM2数字签名算法的A6步骤假设在计算签名s的过程中,先要计算1+dA的值,在该过程中对dA进行了错误注入;错误的dA用dA’表示,将dA’代入验签过程,有:(x1’,y1’)=[s’+t*dA]G=[s’+(s’+r)*dA]=[(1+dA)s’+r*dA]G=[(1+dA)(1+dA’)-1(k-r*dA)+r*dA]G=[k+(dA-dA’)(k-r*dA)]G=[k]G+[(dA-dA’)k]G–[(dA-dA’)r]PA;其中,PA是公钥,[k]G等于(r-e)mod n。与第一种SM2签名算法过程的差分错误注入测试方法分析类似,利用数据字节的正负特性,可以得到每个字节的密钥值,进而可以得到了整个密钥的值。

本发明实施例还提供了一种SM2签名算法过程的差分错误注入测试方法的防御方法;为了防御侧信道功耗分析技术,一些设计对r*dA mod n进行掩码设计。如r*dA=x*r*dA*x-1这种方式,而x是随机数;但是,通过前面的分析可以得知,这种防御方法无法防御本文所述的对dA的攻击。因此,只有在运算中不直接操作dA,才能防御对dA的错误注入。同样,只针对(1+dA)-1进行了掩码也无法抵御本文的检测方式,因为存在对dA的直接操作。

上述检测方式主要是在使用dA时直接注入了错误。为了防御这种检测攻击方法,需要在签名运算中不要直接操作dA。比如s=((1+dA)-1(k-r*dA))mod n=((1+dA)-1k-(1+dA)-1*r*dA))mod n=((1+dA)-1(k+r)–r)mod n.这里(1+dA)-1需要作为与密钥的一部分预计算存储在芯片中。如果利用这种流程,将不存在直接使用dA的场景。这样就可以防止本文所采用的检测攻击手段。

通过上述防御方法,即可实现对上述检测手段的防御;且考虑到这种实现方式没有明显增加算法实现的时间复杂度和空间复杂度,因此该防御方法具有可操作性和易实施性。

本发明实施例可以实现对SM2签名算法的抵抗错误注入防御方法的检测,通过该方法可以有效发现SM2签名算法实现过程的漏洞。同时,本发明指出一系列实现方案的漏洞,并在其基础上给了防御错误注入方案的有效措施,保证了基于SM2签名算法的安全性。

实施例四:

参见图3所示的一种密钥获取装置的结构示意图,该密钥用于基于SM2椭圆曲线公钥密码算法的数字签名算法中,该装置包括如下部分:

目标字节位置设置模块302,用于设置密钥的最高字节位置为目标字节位置,进行下述字节值获取操作:

伪密钥生成模块304,用于采用物理方式更改目标字节位置的数据,生成与密钥字节长度相同的伪密钥;其中,该物理方式包括激光照射方式或电泳刺激方式;

数字签名模块306,用于根据伪密钥进行数字签名,记录数字签名过程中生成的第一椭圆曲线点和签名结果;

验签模块308,用于根据签名结果进行数字签名的验签,记录验签过程中生成的第二椭圆曲线点;

字节差值搜索模块310,用于根据第一椭圆曲线点和第二椭圆曲线点的差值,从预设的字节值范围内搜索密钥与伪密钥的目标字节位置的字节差值;

取值范围设置模块312,用于根据字节差值,设置密钥的目标字节位置的字节值的取值范围;

字节值确定模块314,用于根据取值范围确定密钥的目标字节位置的字节值;

密钥确定模块316,用于设置目标字节位置的下一个字节位置为新的目标字节位置,继续进行上述字节值获取操作,直至获取到密钥的所有字节位置的字节值,将所有字节位置的字节值确定为密钥。

本发明实施例提供的一种密钥获取装置,根据生成的伪密钥进行数字签名和验签,可以获得数字签名过程中生成的第一椭圆曲线点和验签过程中生成的第二椭圆曲线点;根据该第一椭圆曲线点和第二椭圆曲线点的差值,搜索密钥与伪密钥的目标字节位置的字节差值,并设置密钥的目标字节位置的字节值的取值范围;根据该取值范围可以确定密钥的目标字节位置的字节值;当获取到密钥的所有字节位置的字节值后,将所有字节位置的字节值确定为密钥。上述方式大大降低了获取密钥的方式限制性,对于SM2椭圆曲线公钥密码算法的密钥具有较好的普适性和可实施性;且当上述密钥获取方法应用于测试基于SM2椭圆曲线公钥密码算法的数字签名算法的抗差分错误分析的能力时,可以有效地发现上述数字签名算法的漏洞,进而提高了上述数字签名算法的安全性。

考虑到上述字节差值可能为正数也可能为负数,上述字节差值搜索模块包括:(1)第一初始值设置单元,用于设置字节差值的初始值d=00,进行下述字节差值搜索操作:(2)第一判断单元,用于判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为基点G的阶;(3)第一更新单元,用于如果字节差值d的[d*2248*r mod n]G的坐标不等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),更新d=d+1,继续进行上述字节差值搜索操作,直至d=FF;(4)第一记录单元,用于如果字节差值d的[d*2248*r mod n]G的坐标等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),记录字节差值;

上述字节差值搜索模块还包括:(1)第二初始值设置单元,用于设置字节差值的初始值d=-01,进行下述字节差值搜索操作:(2)第二判断单元,用于判断字节差值d的[d*2248*r mod n]G的坐标是否等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’);其中,(x1,y1)=[k]G为第一椭圆曲线点;(x1’,y1’)为第二椭圆曲线点;r=(e+x1)mod n;ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;M为待签名的消息;Hv()为消息摘要长度为v比特的密码杂凑函数;e为密码杂凑函数作用于消息M的输出值;modn为模n运算;n为椭圆曲线基点G的阶;(r,s)为发送的签名;x||y为x与y的拼接;(3)第二更新单元,用于如果字节差值d的[d*2248*r mod n]G的坐标不等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),更新d=d-1,继续进行上述字节差值搜索操作,直至d=-FF;(4)第二记录单元,用于如果字节差值d的[d*2248*r mod n]G的坐标等于第一椭圆曲线点和第二椭圆曲线点的差值[k]G-(x1’,y1’),记录字节差值。

上述搜索方式可以高效地获得与第一椭圆曲线点和第二椭圆曲线点的差值相匹配的字节差。

进一步地,上述字节值确定模块包括:(1)第三判断单元,用于判断取值范围中最大值和最小值是否相同;(2)继续操作单元,用于如果取值范围中最大值和最小值不相同,继续进行字节值获取操作;(3)字节值确定单元,用于如果取值范围中最大值和最小值相同,确定最大值和/或最小值为密钥的目标字节位置的字节值。上述方法可以高效准确地获取密钥的字节值,进而获取完整的密钥,且具有较强的可实施性。

实施例五:

参见图4所示的一种数字签名装置的结构示意图,该装置包括如下部分:

拼接处理模块402,用于将接收到的待签名的消息M与预先存储的ZA进行拼接处理,获得拼接处理结果其中,ZA为关于用户A的可辨别标识、部分椭圆曲线系统参数和用户A公钥的杂凑值;

进行下述生成签名结果的操作:

处理模块404,用于根据密码杂凑函数,对进行处理,获得密码杂凑函数作用于消息M的输出值其中,Hv()为消息摘要长度为v比特的密码杂凑函数;

随机数获取模块406,用于通过随机数发生器获取随机数k;其中,k∈[1,n-1];n为n为椭圆曲线基点G的阶;

第一椭圆曲线点获取模块408,用于获取第一椭圆曲线点(x1,y1)=[k]G;

r获取模块410,用于获取r=(e+x1)mod n;

第一判断模块412,用于判断r=0或者r+k=n是否成立;如果是,继续进行上述生成签名结果的操作;

s获取模块414,用于如果r=0或者r+k=n不成立,获取s=((1+dA)-1(k-r*dA))mod n;其中,(1+dA)-1和dA均为预先存储的数据;dA为用户A的私钥;

第二判断模块416,用于判断s是否等于0;如果s等于0,继续进行上述生成签名结果的操作;

数字签名结果确定模块418,用于如果s不等于0,确定数字签名结果(r,s)。

本发明实施例提供的一种数字签名装置中,将用户A的私钥dA与(1+dA)-1均预先存储,可以使用户在进行数字签名中直接获取dA与(1+dA)-1数据,相较于现有技术中对(1+dA)-1进行实时计算的方式,该方式可以防御在读取dA时进行密钥的获取操作,提高了数字签名方法的安全性和可靠性。

本发明提出了两种有效的检测方法检测SM2签名算法的抗错误注入防御方法的有效性,这两种方案都具有方便可操作性,相比以前的检测方案都有明显的提高。本发明提出了防御两种检测方法的有效方案,并且该方案具有很低成本和方便实现的特征,不影响SM2签名算法的实现效率。

本发明实施例所提供的密钥获取方法、数字签名方法和装置的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行前面方法实施例中所述的方法,具体实现可参见方法实施例,在此不再赘述。

所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。

最后应说明的是:以上所述实施例,仅为本发明的具体实施方式,用以说明本发明的技术方案,而非对其限制,本发明的保护范围并不局限于此,尽管参照前述实施例对本发明进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本发明实施例技术方案的精神和范围,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。

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