掌桥专利:专业的专利平台
掌桥专利
首页

基于国密SM4算法的随机数生成方法及装置

文献发布时间:2024-04-18 20:02:40


基于国密SM4算法的随机数生成方法及装置

技术领域

本说明书涉及计算机技术领域,特别涉及基于国密SM4算法的随机数生成方法及装置。

背景技术

伪随机数发生器PRNG在密码协议和多方安全计算中被广泛的使用。伪随机数发生器通常取一个随机值作为随机数种子,用一个确定性的算法生成随机数。对于伪随机数发生器而言,随机数种子是十分重要的,一旦攻击者获取到了随机数种子,即可获取全部随机数信息。现有技术中,通常采用对随机数种子进行加密的方式生成随机数。简单的加密算法通常安全性较低,而复杂的加密算法会降低加密计算效率,导致随机数生成效率降低。因此,亟需一种较为有效的方法以解决上述为问题。

发明内容

有鉴于此,本说明书实施例提供了基于国密SM4算法的随机数生成方法。本说明书同时涉及基于国密SM4算法的随机数生成装置,一种计算设备,一种计算机可读存储介质以及一种计算机程序产品,以解决现有技术中存在的上述问题。

根据本说明书实施例的第一方面,提供了一种基于国密SM4算法的随机数生成方法,包括:

根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将所述待处理数据存储至内存空间;

基于所述密钥数据生成SM4算法中预设轮次的轮密钥,以及将所述内存空间中的待处理数据加载至寄存器;

基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据,并利用所述加密数据替换所述内存空间中的待处理数据,其中,所述指令函数关联所述SM4算法的轮函数;

按照所述随机数获取请求关联的数据获取参数在所述内存空间存储的加密数据中提取目标随机数,作为所述随机数获取请求的响应。

可选地,所述根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,包括:

接收随机数获取请求,并对所述随机数获取请求进行解析获得随机数种子;

对所述随机数种子进行翻转操作,获得翻转随机数种子;

基于所述翻转随机数种子分别生成密钥数据和初始计数器值;

将所述初始计数器值转换为与预设的数据类型匹配的所述待处理数据。

可选地,所述基于所述翻转随机数种子分别生成密钥数据和初始计数器数值之后,还包括:

将所述初始计数器值赋值至初始计数器变量;

所述将所述初始计数器值转换为与预设的数据类型匹配的所述待处理数据,包括:

确定计数器变量,并将所述计数器变量的变量类型以及所述初始计数器变量的变量类型转换为目标变量类型;

将目标变量类型的初始计数器变量对应的初始计数器值赋值至目标变量类型的计数器变量,并将赋值后的计数器变量作为所述待处理数据。

可选地,所述将所述内存空间中的待处理数据加载至寄存器,包括:

确定所述内存空间中待处理数据包含的待处理子数据;

根据数据装载策略确定设定数量的寄存器,并将每个待处理子数据中相同位置的字符加载至同一寄存器。

可选地,所述基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据,包括:

在每个寄存器满足数据装载条件的情况下,按照预设的操作替换表将所述SM4算法的轮函数替换为指令函数;

基于所述指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据。

可选地,所述按照预设的操作替换表将基于所述SM4算法的轮函数替换为指令函数,包括:

将所述SM4算法的轮函数划分为第一非线性子函数、第二非线性子函数和线性子函数;

在所述操作替换表中确定与所述第一非线性子函数对应的异或运算指令函数,与所述第二非线性子函数对应的盒运算指令函数,以及与所述线性子函数对应的移位运算指令函数;

将所述异或运算指令函数,所述盒运算指令函数和所述移位运算指令函数作为所述指令函数。

可选地,所述基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据之前,还包括:

基于所述随机数种子计算随机数生成数值;

判断所述随机数生成数值是否大于预设的随机数生成阈值;

若是,基于随机数种子重置函数将所述待处理数据更新为重置待处理数据,以及将所述密钥数据更新为重置密钥数据,将所述重置待处理数据作为所述待处理数据以及将所述重置密钥数据作为所述密钥数据,并执行所述将所述待处理数据存储至内存空间的步骤;

若否,执行所述基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据的步骤。可选地,所述按照所述随机数获取请求关联的数据获取参数在所述内存空间存储的加密数据中提取目标随机数,包括:

对所述随机数获取请求进行解析获得数据获取参数;

将所述数据获取参数和内存空间存储的加密数据输入至随机数生成函数,获得所述随机数生成函数输出的与所述数据获取参数匹配的目标随机数。

可选地,所述基于所述密钥数据生成SM4算法中预设轮次的轮密钥,包括:

调用密钥扩展函数对所述密钥数据进行密钥扩展,根据密钥扩展结果确定与所述SM4算法中预设轮次匹配的轮密钥。

根据本说明书实施例的第二方面,提供了一种基于国密SM4算法的随机数生成装置,包括:

存储模块,被配置为根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将所述待处理数据存储至内存空间;

加载模块,被配置为基于所述密钥数据生成SM4算法中预设轮次的轮密钥,以及将所述内存空间中的待处理数据加载至寄存器;

加密模块,被配置为基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据,并利用所述加密数据替换所述内存空间中的待处理数据,其中,所述指令函数关联所述SM4算法的轮函数;

提取模块,被配置为按照所述随机数获取请求关联的数据获取参数在所述内存空间存储的加密数据中提取目标随机数,作为所述随机数获取请求的响应。

根据本说明书实施例的第三方面,提供了一种计算设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序或指令,所述处理器执行所述计算机程序或指令时实现所述基于国密SM4算法的随机数生成方法的步骤。

