会员体验
专利管家(专利管理)
工作空间(专利管理)
风险监控(情报监控)
数据分析(专利分析)
侵权分析(诉讼无效)
联系我们
交流群
官方交流:
QQ群: 891211   
微信请扫码    >>>
现在联系顾问~
首页 / 专利库 / 电脑安全 / 密码学 / 一种密码学置换的枚举方法及系统

一种密码学置换的枚举方法及系统

阅读:731发布:2020-05-12

IPRDB可以提供一种密码学置换的枚举方法及系统专利检索,专利查询,专利分析的服务。并且本发明属于密码学技术领域,公开了一种密码学置换的枚举方法及系统,获取n的值;选取一个次数为n的不可约多项式,构造GF(2n)上的乘法表;基于乘法表构造方阵;同时对符号进行相关定义;判断k是否大于0;判断当前k行所有的列号是否均已试过;判断k是否等于最大行号;若有则表示该置换是乘法正形置换。本发明能够快速的枚举GF(2n)上所有的双正形置换,这样一方面提高了构造双正形置换的速度,另一方面由于枚举所有的双正形置换速度很快,所以只需在需要双正形置换的时候去通过快速枚举构造,而不需先花费时间资源和空间资源去构造和存储双正形置换,降低了成本。,下面是一种密码学置换的枚举方法及系统专利的具体信息内容。

1.一种密码学置换的枚举方法,其特征在于,所述密码学置换的枚举方法包括以下步骤:步骤一,获取n的值,n的取值范围为2≤n≤4;

步骤二,选取一个次数为n的不可约多项式,并基于这个不可约多项式,构造GF(2n)上的乘法表;

步骤三,基于乘法表构造一个2n-1行2n-1列的方阵,行号表示置换的输入,列号表示置换的输入,该方阵用于数组存储与访问;同时对符号进行相关定义;

步骤四,判断k是否大于0;若大于0,则执行步骤五;否则表示枚举完毕,程序终止;

步骤五,基于判断行标志位变量flagrow[k]是否被置位从而判断第k行的所有列号是否均已试过;若没有则执行步骤六,否则执行步骤七;

步骤六,如果当前P[k]同时满足两个要求,则对各标志位数组以及链表做相应的处理,同时停止执行步骤六,并开始执行步骤七;如果不满足,则取链表中的下一个节点为P[k],并返回执行步骤五;

步骤七,判断当前k行所有的列号是否均已试过;若没有则进一步判断k是否等于最大行号;若有则表示该置换是乘法正形置换,则同时判断该置换是否是加法正形置换;若是则记录下结果,并通过对调行号和列号得到逆置换,并记录下结果;若不是则不记录也不对调;随后回退两行,将对应的两个列号重新加入链表,并将k减1,取下一个节点为P[k],然后返回执行步骤四;如果k不等于最大行号,则将k加1,进入下一行,并完成各标志位以及链表的处理,返回执行步骤四;如果当前k行所有的列号均已试过,执行步骤八;

步骤八,k减1,并将当前的P[k]添加到链表中,并取下一个结点为P[k],返回执行步骤四。

2.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤三中,所述定义相关符号变量具体包括:(1)k表示行号,初值位为1,所述行号取值范围为大于等于0,小于等于2n-1;

(2)P[k]表示列号,方阵中第k行第P[k]列的元素为k*P[k],其中*为GF(2n)上的乘法;所述列号取值范围为大于等于0,小于等于2n-1;

(3)数组flagmulti[2n]、flagfirst[2n]、flagrow[2n]表示标志位,数组pre[2n]、next[2n]、link[2n]表示一个单向静态链表,数组beginning[2n]存储初始列号初始记录位置,beginning[k]记录第k行的初始位置;

1)其中标志位flagmulti[i]=1表示i等于之前某一行号与列号的乘积,flagmulti[i]=0则表示相反的情况;

2)link为一个包含n个元素的单向静态链表,并且初始化为link[0]=0,link[2n-1]=n n n

1,link[i]=i+1(1≤i≤2-1);所述link链表表示从1到2-1这2-1个列号中所有的可用资源,当一个列号被使用了,则从链表中删除,并重构链表;

