一种基于消息鉴别码算法的保留格式加密方法及解密方法转让专利

申请号 : CN202110417012.4

文献号 : CN112994874B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 罗影张文科敖麒刘红军

申请人 : 工业信息安全(四川)创新中心有限公司

摘要 :

本发明提供一种基于消息鉴别码算法的保留格式加密方法及解密方法,所述加密方法包括:S11,字符串拆分:将输入的待加密明文P拆分为两个子字符串并分别转化为BN型整数;S12,字符串迭代:设置迭代索引号为i=0,1,2,…,7,对步骤S11得到的两个BN型整数进行8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码算法HMAC‑SM3的伪随机数字节生成函数;S13,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到密文C。本发明的加密方法满足国产化以及安全性要求并且执行效率较高。

权利要求 :

1.一种基于消息鉴别码算法的保留格式加密方法,其特征在于,包括如下步骤:S11,字符串拆分:将输入的待加密明文P拆分为两个子字符串并分别转化为BN型整数;

其中,将数值较小的整数记为INT型整数,将数值较大的整数记为BN型整数;

S12,字符串迭代:设置迭代索引号为i=0,1,2,…,7,对步骤S11得到的两个BN型整数进行8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码算法HMAC‑SM3的伪随机数字节生成函数;

S13,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到密文C;

步骤S11包括如下子步骤:S111,输入密钥K,长度为7个字节的调节因子T,以及待加密明文P;所述待加密明文P是长度为n的字符串,n满足 ,radix满足2≤radix≤65536;

S112,分别取INT型整数 ,v←n‑u,符号←代表赋值,即将 赋值给u,n‑u赋值给v;将明文字符串P拆分为两个字符串A和B:A←P[1,…,u],B←P[u+1,…,n]其中,P[1,…,u]表示明文字符串P中的第1至u个字符,P[u+1,…,n]表示明文字符串P中的第u至n个字符;即将明文字符串P中的第1至u个字符赋值给字符串A,将明文字符串P中的第u+1至n个字符赋值给字符串B;

S113,将这两个字符串A和B分别转为BN型整数α和β:α←NUMradix(REV(A)),β←NUMradix(REV(B));