根据本说明书实施例的第四方面,提供了一种计算机可读存储介质,其存储有计算机程序或指令,该计算机程序或指令被处理器执行时实现所述基于国密SM4算法的随机数生成方法的步骤。

根据本说明书实施例的第五方面,提供了一种计算机程序产品,包括计算机程序或指令,该计算机程序或指令被处理器执行时实现上述基于国密SM4算法的随机数生成方法的步骤。

本说明书提供的基于国密SM4算法的随机数生成方法,通过根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将待处理数据存储至内存空间;基于密钥数据生成SM4算法中预设轮次的轮密钥,以及将内存空间中的待处理数据加载至寄存器;基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据,其中,指令函数关联SM4算法的轮函数;按照随机数获取请求关联的数据获取参数在内存空间存储的加密数据中提取目标随机数,作为随机数获取请求的响应。先将内存空间中的待加密数据加载至寄存器,再基于寄存器预设的指令函数对待加密数据进行加密,从而提高加密效率。基于国密SM4算法生成目标随机数,从而提高目标随机数的安全性,避免目标随机数被破译。

附图说明

图1是本说明书一实施例提供的一种基于国密SM4算法的随机数生成方法的示意图;

图2是本说明书一实施例提供的一种基于国密SM4算法的随机数生成方法的流程图;

图3是本说明书一实施例提供的一种基于国密SM4算法的数据装载示意图;

图4是本说明书一实施例提供的一种应用于多方安全计算的基于国密SM4算法的随机数生成方法的处理流程图;

图5是本说明书一实施例提供的一种基于国密SM4算法的随机数生成装置的结构示意图;

图6是本说明书一实施例提供的一种计算设备的结构框图。

具体实施方式

在下面的描述中阐述了很多具体细节以便于充分理解本说明书。但是本说明书能够以很多不同于在此描述的其它方式来实施,本领域技术人员可以在不违背本说明书内涵的情况下做类似推广,因此本说明书不受下面公开的具体实施的限制。

在本说明书一个或多个实施例中使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本说明书一个或多个实施例。在本说明书一个或多个实施例和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本说明书一个或多个实施例中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。

应当理解,尽管在本说明书一个或多个实施例中可能采用术语第一、第二等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本说明书一个或多个实施例范围的情况下,第一也可以被称为第二,类似地,第二也可以被称为第一。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。

首先,对本说明书一个或多个实施例涉及的名词术语进行解释。

AVX512:是Intel推出的一项指令集扩展,它进一步扩展了之前AVX2指令集的功能,提供了对更宽数据路径的支持,以加速各种计算密集型任务,如科学计算、机器学习和数据分析等。

GFNI(伽罗瓦域新指令):是一种特殊的指令集扩展,旨在加速加密和安全应用程序。GFNI指令集中的一个指令——仿射转换指令,还可以用于对字节元素中的单个位执行其他有用的操作。使用GFNI指令,开发人员可以更有效地处理加密和安全任务,提高应用程序的性能和效率。

CPI(Cycle Per Instruction):平均执行周期数,表示计算机执行一条指令所需的时钟周期数。用于衡量计算机的运算速度,是计算机运算速度指标的一种计量单位。

图1示出了根据本说明书一实施例提供的一种基于国密SM4算法的随机数生成方法的示意图,如图1所示,接收随机数获取请求,对随机数获取请求进行解析获得随机数获取请求携带的随机数种子,基于随机数种子生成待处理数据和密钥数据。将待处理数据存储至内存空间。基于密钥数据生成SM4算法中预设轮次的轮密钥。将内存空间中的待处理数据加载至寄存器。基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据,寄存器的指令函数关联SM4算法的轮函数。执行寄存器中的指令函数即可基于SM4算法的轮函数和轮密钥对待加密数据进行加密处理。确定随机数获取请求关联的数据获取参数,基于数据获取参数在内存空间存储的加密数据中提取目标随机数,作为随机数获取请求的响应。目标随机数可应用于多方安全计算等后续任务。

综上所述,在生成随机数时,先将内存空间中的待加密数据加载至寄存器,再基于寄存器预设的指令函数对待加密数据进行加密,从而提高加密效率。基于国密SM4算法生成目标随机数,从而提高目标随机数的安全性,避免目标随机数被破译。

在本说明书中,提供了基于国密SM4算法的随机数生成方法,本说明书同时涉及基于国密SM4算法的随机数生成装置,一种计算设备,一种计算机可读存储介质以及一种计算机程序产品,在下面的实施例中逐一进行详细说明。

图2示出了根据本说明书一实施例提供的一种基于国密SM4算法的随机数生成方法的流程图,具体包括以下步骤:

步骤202:根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将所述待处理数据存储至内存空间。

具体的,随机数获取请求可以是需求方提交的,用于获取随机数的计算机指令;随机数种子是指在伪随机数生成器中用于生成伪随机数的初始数值,随机数种子可以由需求方设定;内存空间为用于存储数据的存储空间,是CPU能直接寻址的存储空间,用于暂时存放运算数据,以及与硬盘等外部存储器交换的数据。

基于此,接收需求方提交的随机数获取请求,对随机数获取请求进行解析获得随机数获取请求携带的随机数种子。基于随机数种子生成待处理数据和密钥数据。将待处理数据存储至内存空间。密钥数据以及存储至内存空间中的待加密数据参与后续目标随机数的生成。