3)对于每一个节点,i表示节点的行号,P[i]表示节点的列号,pre[i]表示第i行列号P[i]的前一个节点,next[i]表示第i行列号P[i]的下一个节点;

n

4)标志位数组flagfirst[2],当发现一个P[i]被选中时,如果i是1,也就是在第1行选中了列号P[1],就将flagfirst[P[1]]置位为1,初始值是0;

5)标志位数组flagrow[2n]用于标记beginning[i]记录的每一行的初始位置,当一行遍历完,将flagrow[i]置为1;同时进行初始化。

3.如权利要求2所述密码学置换的枚举方法,其特征在于,所述初始化时各符号值为:k=1,P[0]=0,P[1]=2,flagmulti[0]=1,flagmulti[i]=1(1≤i≤2n-1),flagfirst[i]=0(0≤i≤2n-1),flagrow[0]=1,flagrow[1]=0,beginning[0]=0,beginning[1]=

2,pre[0]=0,pre[1]=1,next[0]=0,next[1]=3,link[0]=0,link[2n-1]=1,link[i]=i+1(1≤i≤2n-2)。

4.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤六中,所述P[k]同时满足的两个要求条件具体包括:第一:flagfirst[k]没有被置位,或者P[k]不等于1;

第二:flagmulti[k*P[k]]没有被置位。

5.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤六中,所述对各标志位数组以及链表做相应的处理方法具体包括:flagmulti[k*P[k]]=1,也就是被置位;Link[pre[k]]=next[k];

link[P[k]]=0,即将P[k]从链表中删除。判断行号k是否等于1,如果等于1,则将flagfirst[P[k]]置位为1。

6.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤六中,所述取链表中的下一个节点为P[k]的方法具体包括:pre[k]=P[k],P[k]=next[k],next[k]=link[P[k]]。

判断此时P[k]是否等于beginning[k],如果等于,表示第k行的所有列号已尝试完毕,将标志位flagrow[k]置为1。

7.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤七中,所述判断当前第k行所有的列号是否均已试过具体包括:判断当前k行所有的列号是否均已试过,判断flagrow[k]是否被置为1,没有被置位即表示还有列号未被尝试。

8.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤七中,所述判断置换是否是加法正形置换的方法具体包括:计算{i⊕P[i]|i∈GF(2n)}=GF(2n)是否成立,成立则是加法正形置换,其中⊕位按二进制位的异或操作。

9.如权利要求1所述密码学置换的枚举方法,其特征在于,步骤七中,所述回退两行,将对应的两个列号重新加入链表的方法具体包括:flagmulti[(2n-2)*P[2n-2]]=flagmulti[(2n-2)*P[2n-2]]=0;

Link[P[2n-1]]=next[2n-1];

n n

Link[pre[2-1]]=P[2-1];

Link[P[2n-2]]=next[2n-2];

Link[pre[2n-2]]=P[2n-2];

步骤七中,所述完成各标志位以及链表的处理方法具体包括:pre[k]=pre[k-1];

P[k]=next[k-1];

beginning[k]=P[k];

flagrow[k]=0;

next[k]=link[P[k]]。

步骤八中,所述将当前的P[k]添加到链表的方法具体包括:flagmulti[k*P[k]]=0;

link[P[k]]=next[P[k]];

link[pre[k]]=P[k]。

10.一种如权利要求1所述密码学置换的枚举方法的密码学置换的枚举控制系统。

说明书全文

一种密码学置换的枚举方法及系统

技术领域

[0001] 本发明属于密码学技术领域,尤其涉及一种密码学置换的枚举方法及系统。

背景技术

