一种基于国产商用密码算法的快速保留数据格式加密计算方法与流程

文档序号:31777400发布日期:2022-10-12 08:51阅读:478来源:国知局
一种基于国产商用密码算法的快速保留数据格式加密计算方法与流程

1.本发明公开了一种基于国产商用密码算法的快速保留数据格式加密计算方法,适用于采用自主可控算法来实现数据快速保留格式加密的应用场景。


背景技术:

2.目前对数据的保留格式加密多基于国际算法,feistel结构中的ciph算法均采用aes来进行计算,面对国内自主可控、国产化推广的要求面临算法不合规的风险;某些算法通常采用算法替换的方式进行国产化改造,现有的一些保留格式国密算法改造几乎都是基于ff1的算法模型进行处理,都集成了原有的feistel结构,只是在算法层面上进行sm4或者hmac-sm3的算法替换。通常的,sm4\hmac-sm3\aes性能遵循以下规律,即hmac-sm3≤sm4<aes,从而造成算法性能整体下降。
3.鉴于上述原因,面对合规及高效的保留数据格式加密的应用场景,亟需本领域技术任意进行解决。


技术实现要素:

4.有鉴于此,本发明提供了一种采用国产商用密码算法进行快速保留格式加密的计算方法,基于hmac-sm3算法来实现国产商用密码算法替换和衍生密钥的提前计算,能够有效的降低过程计算复杂度,在保障算法安全的同时实现基于过程密码算法的快速保留格式加密。
5.为了实现上述目的,本发明采用如下技术方案:
6.radix为在区间[2,65535]内的一个正整数。
[0007]
x为输入数组,内部每个元素a均满足0≤a<radix,其数组长度区间为[2,4096]
[0008]
len(x),即数组x的元素个数
[0009]
k为密钥数据,为字节数字,长度为16字节
[0010]
t为密钥iv向量信息,长度为16字节
[0011]
t为t的字节数,即t=len(t)
[0012]
n为输入数组x的元素个数,即n=len(x)
[0013]
li(x)为最大取整函数,即获取≤x的最大整数
[0014]
hi(x)为最小取整函数,即获取≥x的最小整数
[0015]
u,v为过程数据,均为正整数
[0016]
a,b为过程数据,均为整数数组
[0017]
p为过程数据,为字节数组
[0018]
[i..j]为数组截取,即代表从数组i到j位置的所有元素,包括i和j
[0019]
||为字节连接功能,即把相关的两个字节进行相连
[0020]
[x]n为通过n个字节来表示数字x
[0021]
mod即为整除求余运算
[0022]
getarr(k,s,l)为密钥衍生算法,k为密钥,s为种子数据,l为期望返回的字节长度。内部算法遵循以下规则:
[0023]
getarr(k,s,l)=hmac-sm3(k,s0)+
[0024]
hmac-sm3(k,s1)+
[0025]
hmac-sm3(k,s2)+
[0026]
……
[0027]
其中s0=hmac-sm3(s)
[0028]
s(i)=hmac-sm3(k,s(i-1))
[0029]
通过上述算法即可获得长度为l的字节信息,其中hmac-sm3也可以替换成cmac-sm4算法
[0030]
mid(array,startpos,length)为从字节数组array中startpos位置获取length长度的字节
[0031]
num
radix
(array)的计算遵循以下规则:
[0032]
1.令x=0
[0033]
2.针对array中每个元素a,按照排列顺序从小到大循环计算
[0034]
x=x*radix+a
[0035]
3.返回得到的整数x
[0036]
str
mradix
(x)的计算长度为m的一个整数数组arr,遵循以下规则:
[0037]
1.判断x应满足0≤x<radixm[0038]
2.从1开始到m递增,这个数组每个元素通过以下方式计算,即arr[i-1]=x mod radix
[0039]
x=li(x/radix)
[0040]
r为保留格式计算后输出数组
[0041]
计算流程
[0042]
1加密流程
[0043]
其计算过程遵循以下流程:
[0044]
1.明确radix、密钥k、iv向量t以及明文整数数组x
[0045]
2.分别获取x和t的元素大小,分别为n和t
[0046]
3.将n整除2,并通过li函数获取小于等于此数的最大整数u,并计算v=n-u
[0047]
4.将x进行数组分割,a数组为x数组第1个元素到第u个元素;b数组为第u+1个元素到第n个元素;
[0048]
5.按照b=hi(hi(v*log(radix))/8)的计算流程获取整数b
[0049]
6.按照d=4*hi(b/4)+4的计算流程得到整数d
[0050]
7.组成字节数组p,p的组合规则符合p=[1]1||[2]1||[1]1||[radix]3||[10]1||[u mod 256]1||[n]4||[t]4||t
[0051]
8.通过getarr功能模块获取衍生出的字节信息s,其中getarr中的密钥为k,种子数据为7中的p,计划获取的字节长度为d*10
[0052]
9.令i从0开始,逐次累加1,进行10次循环计算,每一次计算都遵循以下流程:
[0053]
1)从8中的s中获取本次计算的数据st,st=mid(s,i*d,d)(以0表示第一个元素)
[0054]
2)将st通过num
256
转换为一个整数y
[0055]
3)识别当前循环次数i是否为偶数,若为偶数则m=u;反之m=v
[0056]
4)计算c=(num
radix
(a)+y)mod radixm[0057]
5)通过c=str
mradix
(c)得到长度为m的整数数组c
[0058]
6)将数组b赋值给a,将数组c赋值给b,同时递增i值
[0059]
7)根据i值确认是否完成10次循环计算。若未完成则转到1)进行下一次计算;若已完成则将此时的数组a、数组b进行联合,输出最终的加密后的结果r
[0060]
2解密流程
[0061]
其计算过程遵循以下流程:
[0062]
1.明确radix、密钥k、iv向量t以及密文整数数组x
[0063]
2.分别获取x和t的元素大小,分别为n和t
[0064]
3.将n整除2,并通过li函数获取小于等于此数的最大整数u,并计算v=n-u
[0065]
4.将x进行数组分割,a数组为x数组第1个元素到第u个元素;b数组为第u+1个元素到第n个元素;
[0066]
5.按照b=hi(hi(v*log(radix))/8)的计算流程获取整数b
[0067]
6.按照d=4*hi(b/4)+4的计算流程得到整数d
[0068]
7.组成字节数组p,p的组合规则符合p=[1]1||[2]1||[1]1||[radix]3||[10]1||[u mod 256]1||[n]4||[t]4||t
[0069]
8.通过getarr功能模块获取衍生出的字节信息s,其中getarr中的密钥为k,种子数据为7中的p,计划获取的字节长度为d*10
[0070]
9.令i从9开始,逐次累减1,进行10次循环计算,每一次计算都遵循以下流程:
[0071]
1)从8中的s中获取本次计算的数据st,st=mid(s,i*d,d)(以0表示第一个元素)
[0072]
2)将st通过num
256
转换为一个整数y
[0073]
3)识别当前循环次数i是否为偶数,若为偶数则m=u;反之m=v
[0074]
4)计算c=(num
radix
(b)-y)mod radixm[0075]
5)通过c=str
mradix
(c)得到长度为m的整数数组c
[0076]
6)将数组a赋值给b,将数组c赋值给a,同时递减i值
[0077]
7)根据i值确认是否完成10次循环计算。若未完成则转到1)进行下一次计算;若已完成则将此时的数组a、数组b进行联合,输出最终的加密后的结果r
附图说明
[0078]
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
[0079]
图1为本发明提供的加密算法流程图。
[0080]
图2为本发明提供的解密算法流程图。
具体实施方式
[0081]
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0082]
1加密流程
[0083]
其计算过程遵循以下流程:
[0084]
1.明确radix、密钥k、iv向量t以及明文整数数组x
[0085]
2.分别获取x和t的元素大小,分别为n和t
[0086]
3.将n整除2,并通过li函数获取小于等于此数的最大整数u,并计算v=n-u
[0087]
4.将x进行数组分割,a数组为x数组第1个元素到第u个元素;b数组为第u+1个元素到第n个元素;
[0088]
5.按照b=hi(hi(v*log(radix))/8)的计算流程获取整数b
[0089]
6.按照d=4*hi(b/4)+4的计算流程得到整数d
[0090]
7.组成字节数组p,p的组合规则符合p=[1]1||[2]1||[1]1||[radix]3||[10]1||[u mod 256]1||[n]4||[t]4||t
[0091]
8.通过getarr功能模块获取衍生出的字节信息s,其中getarr中的密钥为k,种子数据为7中的p,计划获取的字节长度为d*10
[0092]
9.令i从0开始,逐次累加1,进行10次循环计算,每一次计算都遵循以下流程:
[0093]
1)从8中的s中获取本次计算的数据st,st=mid(s,i*d,d)(以0表示第一个元素)
[0094]
2)将st通过num
256
转换为一个整数y
[0095]
3)识别当前循环次数i是否为偶数,若为偶数则m=u;反之m=v
[0096]
4)计算c=(num
radix
(a)+y)mod radixm[0097]
5)通过c=str
mradix
(c)得到长度为m的整数数组c
[0098]
6)将数组b赋值给a,将数组c赋值给b,同时递增i值
[0099]
7)根据i值确认是否完成10次循环计算。若未完成则转到1)进行下一次计算;若已完成则将此时的数组a、数组b进行联合,输出最终的加密后的结果r
[0100]
2解密流程
[0101]
其计算过程遵循以下流程:
[0102]
1.明确radix、密钥k、iv向量t以及密文整数数组x
[0103]
2.分别获取x和t的元素大小,分别为n和t
[0104]
3.将n整除2,并通过li函数获取小于等于此数的最大整数u,并计算v=n-u
[0105]
4.将x进行数组分割,a数组为x数组第1个元素到第u个元素;b数组为第u+1个元素到第n个元素;
[0106]
5.按照b=hi(hi(v*log(radix))/8)的计算流程获取整数b
[0107]
6.按照d=4*hi(b/4)+4的计算流程得到整数d
[0108]
7.组成字节数组p,p的组合规则符合p=[1]1||[2]1||[1]1||[radix]3||[10]1||[u mod 256]1||[n]4||[t]4||t
[0109]
8.通过getarr功能模块获取衍生出的字节信息s,其中getarr中的密钥为k,种子
数据为7中的p,计划获取的字节长度为d*10
[0110]
9.令i从9开始,逐次累减1,进行10次循环计算,每一次计算都遵循以下流程:
[0111]
1)从8中的s中获取本次计算的数据st,st=mid(s,i*d,d)(以0表示第一个元素)
[0112]
2)将st通过num
256
转换为一个整数y
[0113]
3)识别当前循环次数i是否为偶数,若为偶数则m=u;反之m=v
[0114]
4)计算c=(num
radix
(b)-y)mod radixm[0115]
5)通过c=str
mradix
(c)得到长度为m的整数数组c
[0116]
6)将数组a赋值给b,将数组c赋值给a,同时递减i值
[0117]
7)根据i值确认是否完成10次循环计算。若未完成则转到1)进行下一次计算;若已完成则将此时的数组a、数组b进行联合,输出最终的加密后的结果r
[0118]
本说明书中各个实施例采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似部分互相参见即可。对于实施例公开的装置而言,由于其与实施例公开的方法相对应,所以描述的比较简单,相关之处参见方法部分说明即可。
[0119]
对所公开的实施例的上述说明,使本领域专业技术人员能够实现或使用本发明。对这些实施例的多种修改对本领域的专业技术人员来说将是显而易见的,本文中所定义的一般原理可以在不脱离本发明的精神或范围的情况下,在其它实施例中实现。因此,本发明将不会被限制于本文所示的这些实施例,而是要符合与本文所公开的原理和新颖特点相一致的最宽的范围。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1