进一步的,考虑到随机数的生成需要依赖于随机数种子以及密钥数据,直接将随机数种子用于随机数的生成安全性较低,因此可以在对随机数种子进行翻转操作后生成密钥数据和待处理数据,具体实现如下:

接收随机数获取请求,并对所述随机数获取请求进行解析获得随机数种子;对所述随机数种子进行翻转操作,获得翻转随机数种子;基于所述翻转随机数种子分别生成密钥数据和初始计数器值;将所述初始计数器值转换为与预设的数据类型匹配的所述待处理数据。

具体的,翻转操作可以是对随机数种子对应的序列进行逆序处理,例如随机数种子为12345,则翻转随机数种子即为54321;初始计数器值为伪随机数生成器对应的初始化值IV;数据类型表示变量类型。

基于此,接收随机数获取请求,并对随机数获取请求进行解析获得随机数种子。对随机数种子进行翻转操作,获得翻转随机数种子。将翻转随机数种子分别作为密钥数据和初始计数器值。将初始计数器值转换为与预设的数据类型匹配的待处理数据。

举例说明,在确定随机数种子12345后,可以对随机数种子进行翻转操作,将翻转后的随机数种子54321作为密钥数据key和伪随机数生成器的初始计数器值IV。将初始计数器值IV转换为uint128_t类型的变量。

综上所述,对随机数种子进行翻转操作,从而提高后续目标随机数的安全性。

进一步的,考虑到伪随机数生成器对应计数器变量Ctr,因此可以将计数器变量Ctr的值作为待处理数据,具体实现如下:

将所述初始计数器值赋值至初始计数器变量;确定计数器变量,并将所述计数器变量的变量类型以及所述初始计数器变量的变量类型转换为目标变量类型;将目标变量类型的初始计数器变量对应的初始计数器值赋值至目标变量类型的计数器变量,并将赋值后的计数器变量作为所述待处理数据。

具体的,初始计数器变量即为伪随机数生成器的初始计数器值IV;计数器变量即为伪随机数生成器的计数器变量Ctr。

基于此,将初始计数器值赋值至初始计数器变量;确定伪随机数生成器的计数器变量,并将计数器变量的变量类型以及初始计数器变量的变量类型转换为目标变量类型。将目标变量类型的初始计数器变量对应的初始计数器值赋值至目标变量类型的计数器变量,并将赋值后的计数器变量作为待处理数据,以便于后续的加密处理。

沿用上例,将初始计数器变量和计数器变量的变量类型转换为uint128_t类型。将IV的值赋值给Ctr。将Ctr的变量值作为待加密数据。使用C++编译器普遍支持的uint128_t数据实现了128计数器的累加。

综上所述,将计数器变量的变量类型以及初始计数器变量的变量类型转换为目标变量类型,从而实现128计数器的累加,提高数据处理效率。

步骤204:基于所述密钥数据生成SM4算法中预设轮次的轮密钥,以及将所述内存空间中的待处理数据加载至寄存器。

具体的,在上述根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将待处理数据存储至内存空间之后,即可基于密钥数据生成SM4算法中预设轮次的轮密钥,以及将内存空间中的待处理数据加载至寄存器,其中,SM4算法SM4国密算法是一种对称密码算法,也称为SM4分组密码算法。SM4分组密码算法各个分组长度一般为128bit,密钥长度也为128bit。加密算法和密码扩展算法都采用32轮非线性迭代机制。SM4算法中采用异或运算、移位变换以及盒变换实现数据加密;SM4算法中的轮密钥一般为32轮的轮密钥;寄存器可以是任意向量寄存器,寄存器也可以是AVX512指令集对应的寄存器,允许处理器以512位宽度执行操作,从而在一次操作中处理更多的数据。

基于此,在上述根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将待处理数据存储至内存空间后,SM4算法中轮密钥的预设轮次,基于密钥数据生成SM4算法中预设轮次的轮密钥。将内存空间中的待处理数据加载至寄存器,等待进行后续加密处理。

进一步的,考虑到寄存器中装载的数据有限,因此可以根据需要处理的数据位数确定寄存器数量,并进行数据装载,具体实现如下:

确定所述内存空间中待处理数据包含的待处理子数据;根据数据装载策略确定设定数量的寄存器,并将每个待处理子数据中相同位置的字符加载至同一寄存器。

具体的,待处理数据采用SM4进行加密,因此待处理数据中包含16个待处理子数据,每个待处理子数据作为一个加密块block,装载至寄存器中;数据装载策略用于表示寄存器数量,以及将待处理数据装载至设定数量的寄存器中时,每个寄存器需要装载的数据;待处理子数据为4个字,每个字对应一个位置。

基于此,确定内存空间中待处理数据包含的16个待处理子数据。根据数据装载策略确定与待处理子数据的数量匹配的寄存器,并将每个待处理子数据中相同位置的字符加载至同一寄存器。

沿用上例,SM4标准中一个加密块block是128bit,一个字是32bit,因此可以用4个AVX512寄存器t0,t1,t2,t3装载16个加密块block。如图3所示,在将16个加密块block(块0-块15)装载至四个寄存器(寄存器t0-寄存器t3)时,每个block中第一个字,放在t0的对应位值上,第二个字放入t1,第三个字放入t2,第四个字放入t3。因此,寄存器t0中装载了块0中的数据01、块1中的数据11、块2中的数据21、块3中的数据31......块12中的数据121、块13中的数据131、块14中的数据141、块15中的数据151等16个字;寄存器t1、寄存器t2和寄存器t3装载的数据如图3所示,在此不再赘述。