[0002] 目前,业内常用的现有技术是这样的:
[0003] 作为一类特殊的布尔置换,正形置换在密码学中有着重要的应用。现有技术中,证明了GF(2)n上的正形置换具有一种很优良的密码学性质-完全平衡性,并且成功的将正形置换用到了基于所谓“动态代换设备”DSD(Dynamic Substitution Devices)的分组密码算法设计中,另外正形置换还被证明具有输入差分不为零时,输出差分不等于输入差分的优良性质,非线性正形置换具有良好的比特独立性和雪崩特性等。
[0004] 随后,正形置换被应用于分组密码的Lai-Massey结构中。另外无线局域网商用密码算法SMS4的轮函数,也是基于BDLL正形置换发生器设计的。而且正形置换还被用来设计对称密码体制中重要的混淆部件-S盒。正形置换同样也可以用来设计多输出Bent函数和密码学性能良好的布尔函数,Hash函数的设计与分析中正形置换也扮有重要的角色,线性正形置换还可以用于经典密码结构Even-Mansour的轮密钥构造。因此,正形置换具有重要的密码学应用价值。
[0005] 众所周知,有限域GF(2n)上存在着加法和乘法两种运算,GF(2n)中的所有元素关于加法构成加法群,GF(2n)中的所有非0元素关于乘法构成乘法群。然而,当前正形置换的定义中仅考虑了有限域GF(2n)上存在的加法运算,并没有考虑乘法运算。但是,将置换的输入与输出之间作乘法运算,结果分布的非平衡性也是可以被攻击者利用的。例如著名的分组密码AES中S盒的逆元运算,其置换的输入与输出之积表现位单一的值,因此就诞生了针对AES的XSL攻击。密码学的本质是混淆和扩散,因此从这个角度来说,越平衡的置换越安全。
[0006] 现有技术中藉此提出了双正形置换的概念,即有限域GF(2n)上的某个置换P,如果满足{x+P(x)|x∈GF(2n)}=GF(2n),并且{x*P(x)|x∈GF(2n)}=GF(2n),则称置换P为双正形置换。双正形置换相比传统的加法正形置换,还拥有对于乘法运算的扩散性,因此其具有更优良的密码学应用价值。
[0007] 但现有技术方法存在如下不足之处:没有探讨双正形置换的构造方法,这样就只能根据定义来构造。但通过定义来构造双正形置换的话效率太低,例如GF(24)上所有的置换有(24)!=20922789888000个,如果简单的用穷尽的方法来判断每一个置换是否是双正形置换,则会面临数据处理速度慢,运行时间长,成本增加等问题。
[0008] 综上所述,现有技术存在的问题是:
[0009] 现有公开技术中没有关于双正形置换的直接构造方法。因此就只能根据定义来构造。但通过定义来构造双正形置换的话效率太低,因为如果简单的用穷尽的方法来判断每一个置换是否是双正形置换,则会面临数据处理速度慢,运行时间长,成本增加等问题。
[0010] 解决上述技术问题的难度:
[0011] 如果简单的利用穷尽的方法来通过枚举判断如GF(24)上所有的置换是否是双正形置换的话,因为运算一次花费的时间较长,因此可以将枚举出的所有双正形置换存储下来,以备后续使用。但这样做的话又需要长期存储所有的双正形置换,会占用存储空间,而且一旦数据损坏又需要重新构造,成本依然较高。
[0012] 解决上述技术问题的意义:
[0013] 如果能够提供一种GF(2n)上双正形置换的快速枚举方法(n在一定范围内),则一方面可以提高构造双正形置换的速度,另一方面由于枚举所有的双正形置换速度很快,所以只需在需要双正形置换的时候去通过快速枚举构造,而不需先花费时间资源和空间资源去构造和存储双正形置换,降低了成本。

发明内容