步骤S12包括如下子步骤:S121,组合16个字节的字节串Q:式中,mod表示模运算,即取余数,即:(1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:取调节因子T的第5~7个字节T[5..7];

取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T[4]^1

0x0F;再将此结果左移4比特得到(T[4]^0x0F)<<4;再将(T[4]^0x0F)<<4与[i] 做异或运1

算,得到((T[4]^0x0F)<<4)⊕[i];

1 12

最后将T[5..7]、((T[4]^0x0F)<<4)⊕[i]以及[β] 做串联得到字节串Q;

(2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:取调节因子T的第1~3个字节T[1..3];

取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T[4]^

1 1

0x0F;再将T[4]^0x0F与[i]做异或运算,得到(T[4]^0x0F)⊕[i];

1 12

最后将T[1..3]、(T[4]^0x0F)⊕[i]以及[β] 做串联得到字节串Q;

1 12

其中,[i]表示将i转换为长度为1的字节串,[β] 表示将β转换为长度为12的字节串;

S122,将字节串Q利用PRF变换计算消息鉴别码得到字节串E:E←PRFREVB(K)(REVB(Q))S123,将字节串E转为BN型整数γ:γ←NUM(E)

S124,执行模加运算得到BN型整数δ:m

δ←(α+γ) mod radixm

即将BN型整数α和步骤S123得到的BN型整数γ相加后,将相加的结果与radix 进行模运算,并将模运算结果赋值给BN型整数δ;

其中,INT型整数m的取值为,如果i mod 2=0,m←u,否则m←v;即当迭代索引号i为偶数时,将u赋值给m;当迭代索引号i为奇数时,将v赋值给m;

S125,左右互换,即α←β,β←δ;即将BN型整数β赋值给BN型整数α,再将步骤S124得到的BN型整数δ赋值给BN型整数β;

S126,按迭代次数重复执行步骤S121~S125,迭代完成后得到BN型整数α和β。

2.根据权利要求1所述的基于消息鉴别码算法的保留格式加密方法,其特征在于,步骤S121中的所述字节串Q能够做如下简化:S1211,分别计算两个字节BE和Bo:BE←(T[4]^0x0F)<<4,Bo←T[4]^0x0F即,将(T[4]^0x0F)<<4赋值给BE,将T[4]^0x0F赋值给Bo;

S1212,字节串Q简化为:即:

(1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:取调节因子T的第5~7个字节T[5..7];

1 1

将BE与[i]做异或运算,得到BE⊕[i];

1 12

最后将T[5..7]、BE⊕[i]以及[β] 做串联得到字节串Q;

(2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:取调节因子T的第1~3个字节T[1..3];

1 1

将Bo与[i]做异或运算,得到Bo⊕[i];

1 12

最后将T[1..3]、Bo⊕[i]以及[β] 做串联得到字节串Q。

3.根据权利要求1所述的基于消息鉴别码算法的保留格式加密方法,其特征在于,步骤S122中所述PRF变换的方法为:对字节串Q执行基于HMAC‑SM3的消息鉴别码,然后对消息鉴别码截断得到m字节的字节串E。

4.根据权利要求3所述的基于消息鉴别码算法的保留格式加密方法,其特征在于,步骤S13包括如下子步骤:

S131,将步骤S126得到的BN型整数α和β分别转为字符串A和B:, ;

S132,串联字符串A和B,C←A||B,返回密文C。

5.一种基于消息鉴别码算法的保留格式解密方法,其特征在于,所述解密方法用于对权利要求1至4任一项所述的加密方法得到的密文C进行解密;包括如下步骤:S21,字符串拆分:将输入的待解密密文P拆分为两个子字符串并分别转化为BN型整数;

S22,字符串迭代:设置迭代索引号为i=7,6,…,0,对步骤S21得到的两个BN型整数进行

8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码算法HMAC‑SM3的伪随机数字节生成函数;

S23,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到明文P;

步骤S21包括如下子步骤:S211,输入密钥K,长度为7个字节的调节因子T,以及待解密密文C;所述待加密明文C是长度为n的字符串,n满足 ,radix满足2≤radix≤65536;

S212,分别取INT型整数 ,v←n‑u,符号←代表赋值,即将 赋值给u,n‑u赋值给v;将待解密密文C拆分为两个字符串A和B:A←C[1,…,u],B←C[u+1,…,n]其中,C[1,…,u]表示密文C中的第1至u个字符,C[u+1,…,n]表示密文C中的第u至n个字符;即将密文C中的第1至u个字符赋值给字符串A,将密文C中的第u+1至n个字符赋值给字符串B;

S213,将这两个字符串A和B分别转为BN型整数α和β:α←NUMradix(REV(A)),β←NUMradix(REV(B));

步骤S22包括如下子步骤:S221,组合16个字节的字节串Q:即:

式中,mod表示模运算,即取余数,即:(1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:取调节因子T的第5~7个字节T[5..7];

取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T[4]^1

0x0F;再将此结果左移4比特得到(T[4]^0x0F)<<4;再将(T[4]^0x0F)<<4与[i] 做异或运1

算,得到((T[4]^0x0F)<<4)⊕[i];

1 12

最后将T[5..7]、((T[4]^0x0F)<<4)⊕[i]以及[α] 做串联得到字节串Q;

(2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:取调节因子T的第1~3个字节T[1..3];

取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T[4]^

1 1

0x0F;再将T[4]^0x0F与[i]做异或运算,得到(T[4]^0x0F)⊕[i];

1 12

最后将T[1..3]、(T[4]^0x0F)⊕[i]以及[α] 做串联得到字节串Q;

1 12

其中,[i]表示将i转换为长度为1的字节串,[α] 表示将α转换为长度为12的字节串;

S222,将字节串Q利用PRF变换计算消息鉴别码得到字节串E:E←PRFREVB(K)(REVB(Q))S223,将字节串E转为BN型整数γ:γ←NUM(E)

S224,执行模减运算得到BN型整数δ:m

δ←(β‑γ) mod radixm

即将BN型整数β和步骤S223得到的BN型整数γ相减后,将相减的结果再与radix 进行模运算,并将模运算结果赋值给BN型整数δ;

其中,INT型整数m的取值为,如果i mod 2=0,m←u,否则m←v;即当迭代索引号i为偶数时,将u赋值给m;当迭代索引号i为奇数时,将v赋值给m;

S225,左右互换,即β←α,α←δ;即将BN型整数α赋值给BN型整数β,再将步骤S124得到的BN型整数δ赋值给BN型整数α;

S226,按迭代次数重复执行步骤S221~S225,迭代完成后得到BN型整数α和β。

6.根据权利要求5所述的基于消息鉴别码算法的保留格式解密方法,其特征在于,步骤S23包括如下子步骤:

S231,将步骤S226得到的BN型整数α和β分别转为字符串A和B:,

S232,串联字符串A和B,P←A||B,返回明文P。

说明书 :

一种基于消息鉴别码算法的保留格式加密方法及解密方法

技术领域

[0001] 本发明涉及信息安全技术领域,具体而言,涉及一种基于消息鉴别码算法的保留格式加密方法及解密方法。

背景技术

[0002] 如今,计算机技术飞速发展,每天都有各种各样的敏感数据在网络上传播。有大量第三方机构对这些敏感数据进行收集、分析、挖掘,这些数据在使用的过程中也导致了不少
敏感数据泄漏的问题,甚至经常发生严重的隐私泄露事件,这可能造成无法弥补的损失。在
实际应用中,常见的防护手段是对这些敏感数据进行加密。但是对数据库中具有特定格式
的数据,比如银行卡号、身份证号等敏感数据,使用传统的分组密码算法直接进行加密会出
现一系列的问题,比如通常会导致数据长度的扩展,使得数据的类型发生变化等,这就需要
修改数据库结构或应用程序来适应传统加密带来的这些变化,成本非常高。为了解决这类
敏感数据的加密问题,保留格式加密(format‑preserving encryption,简称FPE)被提了出
来。FPE可以用来进行数据遮蔽,即通过对原始数据进行掩码转换,输出一个与原始数据的
格式、关联等均一模一样的数据,从而解决从生产环境的数据向测试环境(或者开发环境)
导入时可能产生的数据内容安全问题。
[0003] 近年来,美国国家标准与技术研究院(National Institute of Standards and Technology,NIST)就此问题进行了研究,并发布了NISTSP 800‑38G文档,提出了FPE算法
FF1、FF3‑1等。FF1和FF3‑1算法都将待加密消息一分为二(分别记为左支数据和右支数据),
以AES系列算法为基础,采用10轮Feistel结构执行迭代,最后再将左右两块数据拼接在一
起。在每一轮迭代中,右支数据进入轮函数进行基于AES的加密后得到轮函数的输出,然后,
左支数据再与此轮函数的输出进行模加后得到更新后的左支数据;最后交换左右两支数据
后进入下一轮。如此反复,直至迭代结束。
[0004] 然而NIST提出的这些FPE算法FF1和FF3‑1在使用中存在诸多问题难以解决,具体如下:
[0005] (1)首先,这些FPE算法的执行效率非常慢,比其普通的加密模块,如ECB、CBC、CTR等,执行效率显著下降;比如目前的PC机执行AES加密16个字节通常不到1个微秒;但FF1和
FF3‑1的加密时间是这些加密时间的几十倍至上百倍。
[0006] (2)其次,《中华人民共和国密码法》的出台并正式实施,各行业大力推进我国商用密码的应用和落地,而NIST提出的这些FPE算法均使用国外的AES系列算法,而非我国商用
密码算法,这使得这些FPE算法难以实施。

发明内容

[0007] 本发明旨在提供一种基于消息鉴别码算法的保留格式加密方法及解密方法,以解决上述NIST提出的FPE算法存在的问题。
[0008] 本发明提供的一种基于消息鉴别码算法的保留格式加密方法,包括如下步骤:
[0009] S11,字符串拆分:将输入的待加密明文P拆分为两个子字符串并分别转化为BN型整数;
[0010] S12,字符串迭代:设置迭代索引号为i=0,1,2,…,7,对步骤S11得到的两个BN型整数进行8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码算法HMAC‑
SM3的伪随机数字节生成函数;
[0011] S13,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到密文C。
[0012] 进一步的,步骤S11包括如下子步骤:
[0013] S111,输入密钥K,长度为7个字节的调节因子T,以及待加密明文P;所述待加密明文P是长度为n的字符串,n满足 ,radix满足2≤radix≤65536;
[0014] S112,分别取INT型整数 ,v←n‑u,符号←代表赋值,即将 赋值给u,n‑u赋值给v;将明文字符串P拆分为两个字符串A和B:
[0015] A←P[1,…,u],B←P[u+1,…,n]
[0016] 其中,P[1,…,u]表示明文字符串P中的第1至u个字符,P[u+1,…,n]表示明文字符串P中的第u至n个字符;即将明文字符串P中的第1至u个字符赋值给字符串A,将明文字符串
P中的第u+1至n个字符赋值给字符串B;
[0017] S113,将这两个字符串A和B分别转为BN型整数α和β:
[0018] α←NUMradix(REV(A)),β←NUMradix(REV(B))。
[0019] 进一步的,步骤S12包括如下子步骤:
[0020] S121,组合16个字节的字节串Q:
[0021]
[0022] 式中,mod表示模运算,即取余数,即:
[0023] (1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:
[0024] 取调节因子T的第5~7个字节T[5..7];
[0025] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1
[4]^0x0F;再将此结果左移4比特得到(T[4]^0x0F)<<4;再将(T[4]^0x0F)<<4与[i]做异或
1
运算,得到((T[4]^0x0F)<<4)⊕[i];
[0026] 最后将T[5..7]、((T[4]^0x0F)<<4)⊕[i]1以及[β]12做串联得到字节串Q;
[0027] (2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:
[0028] 取调节因子T的第1~3个字节T[1..3];
[0029] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1 1
[4]^0x0F;再将T[4]^0x0F与[i]做异或运算,得到(T[4]^0x0F)⊕[i];
[0030] 最后将T[1..3]、(T[4]^0x0F)⊕[i]1以及[β]12做串联得到字节串Q;
[0031] 其中,[i]1表示将i转换为长度为1的字节串,[β]12表示将β转换为长度为12的字节串;
[0032] S122,将字节串Q利用PRF变换计算消息鉴别码得到字节串E:
[0033] E←PRFREVB(K)(REVB(Q))
[0034] S123,将字节串E转为BN型整数γ:
[0035] γ←NUM(E)
[0036] S124,执行模加运算得到BN型整数δ:
[0037] δ←(α+γ) mod radixm
[0038] 即将BN型整数α和步骤S123得到的BN型整数γ相加后,将相加的结果与radixm进行模运算,并将模运算结果赋值给BN型整数δ;
[0039] 其中,INT型整数m的取值为,如果i mod 2=0,m←u,否则m←v;即当迭代索引号i为偶数时,将u赋值给m;当迭代索引号i为奇数时,将v赋值给m;
[0040] S125,左右互换,即α←β,β←δ;即将BN型整数β赋值给BN型整数α,再将步骤S124得到的BN型整数δ赋值给BN型整数β;
[0041] S126,按迭代次数重复执行步骤S121~S125,迭代完成后得到BN型整数α和β。
[0042] 进一步的,步骤S121中的所述字节串Q能够做如下简化:
[0043] S1211,分别计算两个字节BE和Bo:
[0044] BE←(T[4]^0x0F)<<4,Bo←T[4]^0x0F
[0045] 即,将(T[4]^0x0F)<<4赋值给BE,将T[4]^0x0F赋值给Bo;
[0046] S1212,字节串Q简化为:
[0047]
[0048] 即:
[0049] (1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:
[0050] 取调节因子T的第5~7个字节T[5..7];
[0051] 将BE与[i]1做异或运算,得到BE⊕[i]1;
[0052] 最后将T[5..7]、BE⊕[i]1以及[β]12做串联得到字节串Q;
[0053] (2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:
[0054] 取调节因子T的第1~3个字节T[1..3];
[0055] 将Bo与[i]1做异或运算,得到Bo⊕[i]1;
[0056] 最后将T[1..3]、Bo⊕[i]1以及[β]12做串联得到字节串Q。
[0057] 进一步的,步骤S122中所述PRF变换的方法为:对字节串Q执行基于HMAC‑SM3的消息鉴别码,然后对消息鉴别码截断得到m字节的字节串E。
[0058] 进一步的,步骤S13包括如下子步骤:
[0059] S131,将步骤S126得到的BN型整数α和β分别转为字符串A和B:
[0060] , ;
[0061] S132,串联字符串A和B,C←A||B,返回密文C。
[0062] 本发明还提供一种基于消息鉴别码算法的保留格式解密方法,所述解密方法用于对上述的加密方法得到的密文C进行解密;包括如下步骤:
[0063] S21,字符串拆分:将输入的待解密密文P拆分为两个子字符串并分别转化为BN型整数;
[0064] S22,字符串迭代:设置迭代索引号为i=7,6,…,0,对步骤S21得到的两个BN型整数进行8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码算法HMAC‑SM3
的伪随机数字节生成函数;
[0065] S23,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到明文P。
[0066] 进一步的,步骤S21包括如下子步骤:
[0067] S211,输入密钥K,长度为7个字节的调节因子T,以及待解密密文C;所述待加密明文C是长度为n的字符串,n满足 ,radix满足2≤radix≤65536;
[0068] S212,分别取INT型整数 ,v←n‑u,符号←代表赋值,即将 赋值给u,n‑u赋值给v;将待解密密文C拆分为两个字符串A和B:
[0069] A←C[1,…,u],B←C[u+1,…,n]
[0070] 其中,C[1,…,u]表示密文C中的第1至u个字符,C[u+1,…,n]表示密文C中的第u至n个字符;即将密文C中的第1至u个字符赋值给字符串A,将密文C中的第u+1至n个字符赋值
给字符串B;
[0071] S213,将这两个字符串A和B分别转为BN型整数α和β:
[0072] α←NUMradix(REV(A)),β←NUMradix(REV(B))。
[0073] 进一步的,步骤S22包括如下子步骤:
[0074] S221,组合16个字节的字节串Q:
[0075]
[0076] 即:
[0077] 式中,mod表示模运算,即取余数,即:
[0078] (1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:
[0079] 取调节因子T的第5~7个字节T[5..7];
[0080] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1
[4]^0x0F;再将此结果左移4比特得到(T[4]^0x0F)<<4;再将(T[4]^0x0F)<<4与[i]做异或
1
运算,得到((T[4]^0x0F)<<4)⊕[i];
[0081] 最后将T[5..7]、((T[4]^0x0F)<<4)⊕[i]1以及[α]12做串联得到字节串Q;
[0082] (2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:
[0083] 取调节因子T的第1~3个字节T[1..3];
[0084] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1 1
[4]^0x0F;再将T[4]^0x0F与[i]做异或运算,得到(T[4]^0x0F)⊕[i];
[0085] 最后将T[1..3]、(T[4]^0x0F)⊕[i]1以及[α]12做串联得到字节串Q;
[0086] 其中,[i]1表示将i转换为长度为1的字节串,[α]12表示将α转换为长度为12的字节串;
[0087] S222,将字节串Q利用PRF变换计算消息鉴别码得到字节串E:
[0088] E←PRFREVB(K)(REVB(Q))
[0089] S223,将字节串E转为BN型整数γ:
[0090] γ←NUM(E)
[0091] S224,执行模减运算得到BN型整数δ:
[0092] δ←(β‑γ) mod radixm
[0093] 即将BN型整数β和步骤S223得到的BN型整数γ相减后,将相减的结果再与radixm进行模运算,并将模运算结果赋值给BN型整数δ;
[0094] 其中,INT型整数m的取值为,如果i mod 2=0,m←u,否则m←v;即当迭代索引号i为偶数时,将u赋值给m;当迭代索引号i为奇数时,将v赋值给m;
[0095] S225,左右互换,即β←α,α←δ;即将BN型整数α赋值给BN型整数β,再将步骤S124得到的BN型整数δ赋值给BN型整数α;
[0096] S226,按迭代次数重复执行步骤S221~S225,迭代完成后得到BN型整数α和β。
[0097] 进一步的,步骤S23包括如下子步骤:
[0098] S231,将步骤S226得到的BN型整数α和β分别转为字符串A和B:
[0099] ,
[0100] ;
[0101] S232,串联字符串A和B,P←A||B,返回明文P。
[0102] 综上所述,由于采用了上述技术方案,本发明的有益效果是:
[0103] 1、本发明的加密方法的执行效率显著优于NIST的FF1算法
[0104] 2、本发明具有足够的安全性。
[0105] 3、本发明采用国产密码算法SM3作为核心密码算法,因此可以在我国各行业的商用密码应用实施方案中应用。

附图说明

[0106] 为了更清楚地说明本发明实施例的技术方案,下面将对实施例中的附图作简单地介绍,应当理解,以下附图仅示出了本发明的某些实施例,因此不应被看作是对范围的限
定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获
得其他相关的附图。
[0107] 图1为本发明的数据类型转换示意图。
[0108] 图2为本发明实施例1加密方法的流程图。
[0109] 图3为本发明实施例1字符串拆分的流程图。
[0110] 图4为本发明实施例1字符串迭代的流程图。
[0111] 图5为本发明实施例1字符串合并的流程图。
[0112] 图6为本发明实施例2的解密方法的流程图。

具体实施方式

[0113] 为使本发明实施例的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是
本发明一部分实施例,而不是全部的实施例。通常在此处附图中描述和示出的本发明实施
例的组件可以以各种不同的配置来布置和设计。
[0114] 因此,以下对在附图中提供的本发明的实施例的详细描述并非旨在限制要求保护的本发明的范围,而是仅仅表示本发明的选定实施例。基于本发明中的实施例,本领域普通
技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范
围。
[0115] 首先介绍本发明涉及的基本概念:
[0116] 1、数据类型
[0117] (1)字符型和字符串:定义由radix个字符char0,char1,…, charradix‑1,组成的字符表为chars={char0,char1,…, charradix‑1},称字符表中字符个数radix为字符表chars的
n
基数。字符串为字符表中有限个字符组成的字符序列,也称为radix字符串。记chars 为由
字符表chars={char0,char1,…, charradix‑1}中字符组成的长度为n的字符串的集合。明文
和密文是由字符表chars中的多个字符组成的字符串。例如,最常见的数字字符表为chars=
n n
{0,1,…,9},radix=10,明文和密文在集合chars={0,1,…,9}中。常见的基数radix取值除
了之前提到的10之外有2、26、95等,这些分别对应比特、字母(仅大写字母或仅小写字母)、
可打印ASCII字符(空格被视为可打印字符)的字符表。
[0118] (2)字节和字节串:本发明提及的字节为通常意义上的字节,即为8个0、1比特组成的字节。字节串为有限个字节组成的字节序列。
[0119] (3)整数:即普通的整数。本发明中将值较小的整数(比如不大于232)记为INT型整96
数,将数值可能较大的整数记为BN型整数,比如值为2 的整数只能表示为BN型整数。
[0120] 2、数据类型转换
[0121] 本发明的数据类型转换如图1所示。具体如下:
[0122] (1)整数转为字符串 :任意给定一个非负整数x满足0≤x≤radixm,m
radix 表示radix的m次方,记将整数转为字符串的函数为 ,其具体含义是
将x按大端表示法表示为radix字符的字符串X且字符串长度不大于m,即
,i=1,2,…,m。即将非负整数x除以radix的i‑1次
方后,将得到的值再与radix做模运算,将模运算结果作为字符串X的m+1‑i个字符。
[0123] (2)整数转字节串[x]s:任意给定一个非负整数x满足0≤x≤256s,记将整数转为字s
节串的函数为[x] ,其具体含义是将x按大端表示法表示为字节长度为s的字节串,即
,i=1,2,…,m。即将整数x除以256的i‑1次方后,将
得到的值再与256做模运算,将模运算结果作为字节串X的m+1‑i个字符,这里的256为1个字
节的大小。
[0124] (3)字符串转整数NUMradix(X):任意给定一个定义在基数为radix的字符集上的字符串X,记将字符串转为整数的函数为NUMradix(X),其具体含义是将按大端表示法表示的
radix字符串X,转化为一个普通的非负整数x,即 ,即
将字符串X的m+1‑i个字符与radix的i‑1次方相乘,将i=1,2,…,m时的相乘结果累加后得到
非负整数x。
[0125] (4)字节串转整数NUM(X):任意给定一个字符串X,记将字节串转为整数的函数为NUM(X),其具体含义是将按大端表示法表示的字节串X,转化为一个普通的非负整数x,即
,即将字节串X的m+1‑i个字节与256的i‑1次方相乘,将i=
1,2,…,m时的相乘结果累加后得到非负整数x。
[0126] 3、主要数据
[0127] (1)明文:明文是由字符表chars={char0,char1,…,charradix‑1}中的多个字母组成的字符串。比如由11个数字构成的电话号码。
[0128] (2)密文:明文是由字符表chars={char0,char1,…,charradix‑1}中的多个字母组成的字符串。比如由18个数字构成的字符串。
[0129] (3)调节因子:调节因子是多个字节构成的字节串,类似于CBC模式中的初始向量IV和OCB模式中的NONCE值。调节因子的作用有:改变调节因子比改变密钥代的价小,因为改
变密钥必然需要重新进行子密钥扩展,而子密钥扩展算法通常都较复杂;调节值可以公开,
无需像密钥一样保密;FPE方案中的密文空间比较小,使用不同的调节因子可使得同一密钥
对同一明文加密得到不同的密文值,从而增加密文的多变性。
[0130] (4)密钥:秘密信息,字节串。
[0131] 4、记号、缩写与符号
[0132] 本发明主要涉及的记号、缩写与符号如下:
[0133] (1)chars={char0,char1,…,charradix‑1}:由radix个字符char0,char1,…,charradix‑1组成的字符表。
[0134] (2)radix:字符表chars={char0,char1,…,charradix‑1}的基数。
[0135] (3)charsn:由字符表chars={char0,char1,…,charradix‑1}中字符组成的长度为n的字符串的集合。
[0136] (4) :将整数x转为radix字符串的函数。
[0137] (5)[x]s:整数x转字节串的函数。
[0138] (6)NUMradix(X):radix字符串转整数的函数。
[0139] (7)NUM(X):字节串转整数的函数。
[0140] (8)A←B:赋值,将B的值给A。
[0141] (9)A||B:串联,将A和B按A在左端、B在右端的顺序串联在一起。
[0142] (10)^:与运算。
[0143] (11)<<:左移位运算。
[0144] (12)X[i]:对字符串/字节串X,取其第i个字符/字节。
[0145] (13)X[i,…,j]:对字符串/字节串X,取其第i至j个字符/字节,形成新的子串。
[0146] (14) :向上取整,取大于等于x的最小整数。
[0147] (15) :向下取整,取小于等于x的最大整数。
[0148] (16)REV(X):对字符串X做字符级的逆向输出为Y,即Y[m+1‑i]=X[i],;即将字符串X中的第i个字符作为字符串Y的m+1‑i个字符。例如大写字
母串X为“ABCDEFG”,REV(X)则为“GFEDCBA”。
[0149] (17)REVB(X):对字节串X做字节级的逆向输出为Y,即Y[m+1‑i]=X[i],;即将字节串X中的第i个字节作为字节串Y的m+1‑i个字节。例如字节串X十
六进制表示为“0123456789ABCDEF”,REVB(X)十六进制表示为“EFCDAB8967452301”。
[0150] (18)HMAC‑SM3K(M):使用密钥K对数据M计算消息鉴别码HMAC(HMAC按HMAC的标准执行),其中使用SM3作为底层杂凑函数。
[0151] 实施例1
[0152] 如图2所示,本实施例提出一种基于消息鉴别码算法的保留格式加密方法,记所述加密方法表示为GMFPE‑Enc(K,T,P),包括如下步骤:
[0153] S11,如图3所示,字符串拆分:将输入的待加密明文P拆分为两个子字符串并分别转化为BN型整数:
[0154] 具体地:
[0155] S111,输入:
[0156] 密钥K,本实施例中密钥K为不少于16字节的字节串;
[0157] 长度为7个字节的调节因子T;
[0158] 以及待加密明文P;所述待加密明文P是长度为n的字符串;本实施例中,n满足,radix满足2≤radix≤65536;
[0159] S112,分别取INT型整数 ,v←n‑u,符号←代表赋值,即将 赋值给u,n‑u赋值给v;将明文字符串P拆分为两个字符串A和B:
[0160] A←P[1,…,u],B←P[u+1,…,n]
[0161] 其中,P[1,…,u]表示明文字符串P中的第1至u个字符,P[u+1,…,n]表示明文字符串P中的第u至n个字符;即将明文字符串P中的第1至u个字符赋值给字符串A,将明文字符串
P中的第u+1至n个字符赋值给字符串B;
[0162] S113,将这两个字符串A和B分别转为BN型整数α和β:
[0163] α←NUMradix(REV(A)),β←NUMradix(REV(B))。
[0164] S12,如图4所示,字符串迭代:设置迭代索引号为i=0,1,2,…,7,对步骤S11得到的两个BN型整数进行8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码
算法HMAC‑SM3的伪随机数字节生成函数;
[0165] 具体地:
[0166] S121,组合16个字节的字节串Q:
[0167]
[0168] 式中,mod表示模运算,即取余数,即:
[0169] (1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:
[0170] 取调节因子T的第5~7个字节T[5..7];
[0171] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1
[4]^0x0F;再将此结果左移4比特得到(T[4]^0x0F)<<4;再将(T[4]^0x0F)<<4与[i]做异或
1
运算,得到((T[4]^0x0F)<<4)⊕[i];
[0172] 最后将T[5..7]、((T[4]^0x0F)<<4)⊕[i]1以及[β]12做串联得到字节串Q;
[0173] (2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:
[0174] 取调节因子T的第1~3个字节T[1..3];
[0175] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1 1
[4]^0x0F;再将T[4]^0x0F与[i]做异或运算,得到(T[4]^0x0F)⊕[i];
[0176] 最后将T[1..3]、(T[4]^0x0F)⊕[i]1以及[β]12做串联得到字节串Q;
[0177] 其中,[i]1表示将i转换为长度为1的字节串,[β]12表示将β转换为长度为12的字节串;
[0178] 优选地,所述字节串Q能够做如下简化:
[0179] S1211,分别计算两个字节BE和Bo,
[0180] BE←(T[4]^0x0F)<<4,Bo←T[4]^0x0F
[0181] 即,将(T[4]^0x0F)<<4赋值给BE,将T[4]^0x0F赋值给Bo;
[0182] S1212,字节串Q简化为:
[0183]
[0184] 即:
[0185] (1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:
[0186] 取调节因子T的第5~7个字节T[5..7];
[0187] 将BE与[i]1做异或运算,得到BE⊕[i]1;
[0188] 最后将T[5..7]、BE⊕[i]1以及[β]12做串联得到字节串Q;
[0189] (2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:
[0190] 取调节因子T的第1~3个字节T[1..3];
[0191] 将Bo与[i]1做异或运算,得到Bo⊕[i]1;
[0192] 最后将T[1..3]、Bo⊕[i]1以及[β]12做串联得到字节串Q。
[0193] S122,将字节串Q利用PRF变换计算消息鉴别码得到字节串E:
[0194] E←PRFREVB(K)(REVB(Q))
[0195] 所述PRF变换的方法为:对字节串Q简执行基于HMAC‑SM3的消息鉴别码,然后对消息鉴别码截断得到m字节的字节串E。本实施例提供以下三种PRF变换方案:
[0196] 方案一:设定m为16,先执行W←HMAC‑SM3K(X),然后取W的高16字节W[1..16]作为输出的m字节的字节串E。
[0197] 方案二:设定m为16,先执行W←HMAC‑SM3K(X),然后取W的低16字节W[17..32]作为输出的m字节的字节串E。
[0198] 方案三:设定m为32,先执行W←HMAC‑SM3K(X),然后取W的全部32字节W[1..32]作为输出的m字节的字节串E。
[0199] S123,将字节串E转为BN型整数γ:
[0200] γ←NUM(E)
[0201] S124,执行模加运算得到BN型整数δ:
[0202] δ←(α+γ) mod radixm
[0203] 即将BN型整数α和步骤S123得到的BN型整数γ相加后,将相加的结果与radixm进行模运算,并将模运算结果赋值给BN型整数δ;
[0204] 其中,INT型整数m的取值为,如果i mod 2=0,m←u,否则m←v;即当迭代索引号i为偶数时,将u赋值给m;当迭代索引号i为奇数时,将v赋值给m;
[0205] S125,左右互换,即α←β,β←δ;即将BN型整数β赋值给BN型整数α,再将步骤S124得到的BN型整数δ赋值给BN型整数β;
[0206] S126,按迭代次数重复执行步骤S121~S125,迭代完成后得到BN型整数α和β;
[0207] S13,如图5所示,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到密文C;
[0208] 具体地:
[0209] S131,将步骤S126得到的BN型整数α和β分别转为字符串A和B:
[0210] , ;
[0211] S132,串联字符串A和B,C←A||B,返回密文C。
[0212] 本发明实施例的加密方法具有如下有益效果:
[0213] 1、效率方面:
[0214] (1)本发明的加密方法与NIST的FF1算法的关键部件执行次数对比如表1所示。
[0215]
[0216] 从表1可知,在保留格式加密算法中,类型转换的耗时比调用密码函数的耗时高的多,特别是整数转字符串和字符串转整数。在本发明中只需进行2次整数转字符串和字符串
转整数,比起FF3‑1的8次和16次,其执行次数均少得多。整数与字节串的互转次数与FF3‑1
相当。此外,加密函数调用方面,FF3‑1算法需执行8次AES加密,本发明执行8次HMAC‑SM3,与
FF3‑1相当。
[0217] (2)本发明的加密方法与NIST的FF1算法的加密时间对比如表2所示。测试环境为Win10操作系统,Intel Corei5‑10210U CPU @ 1.60GHz处理器,16.0 GB RAM。测试方式为
6
各算法分别对模拟生成的10个样本,进行加密,每个样本是18位数字。
[0218] 表2:
[0219]传统做法NIST的FF3‑1  本发明 
加密时间  13.972秒  7.791秒 
[0220] 从表2可知,本发明的加密方法的执行效率显著优于NIST的FF1算法。
[0221] 2、安全性方面,本发明采用通用的经过论证的Feistel架构,执行轮数与FF3‑1一样为8轮,这些都确保本发明具有足够的安全性。
[0222] 3、本发明采用国产密码算法SM3作为核心密码算法,因此可以在我国各行业的商用密码应用实施方案中应用。
[0223] 实施例2
[0224] 本实施例提供一种基于消息鉴别码算法的保留格式解密方法,所述解密方法用于对实施例1所述的加密方法得到的密文C进行解密,也即实施例1的加密方法的逆运算;如图
6所示,记所述加密方法表示为GMFPE‑Dec(K,T,P),包括如下步骤:
[0225] S21,字符串拆分:将输入的待解密密文P拆分为两个子字符串并分别转化为BN型整数;
[0226] 具体地:
[0227] S211,输入密钥K,长度为7个字节的调节因子T,以及待解密密文C;所述待加密明文C是长度为n的字符串,n满足 ,radix满足2≤radix≤65536;
K、T与实施例1一致;
[0228] S212,分别取INT型整数 ,v←n‑u,符号←代表赋值,即将 赋值给u,n‑u赋值给v;将待解密密文C拆分为两个字符串A和B:
[0229] A←C[1,…,u],B←C[u+1,…,n]
[0230] 其中,C[1,…,u]表示密文C中的第1至u个字符,C[u+1,…,n]表示密文C中的第u至n个字符;即将密文C中的第1至u个字符赋值给字符串A,将密文C中的第u+1至n个字符赋值
给字符串B;
[0231] S213,将这两个字符串A和B分别转为BN型整数α和β:
[0232] α←NUMradix(REV(A)),β←NUMradix(REV(B))。
[0233] S22,符串迭代:设置迭代索引号为i=7,6,…,0,对步骤S21得到的两个BN型整数进行8轮基于Feistel结构和PRF变换的迭代;所述PRF变换是基于消息鉴别码算法HMAC‑SM3的
伪随机数字节生成函数;
[0234] 具体地:
[0235] S221,组合16个字节的字节串Q:
[0236]
[0237] 即:
[0238] 式中,mod表示模运算,即取余数,即:
[0239] (1)当imod 2=0,即当迭代索引号i为偶数时,字节串Q为:
[0240] 取调节因子T的第5~7个字节T[5..7];
[0241] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1
[4]^0x0F;再将此结果左移4比特得到(T[4]^0x0F)<<4;再将(T[4]^0x0F)<<4与[i]做异或
1
运算,得到((T[4]^0x0F)<<4)⊕[i];
[0242] 最后将T[5..7]、((T[4]^0x0F)<<4)⊕[i]1以及[α]12做串联得到字节串Q;
[0243] (2)当imod 2≠0,即当迭代索引号i为奇数时,字节串Q为:
[0244] 取调节因子T的第1~3个字节T[1..3];
[0245] 取调节因子T的第4个字节T[4],将T[4]与一个十六进制数0x0F做与运算,得到T1 1
[4]^0x0F;再将T[4]^0x0F与[i]做异或运算,得到(T[4]^0x0F)⊕[i];
[0246] 最后将T[1..3]、(T[4]^0x0F)⊕[i]1以及[α]12做串联得到字节串Q;
[0247] 其中,[i]1表示将i转换为长度为1的字节串,[α]12表示将α转换为长度为12的字节串;
[0248] S222,将字节串Q利用PRF变换计算消息鉴别码得到字节串E:
[0249] E←PRFREVB(K)(REVB(Q))
[0250] S223,将字节串E转为BN型整数γ:
[0251] γ←NUM(E)
[0252] S224,执行模减运算得到BN型整数δ:
[0253] δ←(β‑γ) mod radixm
[0254] 即将BN型整数β和步骤S223得到的BN型整数γ相减后,将相减的结果再与radixm进行模运算,并将模运算结果赋值给BN型整数δ;
[0255] 其中,INT型整数m的取值为,如果i mod 2=0,m←u,否则m←v;即当迭代索引号i为偶数时,将u赋值给m;当迭代索引号i为奇数时,将v赋值给m;
[0256] S225,左右互换,即β←α,α←δ;即将BN型整数α赋值给BN型整数β,再将步骤S124得到的BN型整数δ赋值给BN型整数α;
[0257] S226,按迭代次数重复执行步骤S221~S225,迭代完成后得到BN型整数α和β;
[0258] S23,字符串合并:将迭代得到的两个BN型整数分别转为字符串后串联合并为一个字符串,得到明文P;
[0259] 具体地:
[0260] ,
[0261] ;
[0262] S232,串联字符串A和B,P←A||B,返回明文P。
[0263] 其中,字节串Q的简化方式以及PRF变换的方法均与实施例1一致,在此不再赘述。
[0264] 以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修
改、等同替换、改进等,均应包含在本发明的保护范围之内。