综上所述,将每个待处理子数据中相同位置的字符加载至同一寄存器,从而每个寄存器可以对装载的各个数据进行并行处理,提高数据处理效率。

进一步的,密钥数据无法直接用于待处理数据的加密,还需要对密钥数据进行密钥扩展,获得轮密钥后,才能够用于SM4的加密,具体实现如下:

调用密钥扩展函数对所述密钥数据进行密钥扩展,根据密钥扩展结果确定与所述SM4算法中预设轮次匹配的轮密钥。

具体的,密钥扩展基于固定的轮常数对密钥数据进行非线性变换获得;密钥扩展函数用于结合轮常数对密钥数据进行异或操作、循环移位、盒替换等操作,实现对密钥数据的密钥扩展;密钥扩展结果即为对密钥数据进行32次扩展获得的32轮的轮密钥,预设轮次即为SM4算法对应的32次。

基于此,调用密钥扩展函数对密钥数据进行密钥扩展,根据密钥扩展结果确定与SM4算法中预设轮次匹配的轮密钥。

沿用上例,密钥扩展函数实现如下:初始轮密钥:将128位的加密数据(MK)分为4个32位的子密钥,即MK0、MK1、MK2和MK3。其中,MK0直接作为第一轮的轮密钥RK0。密钥扩展:从第二轮开始,每轮的轮密钥都通过前一轮的轮密钥以及一个固定的轮常数(FK)进行非线性变换来生成。这个变换包括异或操作、循环移位、盒替换等步骤。循环移位:每轮的轮密钥会经过一定位数的循环移位。移位量是根据轮数来确定的,每轮都不同。盒替换:移位后的轮密钥会被分成4个8位的部分,每个部分都会通过一个8位的盒进行替换。盒是一个固定的、预定义的替换表,用于引入非线性。异或操作:盒替换后的结果会与一个轮常数(FK)进行异或操作,得到最终的轮密钥。轮常数也是根据轮数来确定的,每轮都不同。重复过程:以上步骤从第二轮开始重复进行,直到生成第32轮的轮密钥RK31。

综上所述,调用密钥扩展函数对密钥数据进行密钥扩展,从而获得满足SM4算法的32轮的轮密钥,用于后续对待加密数据的加密计算。

步骤206:基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据,并利用所述加密数据替换所述内存空间中的待处理数据,其中,所述指令函数关联所述SM4算法的轮函数。

具体的,在上述基于密钥数据生成SM4算法中预设轮次的轮密钥,以及将内存空间中的待处理数据加载至寄存器之后,即可基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据,指令函数关联SM4算法的轮函数,其中,指令函数即为AVX512指令集对应的指令函数,用于针对寄存器中的数据进行运算操作,运算操作包括但不限于循环移位、异或、仿射变化、数据传输(将内存中的数据加载至寄存器,以及将寄存器中的数据写入内存)等;加密数据即为对待加密数据采用SM4算法进行加密获得的数据;SM4算法的轮函数提供加密逻辑,对数据进行加密操作,包括盒替换、线性变换、异或操作和循环移位。

基于此,在上述基于密钥数据生成SM4算法中预设轮次的轮密钥,以及将内存空间中的待处理数据加载至寄存器后,即可利用寄存器完成对待加密数据的加密计算。基于寄存器预设的指令函数将寄存器中的待处理数据加密为加密数据。利用加密数据替换内存空间中的待处理数据。寄存器中的指令函数关联SM4算法的轮函数,基于寄存器预设的指令函数对待处理数据进行加密的过程即为基于SM4算法的轮函数和轮密钥对待处理数据进行加密的过程。SM4算法的轮函数包括的盒替换、线性变换、异或操作和循环移位等运算均通过执行寄存器预设的与各个运算匹配的指令函数完成。

进一步的,考虑到对待处理数据的加密计算通过寄存器实现,则需要对SM4的轮函数替换为寄存器执行的指令函数,具体实现如下:

在每个寄存器满足数据装载条件的情况下,按照预设的操作替换表将所述SM4算法的轮函数替换为指令函数;基于所述指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据。

具体的,在各个寄存器均满足数据装载条件的情况下,表示各个寄存器已经完成了对待处理数据的装载处理;此后,为了支持基于寄存器的指令集改造SM4标准算法,达到计算优化的目的,可以按照预设的操作替换表将SM4算法的字节运算操作转换为寄存器对应的指令运算操作。也就是说,将SM4算法的轮函数转换为寄存器对应的指令函数,实现利用寄存器的能力完成SM4算法的加密计算。

基于此,在每个寄存器满足数据装载条件的情况下,表示待处理数据均已存储至各个寄存器中。按照预设的操作替换表将SM4算法的轮函数替换为指令函数。基于指令函数和轮密钥将寄存器中的待处理数据加密为加密数据。

沿用上例,SM4_x16是SM4的AVX512实现,可以一次加密16个块,在利用寄存器对待加密数据进行加密时,寄存器采用的指令函数即可实现SM4的轮函数的加密操作。将轮密钥作为指令函数的参数,对待加密数据进行加密处理,即可获得加密数据。

综上所述,利用寄存器的能力完成SM4算法的实现,从而保证在后续可以基于寄存器对应的指令函数完成对寄存器中装载的待加密数据的并行加密处理,提高数据处理效率的同时,确保计算机性能的提升。

进一步的,考虑到利用SM4算法的轮函数对待加密数据进行加密时需要进行多种运算,寄存器的指令函数需要完成SM4算法加密时包含的每种运算,具体实现如下:

将所述SM4算法的轮函数划分为第一非线性子函数、第二非线性子函数和线性子函数;在所述操作替换表中确定与所述第一非线性子函数对应的异或运算指令函数,与所述第二非线性子函数对应的盒运算指令函数,以及与所述线性子函数对应的移位运算指令函数;将所述异或运算指令函数,所述盒运算指令函数和所述移位运算指令函数作为所述指令函数。

具体的,第一非线性子函数对应SM4算法的异或运算;第二非线性子函数对应SM4算法的盒运算;线性子函数对应SM4算法的移位运算;异或运算指令函数是寄存器中用于实现异或运算的函数;盒运算指令函数是寄存器中用于实现盒运算的函数;移位运算指令函数是寄存器中用于实现移位运算的函数。

基于此,根据SM4算法的加密逻辑将SM4算法的轮函数划分为第一非线性子函数、第二非线性子函数和线性子函数。在寄存器对应的操作替换表中确定与第一非线性子函数对应的异或运算指令函数,与第二非线性子函数对应的盒运算指令函数,以及与线性子函数对应的移位运算指令函数。将异或运算指令函数,盒运算指令函数和移位运算指令函数作为指令函数,替换SM4算法的加密逻辑中的异或运算、盒运算和移位运算。

沿用上例,SM4共执行32轮迭代,轮函数F可以分解为非线性函数和线性部分。非线性函数的运算包括异或运算和盒运算;线性部分对应移位运算。则查找寄存器对应的操作替换表,以操作替换表中的指令函数替换轮函数的非线性函数和线性部分。

综上所述,将基于SM4算法的轮函数确定的异或运算指令函数,盒运算指令函数和移位运算指令函数作为指令函数,从而利用寄存器的能力完成SM4算法的实现,提高针对待加密数据进行加密处理的处理效率。

进一步的,考虑到使用固定随机数种子可能会出现安全问题,降低生成的随机数的预测难度,因此需要根据随机数生成阈值重置随机数种子,具体实现如下:

基于所述随机数种子计算随机数生成数值;判断所述随机数生成数值是否大于预设的随机数生成阈值;若是,基于随机数种子重置函数将所述待处理数据更新为重置待处理数据,以及将所述密钥数据更新为重置密钥数据,将所述重置待处理数据作为所述待处理数据以及将所述重置密钥数据作为所述密钥数据,并执行所述将所述待处理数据存储至内存空间的步骤;若否,执行所述基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据的步骤。

具体的,随机数生成数值基于伪随机数生成器初始计数器值IV和计数器变量Ctr计算获得;随机数生成阈值可以根据实际需求进行设置;随机数种子重置函数即为重新播种函数,用于对密钥数据和初始计数器值IV进行重新初始化。重置待处理数据即为对待处理数据进行重新初始化后获得的待处理数据;重置密钥数据即为对密钥数据进行重新初始化后获得的密钥数据。

基于此,基于随机数种子计算随机数生成数值。判断随机数生成数值是否大于预设的随机数生成阈值;若随机数生成数值大于预设的随机数生成阈值,表示密钥数据的安全性降低,需要通过重置对密钥数据进行初始化,即可基于随机数种子重置函数将待处理数据更新为重置待处理数据,以及将密钥数据更新为重置密钥数据,将重置待处理数据作为待处理数据以及将重置密钥数据作为密钥数据,并将待处理数据存储至内存空间,直至完成目标随机数的确定;若随机数生成数值不大于预设的随机数生成阈值,表示密钥数据的安全性尚可,可以继续使用,则基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据。

沿用上例,随机数生成数值可以通过ctr+16-IV计算确定。随机数种子重置函数sm4_prng_reseed的算法步骤如下,Key=SM4(RoundKey,ctr);IV=SM4(RoundKey,ctr+1);RoundKey=extend_key(Key);ctr=IV。其中,RoundKey表示轮密钥,extend_key表示密钥扩展函数,Key表示密钥数据。

综上所述,随机数生成数值大于预设的随机数生成阈值的情况下,基于随机数种子重置函数将待处理数据更新为重置待处理数据,以及将密钥数据更新为重置密钥数据,从而保证生成的目标随机数不可预测,提高目标随机数的安全性。

步骤208:按照所述随机数获取请求关联的数据获取参数在所述内存空间存储的加密数据中提取目标随机数,作为所述随机数获取请求的响应。

具体的,在上述基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据之后,即可按照随机数获取请求关联的数据获取参数在内存空间存储的加密数据中提取目标随机数,作为随机数获取请求的响应,其中,数据获取参数可以表示需要获取的随机数长度;随机数长度可以通过位表示,数据获取参数为10,则表示需要获取10位的目标随机数:目标随机数即为在加密数据中提取的随机数字符串,可以按照加密数据中各个字符的排列顺序顺次提取,也可以设置提取规则,按照提取规则在加密数据中提取随机数,组成目标随机数,提取规则可以是按照加密数据中字符的顺序进行倒序提取,也可以是针对加密数据间隔固定的位数进行提取。

基于此,在上述基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据后,确定对随机数获取请求进行解析获得数据获取参数,基于数据获取参数在内存空间存储的加密数据中提取目标随机数,并将目标随机数作为随机数获取请求的响应。目标随机数可以用于后续的多方安全计算任务。

进一步的,考虑到加密数据具有一定的数据长度,可以通过随机数生成函数在加密数据中提取目标随机数,具体实现如下:

对所述随机数获取请求进行解析获得数据获取参数;将所述数据获取参数和内存空间存储的加密数据输入至随机数生成函数,获得所述随机数生成函数输出的与所述数据获取参数匹配的目标随机数。

具体的,数据获取参数用于表示随机数长度;随机数生成函数用于在加密数据中提取目标随机数;随机数生成函数可以基于输入的数据获取参数在加密数据中提取与数据获取参数对应的随机数长度匹配的目标随机数。

基于此,对随机数获取请求进行解析获得表示随机数长度的数据获取参数。将数据获取参数和内存空间存储的加密数据输入至随机数生成函数,获得随机数生成函数输出的与数据获取参数匹配的目标随机数。随机数生成函数对加密数据进行随机数提取时,根据内存空间中数据开始位置的下标,在内存空间中读取随机数,存储至数组,数组中存储的随机数即为目标随机数。

沿用上例,数据获取参数表示需要获取的随机数的随机数长度。根据加密数据在内存中存储的数据标识依次读取随机数,直至读取到与随机数长度匹配的目标随机数。基于随机数生成函数生成目标随机数的算法流程(伪代码)如下所示,其中,buffer表示内存空间,BytesIdx表示数据标识,sm4_prng_update()表示重新播种函数,memory_copy表示随机数提取函数,用于根据step、BytesIdx在buffer中提取随机数,step表示随机数提取数量。

while(N):

step=min(n,256-BytesIdx)

memory_copy(output,buffer+BytesIdx,step)

output=output+step

N=N-step

BytesIdx=BytesIdx+step

if(BytesIdx==256):

sm4_prng_update()

综上所述,基于随机数生成函数在加密数据中提取目标随机数,从而提高目标随机数的提取效率。

本说明书提供的基于国密SM4算法的随机数生成方法,通过根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将待处理数据存储至内存空间;基于密钥数据生成SM4算法中预设轮次的轮密钥,以及将内存空间中的待处理数据加载至寄存器;基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据,其中,指令函数关联SM4算法的轮函数;按照随机数获取请求关联的数据获取参数在内存空间存储的加密数据中提取目标随机数,作为随机数获取请求的响应。先将内存空间中的待加密数据加载至寄存器,再基于寄存器预设的指令函数对待加密数据进行加密,从而提高加密效率。基于国密SM4算法生成目标随机数,从而提高目标随机数的安全性,避免目标随机数被破译。

下述结合附图4,以本说明书提供的基于国密SM4算法的随机数生成方法在多方安全计算的应用为例,对所述基于国密SM4算法的随机数生成方法进行进一步说明。其中,图4示出了本说明书一实施例提供的一种应用于多方安全计算的基于国密SM4算法的随机数生成方法的处理流程图,具体包括以下步骤:

步骤402:确定随机数种子。

随机数生成可应用于多方安全计算(例如秘密分享协议)等场景,在生成随机数时需要确定随机数种子。

步骤404:将随机数种子翻转拷贝至初始计数器值的存储空间以及密钥数据的存储空间。

将32byte的随机数种子,翻转拷贝到IV(初始计数器值)和Key(密钥数据)对应的内存空间。

步骤406:将初始计数器值和计数器变量转换为目标类型的变量,并将初始计数器值的存储空间存储的初始值作为待加密数据赋值给计数器变量。

将IV和Ctr(计数器变量)转为uint128_t类型的变量,将IV赋值给Ctr。

步骤408:调用密钥扩展函数,基于密钥数据生成SM4算法32轮迭代的轮密钥。

输入Key(密钥数据),调用密钥扩展函数,生成SM4 32轮迭代的轮密钥RoundKey。

步骤410:确定内存空间,并将计数器变量对应的待加密数据存储至内存空间。

分配Buffer内存,设置BytesIdx为256,表示缓冲区不可读。依次将待加密数据ctr,ctr+1,ctr+2,...,ctr+15存储至Buffer内存。

步骤412:在基于计数器变量和初始计数器值确定的播种数值小于等于重新播种阈值的情况下,将内存空间中存储的待加密数据装载至AVX512寄存器。

SM4标准中一个加密块block是128bit,一个字是32bit,因此可以用4个AVX512寄存器t0,t1,t2,t3装载16个block。每个block中第一个字,放在t0的对应位值上,第二个字放入t1,第三个字放入t2,第四个字放入t3。

实际应用中,SM4共执行32轮迭代,每轮计算。轮函数F可以分解为非线性函数:以及线性部分:。

具体实施时,连续多个异或使用AVX512寄存器对应的指令函数_mm512_ternarylogic_epi32混合指令函数_mm512_xor_epi32实现。指令函数_mm512_ternarylogic_epi32和指令函数_mm512_xor_epi32的CPI(Cycle Per Instruction)都为0.5。使用三元运算替换两个异或,理论可以节省0.5个CPU时钟周期。Sbox(X)盒变换可使用如下的指令实现:x=_mm512_gf2p8affine_epi64_epi8(x,a1,b1):x=_mm512_gf2p8affineinv_epi64_epi8(x,a2,b2);_mm512_gf2p8affine_epi64_epi8和_mm512_gf2p8affineinv_epi64_epi8的平均CPI为1。循环左移使用_mm512_rol_epi32指令实现,_mm512_rol_epi32平均CPI为1。上述指令函数来自GFNI和AVX512指令集,指令函数及其含义参见下述表1。

表1

步骤414:基于AVX512寄存器对应的指令函数和轮密钥对待加密数据进行加密计算,获得加密数据,并以加密数据覆盖内存空间中存储的待加密数据。