[0014] 针对现有技术存在的问题,本发明提供了一种密码学置换的枚举方法及系统。
[0015] 本发明是这样实现的,一种密码学置换的枚举方法,所述密码学置换的枚举方法具体为GF(2n)上的双正形置换的枚举方法,其中2≤n≤4。
[0016] 所述双正形置换的枚举方法具体包括以下步骤:
[0017] 步骤一,获取n的值,所述n的值可由用户根据自己的需要设定,n的取值范围为2≤n≤4。
[0018] 步骤二,选取一个次数为n的不可约多项式,并基于这个不可约多项式,构造GF(2n)上的乘法表。
[0019] 步骤三,基于乘法表构造一个2n-1行2n-1列的方阵,行号表示置换的输入,列号表示置换的输入,该方阵可用数组存储与访问。同时对符号进行相关定义。
[0020] 步骤四,判断k是否大于0。若大于0,则执行步骤五。否则表示枚举完毕,程序终止。
[0021] 步骤五,基于判断行标志位flagrow[k]是否被置位从而判断第k行的所有列号是否均已试过。若没有则执行步骤六,否则执行步骤七。
[0022] 步骤六,如果当前P[k]同时满足两个要求,则对各标志位以及链表做相应的处理,同时停止执行步骤六,并开始执行步骤七。如果不满足,则取链表中的下一个节点为P[k],并返回执行步骤五。
[0023] 步骤七,判断当前k行所有的列号是否均已试过。若没有则进一步判断k是否等于最大行号。若有则表示该置换是乘法正形置换,则同时判断该置换是否是加法正形置换。若是则记录下结果,并通过对调行号和列号得到逆置换,并记录下结果。若不是则不记录也不对调。随后回退两行,将对应的两个列号重新加入链表,并将k减1,取下一个节点为P[k],然后返回执行步骤四。如果k不等于最大行号,则将k加1,进入下一行,并完成各标志位以及链表的处理,返回执行步骤四。如果当前k行所有的列号均已试过,执行步骤八。
[0024] 步骤八,k减1,并将当前的P[k]添加到链表中,并取下一个结点为P[k],返回执行步骤四。
[0025] 进一步,步骤三中,所述定义相关符号变量具体包括:
[0026] 定义:
[0027] (1)k表示行号,初值位为1,所述行号取值范围为大于等于0,小于等于2n-1。
[0028] (2)用数组P[2n]存储列号,其中P[k]表示第k行的列号,方阵中第k行第P[k]列的元素为k*P[k],其中*为GF(2n)上的乘法。所述列号取值范围为大于等于0,小于等于2n-1。
[0029] (3)用数组flagmulti[2n]、flagfirst[2n]、flagrow[2n]存储标志位,数组pre[2n]、next[2n]、link[2n]表示一个单向静态链表,数组beginning[2n]存储初始列号初始记录位置,beginning[k]记录第k行的初始位置。
[0030] 1)其中标志位flagmulti[i]=1表示i等于之前某一行号与列号的乘积,flagmulti[i]=0则表示相反的情况。
[0031] 2)link为一个包含n个元素的单向静态链表,并且初始化为link[0]=0,link[2n-n n n1]=1,link[i]=i+1(1≤i≤2-1)。所述link链表表示从1到2-1这2-1个列号中所有的可用资源,当一个列号被使用了,则将其从链表中删除,并重构链表。
[0032] 3)对于每一个节点,i表示节点的行号,P[i]表示节点的列号,pre[i]表示第i行列号P[i]的前一个节点,next[i]表示第i行列号P[i]的下一个节点。
[0033] 4)标志位数组flagfirst[2n],当发现一个P[i]被选中时,如果i是1,也就是在第1行选中了列号P[1],就将flagfirst[P[1]]置位为1,初始值是0。
[0034] 5)标志位数组flagrow[2n]用于标记beginning[i]记录的每一行的初始位置,当一行遍历完,将flagrow[i]置为1。同时进行初始化。
[0035] 进一步,所述初始化时各变量值为:
[0036] k=1,P[0]=0,P[1]=2,flagmulti[0]=1,flagmulti[i]=1(1≤i≤2n-1),flagfirst[i]=0(0≤i≤2n-1),flagrow[0]=1,flagrow[1]=0,beginning[0]=0,beginning[1]=2,pre[0]=0,pre[1]=1,next[0]=0,next[1]=3,link[0]=0,link[2n-1]=1,link[i]=i+1(1≤i≤2n-2)。
[0037] 进一步,步骤六中,所述P[k]需同时满足的两个要求具体包括:
[0038] 第一:flagfirst[k]没有被置位,或者P[k]不等于1。
[0039] 第二:flagmulti[k*P[k]]没有被置位。
[0040] 进一步,步骤六中,所述对各标志位数组以及链表做相应的处理具体包括:
[0041] flagmulti[k*P[k]]=1,也就是被置位。Link[pre[k]]=next[k],link[P[k]]=0,即将P[k]从链表中删除。判断行号k是否等于1,如果等于1,则将flagfirst[P[k]]置位为
1。
[0042] 进一步,步骤六中,所述取链表中的下一个节点为P[k]具体包括:
[0043] pre[k]=P[k],P[k]=next[k],next[k]=link[P[k]]。
[0044] 判断此时P[k]是否等于beginning[k],如果等于,表示第k行的所有列号已尝试完毕,将标志位flagrow[k]置为1。
[0045] 进一步,步骤七中,所述判断当前第k行所有的列号是否均已试过具体包括:
[0046] 判断当前k行所有的列号是否均已试过,即判断flagrow[k]是否被置为1,没有被置位即表示还有列号未被尝试。
[0047] 进一步,步骤七中,所述判断置换是否是加法正形置换具体包括:
[0048] 计算{i⊕P[i]|i∈GF(2n)}=GF(2n)是否成立,成立则是加法正形置换,其中⊕位按二进制位的异或操作。
[0049] 进一步,步骤七中,所述回退两行,将对应的两个列号重新加入链表具体包括:
[0050] flagmulti[(2n-2)*P[2n-2]]=flagmulti[(2n-2)*P[2n-2]]=0。
[0051] Link[P[2n-1]]=next[2n-1]。
[0052] Link[pre[2n-1]]=P[2n-1]。
[0053] Link[P[2n-2]]=next[2n-2]。
[0054] Link[pre[2n-2]]=P[2n-2]。
[0055] 进一步,步骤七中,所述完成各标志位数组以及链表的处理具体包括:
[0056] pre[k]=pre[k-1]。
[0057] P[k]=next[k-1]。
[0058] beginning[k]=P[k]。
[0059] flagrow[k]=0。
[0060] next[k]=link[P[k]]。
[0061] 进一步,步骤八中,所述将当前的P[k]添加到链表中具体包括:
[0062] flagmulti[k*P[k]]=0。
[0063] link[P[k]]=next[P[k]]。
[0064] link[pre[k]]=P[k]。
[0065] 本发明的另一目的在于提供一种所述密码学置换的枚举方法的密码学置换的枚举控制系统。
[0066] 综上所述,本发明的优点及积极效果为:
[0067] 本发明提供一种GF(2n)上双正形置换的枚举方法,其中2≤n≤4。该方法能够快速的枚举GF(2n)上(2≤n≤4)所有的双正形置换,这样一方面提高了构造双正形置换的速度,另一方面由于枚举所有的双正形置换速度很快,所以只需在需要双正形置换的时候去通过快速枚举构造,而不需先花费时间资源和空间资源去构造和存储双正形置换,降低了成本。

附图说明

[0068] 图1是本发明实施例提供的密码学置换的枚举方法流程图。
[0069] 图2是本发明实施例提供的密码学置换的枚举方法原理图。
[0070] 图3是本发明实施例提供的密码学置换的枚举方法框架图。

具体实施方式

[0071] 为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
[0072] 现有公开技术中没有关于双正形置换的直接构造方法。因此就只能根据定义来构造。但通过定义来构造双正形置换的话效率太低,因为如果简单的用穷尽的方法来判断每一个置换是否是双正形置换,则会面临数据处理速度慢,运行时间长,成本增加等问题。
[0073] 针对现有技术存在的问题,本发明提供了一种密码学置换的枚举方法及系统,下面结合附图对本发明作详细的描述。
[0074] 如图1所示,本发明实施例提供的密码学置换的枚举方法具体为GF(2n)上的双正形置换的枚举方法,其中2≤n≤4。
[0075] 本发明实施例提供的双正形置换的枚举方法具体包括以下步骤:
[0076] S101,获取n的值,所述n的值可由用户根据自己的需要设定,n的取值范围为2≤n≤4。
[0077] S102,选取一个次数为n的不可约多项式,并基于这个不可约多项式,构造GF(2n)上的乘法表。
[0078] S103,基于乘法表构造一个2n-1行2n-1列的方阵,行号表示置换的输入,列号表示置换的输入,该方阵可用数组存储与访问。同时对符号进行相关定义。
[0079] S104,判断k是否大于0。若大于0,则执行步骤五。否则表示枚举完毕,程序终止。
[0080] S105,基于判断行标志位flagrow[k]是否被置位从而判断第k行的所有列号是否均已试过。若没有则执行步骤六,否则执行步骤七。
[0081] S106,如果当前P[k]同时满足两个要求,则对各标志位数组以及链表做相应的处理,同时停止执行步骤六,并开始执行步骤七。如果不满足,则取链表中的下一个节点为P[k],并返回执行步骤五。
[0082] S107,判断当前第k行所有的列号是否均已试过。若没有则进一步判断k是否等于最大行号。若有则表示该置换是乘法正形置换,则同时判断该置换是否是加法正形置换。若是则记录下结果,并通过对调行号和列号得到逆置换,并记录下结果。若不是则不记录也不对调。随后回退两行,将对应的两个列号重新加入链表,并将k减1,取下一个节点为P[k],然后返回执行步骤四。如果k不等于最大行号,则将k加1,进入下一行,并完成各标志位数组变量以及链表的处理,返回执行步骤四。如果当前k行所有的列号均已试过,执行步骤八。
[0083] S108,k减1,并将当前的P[k]添加到链表中,并取下一个结点为P[k],返回执行步骤四。
[0084] 步骤S103中,本发明实施例提供的定义相关符号具体包括:
[0085] 定义:
[0086] (1)k表示行号,初值位为1,所述行号取值范围为大于等于0,小于等于2n-1。
[0087] (2)P[k]表示列号,方阵中第k行第P[k]列的元素为k*P[k],其中*为GF(2n)上的乘法。所述列号取值范围为大于等于0,小于等于2n-1。
[0088] (3)数组flagmulti[2n]、flagfirst[2n]、flagrow[2n]表示标志位,数组pre[2n]、next[2n]、link[2n]表示一个单向静态链表,数组beginning[2n]存储初始列号初始记录位置,beginning[k]记录第k行的初始位置。
[0089] 1)其中标志位flagmulti[i]=1表示i等于之前某一行号与列号的乘积,flagmulti[i]=0则表示相反的情况。
[0090] 2)link为一个包含n个元素的单向静态链表,并且初始化为link[0]=0,link[2n-1]=1,link[i]=i+1(1≤i≤2n-1)。所述link链表表示从1到2n-1这2n-1个列号中所有的可用资源,当一个列号被使用了,则将其从链表中删除,并重构链表。
[0091] 3)对于每一个节点,i表示节点的行号,P[i]表示节点的列号,pre[i]表示第i行列号P[i]的前一个节点,next[i]表示第i行列号P[i]的下一个节点。
[0092] 4)标志位数组flagfirst[2n],当发现一个P[i]被选中时,如果i是1,也就是在第1行选中了列号P[1],就将flagfirst[P[1]]置位为1,初始值是0。
[0093] 5)标志位数组flagrow[2n]用于标记beginning[i]记录的每一行的初始位置,当一行遍历完,将flagrow[i]置为1。同时进行初始化。
[0094] 本发明实施例提供的初始化时各符号值为:
[0095] k=1,P[0]=0,P[1]=2,flagmulti[0]=1,flagmulti[i]=1(1≤i≤2n-1),flagfirst[i]=0(0≤i≤2n-1),flagrow[0]=1,flagrow[1]=0,beginning[0]=0,beginning[1]=2,pre[0]=0,pre[1]=1,next[0]=0,next[1]=3,link[0]=0,link[2n-1]=1,link[i]=i+1(1≤i≤2n-2)。
[0096] 步骤S106中,本发明实施例提供的P[k]需同时满足的两个要求具体包括:
[0097] 第一:flagfirst[k]没有被置位,或者P[k]不等于1。
[0098] 第二:flagmulti[k*P[k]]没有被置位。
[0099] 步骤S106中,本发明实施例提供的对各标志位数组以及链表做相应的处理具体包括:
[0100] flagmulti[k*P[k]]=1,也就是被置位。Link[pre[k]]=next[k],[0101] link[P[k]]=0,即将P[k]从链表中删除。判断行号k是否等于1,如果等于1,则将flagfirst[P[k]]置位为1。
[0102] 步骤S106中,本发明实施例提供的取链表中的下一个节点为P[k]具体包括:
[0103] pre[k]=P[k],P[k]=next[k],next[k]=link[P[k]]。
[0104] 判断此时P[k]是否等于beginning[k],如果等于,表示第k行的所有列号已尝试完毕,将标志位flagrow[k]置为1。
[0105] 步骤S107中,本发明实施例提供的判断当前第k行所有的列号是否均已试过具体包括:
[0106] 判断当前k行所有的列号是否均已试过,判断flagrow[k]是否被置为1,没有被置位即表示还有列号未被尝试。
[0107] 步骤S107中,本发明实施例提供的判断置换是否是加法正形置换具体包括:
[0108] 计算{i⊕P[i]|i∈GF(2n)}=GF(2n)是否成立,成立则是加法正形置换,其中⊕位按二进制位的异或操作。
[0109] 步骤S107中,本发明实施例提供的回退两行,将对应的两个列号重新加入链表具体包括:
[0110] flagmulti[(2n-2)*P[2n-2]]=flagmulti[(2n-2)*P[2n-2]]=0。
[0111] link[P[2n-1]]=next[2n-1]。
[0112] link[pre[2n-1]]=P[2n-1]。
[0113] link[P[2n-2]]=next[2n-2]。
[0114] link[pre[2n-2]]=P[2n-2]。
[0115] 步骤S107中,本发明实施例提供的完成各标志位以及链表的处理具体包括:
[0116] pre[k]=pre[k-1]。
[0117] P[k]=next[k-1]。
[0118] beginning[k]=P[k]。
[0119] flagrow[k]=0。
[0120] next[k]=link[P[k]]。
[0121] 步骤S108中,本发明实施例提供的将当前的P[k]添加到链表中具体包括:
[0122] flagmulti[k*P[k]]=0。
[0123] link[P[k]]=next[P[k]]。
[0124] link[pre[k]]=P[k]。
[0125] 图2是本发明实施例提供的密码学置换的枚举方法原理图。
[0126] 图3是本发明实施例提供的密码学置换的枚举方法框架图。
[0127] 下面结合具体实施例对本发明的技术方案作进一步说明。
[0128] 实施例1:
[0129] 步骤1,获取n的值(2≤n≤4),该值可由用户根据自己的需要设定。
[0130] 在本实例中,设n=4。
[0131] 步骤2,选取一个次数为n的不可约多项式,并基于这个不可约多项式,构造GF(2n)上的乘法表。
[0132] 由于不同的不可约多项式并不会改变最终结果,因此选择一个较简单的4次不可4 4
约多项式x+x+1,从而得到如下的GF(2)上乘法表(只列出非0数相乘的结果,十进制):
[0133]
[0134]
[0135] 上表的第3行第4列的数字为12表示GF(24)上3*4=12,其他依次类推。
[0136] 步骤3,基于乘法表构造一个2n-1行2n-1列的方阵,行号表示置换的输入,列号表示置换的输入。同时定义如下符号:k表示行号,初值位1,列号用P[k]表示,方阵中第k行第P[k]列的元素为k*P[k],*为GF(2n)上的乘法,以下没有特别说明均类同。并定义标志位数组flagmulti[2n],flagfirst[2n],flagrow[2n],单向静态链表pre[2n],next[2n],link[2n]以及一个列号初始记录数组beginning[2n],并完成初始化。
[0137] 现在n=4,所以,
[0138] k=1,P[0]=0,P[1]=2,flagmulti[0]=1,flagmulti[i]=1(1≤i≤15),flagfirst[i]=0(0≤i≤15),flagrow[0]=1,flagrow[1]=0,beginning[0]=0,beginning[1]=2,pre[0]=0,pre[1]=1,next[0]=0,next[1]=3,link[0]=0,link[15]=1,link[i]=i+1(1≤i≤14)。15行15列的方阵就是步骤3中所列的表,该表用一个包含225个元素的数组来存储。
[0139] 步骤4,判断k是否大于0,若大于0,则进入步骤5,否则表示枚举完毕,程序终止。
[0140] k的初值为1,所以此时会进入步骤5,这一步也是最终程序的终止步骤。
[0141] 步骤5,判断第k行的所有列号是否均已试过,若没有则进入步骤6,否则进入步骤7。
[0142] 刚开始时,第1行的列号都没有使用,因此进入步骤6。
[0143] 步骤6,如果当前P[k]满足要求,则对各标志位以及链表做相应的处理,然后跳出步骤6,进入步骤7,如果不满足,则取链表中的下一个节点为P[k],并跳转到步骤5。
[0144] 当k=1时,P[1]=2,因此执行flagmulti[1*P[1]]=flagmulti[2]=1,link[pre[1]]=link[1]=next[1]=3,link[P[1]]=link[2]=0,因为此时行号等于1,所以将flagfirst[P[1]],也就是flagfirst[2]置位为1,进入步骤7。
[0145] 设置flagfirst标志位数组的原因如下:一方面现有技术中已经证明了双正形置换的不动点为0,即如果P是双正形置换,则必有P[0]=0,所以我们在枚举时可以固定P[0]=0以减少计算量。另一方面,现有技术也证明了一个双正性质换的逆置换也是一个双正形置换,观察到,本实例中通过乘法表得到的15×15的方阵关于对角线对称,即,如果在方阵中找到了一个双正形置换,也就是在方阵中找到了如下的15个元素:它们的行号和列号均两两不等,并且它们的值也互不相同,那么这15个元素的行号和列号的对应关系(再加上0对应0)就构成一个双正形置换,那么将这15个元素分别以对角线取对称点,则这15个对称点的行号和列号的对应关系相当于原来15个点的列号和行号的对应关系,也就是原双正形置换的逆置换,则这个逆置换也是一个双正形置换。因此使用一个标志位数组flagfirst[16],如果在第1行选中了列号P[1],就将flagfirst[P[1]]置位,随后的过程中若发现某个P[j]=1,并且flagfirst[j]已经被置位,则说明第1行第j列的这个位置已经被选中了,而此时的位置是它关于对角线的对称点,所以此时就可以取下一个结点来判断了。
[0146] 步骤7,判断当前第k行所有的列号是否均已试过,若没有则进一步判断k是否等于最大行号,若有则表示该置换是乘法正形置换,则同时判断该置换是否是加法正形置换,若是则记录下结果,并通过对调行号和列号得到逆置换,也记录下结果,若不是则不记录也不对调。随后回退两行,将对应的两个列号重新加入链表,并将k减1,取下一个节点为P[k],然后跳转到步骤4。如果k不等于最大行号,则将k加1,进入下一行,并完成各标志位数组以及链表的处理,进入步骤4。如果当前第k行所有的列号均已试过,则进入步骤8。
[0147] 此时第1行的列号显然还没全部试过,接下来便将k加1,也就是进入第2行,并执行如下操作:pre[2]=pre[1]=1,P[2)=next[1]=3,beginning[2]=P[2]=3,flagrow[2]=0,next[2]=link[P[2]]=link[3]=4,并进入步骤4。
[0148] 步骤8,k减1,并将当前的P[k]添加到链表中,并取下一个结点为P[k],然后跳转到步骤4。
[0149] 当取某个k值时,所有的P[k]取遍1到15都不能满足要求,这个时候就需要回溯到上一行,也就是第k-1行来重新选取,所以该算法本质上是基于回溯算法设计的。
[0150] 最终,本发明提供的算法可在一分钟之内枚举出GF(24)上所有的7444个的双正形置换,与现有技术中的计数结果一致。通过简单的证明可以得到,GF(2n)上的乘法正形置换也具有不动点0,而且乘法正形置换的逆置换也是乘法正形置换,因此在枚举过程中,只要将该算法步骤7中的“则同时判断该置换是否是加法正形置换”去掉,就能枚举出GF(24)上所有的38787120个乘法正形置换。
[0151] 本发明列出一个得到的GF(24)上双正形置换的结果:
[0152]0 10 6 11 2 15 4 8 13 14 9 7 5 12 3 1
[0153] 其中,P[0]=0,P[1]=10,P[2]=6,依次类推。
[0154] 以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
高效检索全球专利

IPRDB是专利检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,专利查询、专利分析

电话:13651749426

侵权分析

IPRDB的侵权分析产品是IPRDB结合多位一线专利维权律师和专利侵权分析师的智慧,开发出来的一款特色产品,也是市面上唯一一款帮助企业研发人员、科研工作者、专利律师、专利分析师快速定位侵权分析的产品,极大的减少了用户重复工作量,提升工作效率,降低无效或侵权分析的准入门槛。

立即试用