采用SM4_x16进行加密。SM4_x16是SM4的AVX512实现,可以一次加密16个块。如果计数器累加超过重新播种阈值,则调用重新播种函数,更新Key,RoundKey,IV等状态。

步骤416:确定随机数序列的字节长度,基于随机数序列的字节长度、加密数据以及随机数生成函数确定目标随机数序列。

调用随机数生成函数,即可基于随机数序列的字节长度生成目标随机数序列,目标随机数序列可以用户多方安全计算等任务。

综上所述,使用GFNI和AVX512指令集实现16路SM4向量化并行加密,并基于向量化的SM4实现了快速的伪随机数生成算法。所实现的PRNG模块可以方便的集成进现有的多方安全计算框架。使用C++编译器普遍支持的uint128_t数据实现了128计数器的累加,提高了整体的吞吐量。将内存空间中的待加密数据加载至寄存器,再基于向量指令扩展对待加密数据进行加密(例如英特尔平台的向量指令扩展),从而提高加密效率。基于国密SM4算法生成目标随机数,从而提高目标随机数的安全性。

与上述方法实施例相对应,本说明书还提供了基于国密SM4算法的随机数生成装置实施例,图5示出了本说明书一实施例提供的一种基于国密SM4算法的随机数生成装置的结构示意图。如图5所示,该装置包括:

存储模块502,被配置为根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将所述待处理数据存储至内存空间;

加载模块504,被配置为基于所述密钥数据生成SM4算法中预设轮次的轮密钥,以及将所述内存空间中的待处理数据加载至寄存器;

加密模块506,被配置为基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据,并利用所述加密数据替换所述内存空间中的待处理数据,其中,所述指令函数关联所述SM4算法的轮函数;

提取模块508,被配置为按照所述随机数获取请求关联的数据获取参数在所述内存空间存储的加密数据中提取目标随机数,作为所述随机数获取请求的响应。

一个可选地实施例,所述存储模块502,进一步被配置为:

接收随机数获取请求,并对所述随机数获取请求进行解析获得随机数种子;

对所述随机数种子进行翻转操作,获得翻转随机数种子;

基于所述翻转随机数种子分别生成密钥数据和初始计数器值;

将所述初始计数器值转换为与预设的数据类型匹配的所述待处理数据。

一个可选地实施例,所述存储模块502,还被配置为:

将所述初始计数器值赋值至初始计数器变量;

所述将所述初始计数器值转换为与预设的数据类型匹配的所述待处理数据,包括:

确定计数器变量,并将所述计数器变量的变量类型以及所述初始计数器变量的变量类型转换为目标变量类型;

将目标变量类型的初始计数器变量对应的初始计数器值赋值至目标变量类型的计数器变量,并将赋值后的计数器变量作为所述待处理数据。

一个可选地实施例,所述加载模块504,进一步被配置为:

确定所述内存空间中待处理数据包含的待处理子数据;

根据数据装载策略确定设定数量的寄存器,并将每个待处理子数据中相同位置的字符加载至同一寄存器。

一个可选地实施例,所述加密模块506,进一步被配置为:

在每个寄存器满足数据装载条件的情况下,按照预设的操作替换表将所述SM4算法的轮函数替换为指令函数;

基于所述指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据。

一个可选地实施例,所述加密模块506,进一步被配置为:

将所述SM4算法的轮函数划分为第一非线性子函数、第二非线性子函数和线性子函数;

在所述操作替换表中确定与所述第一非线性子函数对应的异或运算指令函数,与所述第二非线性子函数对应的盒运算指令函数,以及与所述线性子函数对应的移位运算指令函数;

将所述异或运算指令函数,所述盒运算指令函数和所述移位运算指令函数作为所述指令函数。

一个可选地实施例,所述加密模块506,还被配置为:

基于所述随机数种子计算随机数生成数值;

判断所述随机数生成数值是否大于预设的随机数生成阈值;

若是,基于随机数种子重置函数将所述待处理数据更新为重置待处理数据,以及将所述密钥数据更新为重置密钥数据,将所述重置待处理数据作为所述待处理数据以及将所述重置密钥数据作为所述密钥数据,并执行所述将所述待处理数据存储至内存空间的步骤;

若否,执行所述基于所述寄存器预设的指令函数和所述轮密钥将所述寄存器中的待处理数据加密为加密数据的步骤。

一个可选地实施例,所述提取模块508,进一步被配置为:

对所述随机数获取请求进行解析获得数据获取参数;

将所述数据获取参数和内存空间存储的加密数据输入至随机数生成函数,获得所述随机数生成函数输出的与所述数据获取参数匹配的目标随机数。

一个可选地实施例,所述加载模块504,进一步被配置为:

调用密钥扩展函数对所述密钥数据进行密钥扩展,根据密钥扩展结果确定与所述SM4算法中预设轮次匹配的轮密钥。

本说明书提供的基于国密SM4算法的随机数生成方法,通过根据随机数获取请求携带的随机数种子生成待处理数据和密钥数据,并将待处理数据存储至内存空间;基于密钥数据生成SM4算法中预设轮次的轮密钥,以及将内存空间中的待处理数据加载至寄存器;基于寄存器预设的指令函数和轮密钥将寄存器中的待处理数据加密为加密数据,并利用加密数据替换内存空间中的待处理数据,其中,指令函数关联SM4算法的轮函数;按照随机数获取请求关联的数据获取参数在内存空间存储的加密数据中提取目标随机数,作为随机数获取请求的响应。先将内存空间中的待加密数据加载至寄存器,再基于寄存器预设的指令函数对待加密数据进行加密,从而提高加密效率。基于国密SM4算法生成目标随机数,从而提高目标随机数的安全性,避免目标随机数被破译。

上述为本实施例的一种基于国密SM4算法的随机数生成装置的示意性方案。需要说明的是,该基于国密SM4算法的随机数生成装置的技术方案与上述的基于国密SM4算法的随机数生成方法的技术方案属于同一构思,基于国密SM4算法的随机数生成装置的技术方案未详细描述的细节内容,均可以参见上述基于国密SM4算法的随机数生成方法的技术方案的描述。

图6示出了根据本说明书一实施例提供的一种计算设备600的结构框图。该计算设备600的部件包括但不限于存储器610和处理器620。处理器620与存储器610通过总线630相连接,数据库650用于保存数据。

计算设备600还包括接入设备640,接入设备640使得计算设备600能够经由一个或多个网络660通信。这些网络的示例包括公用交换电话网(PSTN,Public SwitchedTelephone Network)、局域网(LAN,Local Area Network)、广域网(WAN,Wide AreaNetwork)、个域网(PAN,Personal Area Network)或诸如因特网的通信网络的组合。接入设备640可以包括有线或无线的任何类型的网络接口(例如,网络接口卡(NIC,networkinterface controller))中的一个或多个,诸如IEEE802.11无线局域网(WLAN,WirelessLocal Area Network)无线接口、全球微波互联接入(Wi-MAX,WorldwideInteroperability for Microwave Access)接口、以太网接口、通用串行总线(USB,Universal Serial Bus)接口、蜂窝网络接口、蓝牙接口、近场通信(NFC,Near FieldCommunication)接口,等等。

在本说明书的一个实施例中,计算设备600的上述部件以及图6中未示出的其他部件也可以彼此相连接,例如通过总线。应当理解,图6所示的计算设备结构框图仅仅是出于示例的目的,而不是对本说明书范围的限制。本领域技术人员可以根据需要,增添或替换其他部件。

计算设备600可以是任何类型的静止或移动计算设备,包括移动计算机或移动计算设备(例如,平板计算机、个人数字助理、膝上型计算机、笔记本计算机、上网本等)、移动电话(例如,智能手机)、可佩戴的计算设备(例如,智能手表、智能眼镜等)或其他类型的移动设备,或者诸如台式计算机或个人计算机(PC,Personal Computer)的静止计算设备。计算设备600还可以是移动式或静止式的服务器。

其中,处理器620执行所述计算机程序或指令时实现所述的基于国密SM4算法的随机数生成方法的步骤。

上述为本实施例的一种计算设备的示意性方案。需要说明的是,该计算设备的技术方案与上述的基于国密SM4算法的随机数生成方法的技术方案属于同一构思,计算设备的技术方案未详细描述的细节内容,均可以参见上述基于国密SM4算法的随机数生成方法的技术方案的描述。

本说明书一实施例还提供一种计算机可读存储介质,其存储有计算机程序或指令,该计算机程序或指令被处理器执行时实现如前所述基于国密SM4算法的随机数生成方法的步骤。

上述为本实施例的一种计算机可读存储介质的示意性方案。需要说明的是,该存储介质的技术方案与上述的基于国密SM4算法的随机数生成方法的技术方案属于同一构思,存储介质的技术方案未详细描述的细节内容,均可以参见上述基于国密SM4算法的随机数生成方法的技术方案的描述。

本说明书一实施例还提供一种计算机程序产品,包括计算机程序或指令,该计算机程序或指令被处理器执行时实现上述基于国密SM4算法的随机数生成方法的步骤。

上述为本实施例的一种计算机程序产品的示意性方案。需要说明的是,该计算机程序产品的技术方案与上述的基于国密SM4算法的随机数生成方法的技术方案属于同一构思,计算机程序产品的技术方案未详细描述的细节内容,均可以参见上述基于国密SM4算法的随机数生成方法的技术方案的描述。

上述对本说明书特定实施例进行了描述。其它实施例在所附权利要求书的范围内。在一些情况下,在权利要求书中记载的动作或步骤可以按照不同于实施例中的顺序来执行并且仍然可以实现期望的结果。另外,在附图中描绘的过程不一定要求示出的特定顺序或者连续顺序才能实现期望的结果。在某些实施方式中,多任务处理和并行处理也是可以的或者可能是有利的。

所述计算机程序或指令包括计算机程序代码,所述计算机程序代码可以为源代码形式、对象代码形式、可执行文件或某些中间形式等。所述计算机可读介质可以包括:能够携带所述计算机程序代码的任何实体或装置、记录介质、U盘、移动硬盘、磁碟、光盘、计算机存储器、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,Random AccessMemory)、电载波信号、电信信号以及软件分发介质等。

需要说明的是,对于前述的各方法实施例,为了简便描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本说明书并不受所描述的动作顺序的限制,因为依据本说明书,某些步骤可以采用其它顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定都是本说明书所必须的。

在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详述的部分,可以参见其它实施例的相关描述。

以上公开的本说明书优选实施例只是用于帮助阐述本说明书。可选实施例并没有详尽叙述所有的细节,也不限制该发明仅为所述的具体实施方式。显然,根据本说明书的内容,可作很多的修改和变化。本说明书选取并具体描述这些实施例,是为了更好地解释本说明书的原理和实际应用,从而使所属技术领域技术人员能很好地理解和利用本说明书。本说明书仅受权利要求书及其全部范围和等效物的限制。

技术分类

06120116587716