[发明专利]一种密码学置换的枚举方法及系统有效
申请号: | 201910613016.2 | 申请日: | 2019-07-09 |
公开(公告)号: | CN110266471B | 公开(公告)日: | 2021-10-15 |
发明(设计)人: | 童言;徐士伟;王邦菊;郭曦;赵逸之 | 申请(专利权)人: | 华中农业大学 |
主分类号: | H04L9/06 | 分类号: | H04L9/06 |
代理公司: | 北京金智普华知识产权代理有限公司 11401 | 代理人: | 杨采良 |
地址: | 430000 湖*** | 国省代码: | 湖北;42 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 一种 密码学 置换 枚举 方法 系统 | ||
1.一种密码学置换的枚举方法,其特征在于,所述密码学置换的枚举方法包括以下步骤:
步骤一,获取n的值,n为双正形置换的维度值,取值范围为2≤n≤4;
步骤二,选取一个次数为n的不可约多项式,并基于这个不可约多项式,构造GF(2n)上的乘法表;其中,GF(2n)表示特征为2并且通过n次扩张得到的有限域;
步骤三,基于乘法表构造一个2n-1行2n-1列的方阵,行号表示置换的输入,列号表示置换的输出,该方阵用于数组存储与访问;同时对符号进行相关定义,所述定义相关符号变量具体包括:
(1)k表示行号,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则表示相反的情况,其中1≤i≤2n-1,用于遍历行号;
2)link为一个包含n个元素的单向静态链表,并且初始化为link[0]=0,link[2n-1]=1,link[i]=i+1,其中1≤i≤2n-1,用于遍历行号;所述link链表表示从1到2n-1这2n-1个列号中所有的可用资源,当一个列号被使用了,则从链表中删除,并重构链表;
3)对于每一个节点,i表示节点的行号,P[i]表示节点的列号,pre[i]表示第i行列号P[i]的前一个节点,next[i]表示第i行列号P[i]的下一个节点;
4)标志位数组flagfirst[2n],当发现一个P[i]被选中时,如果i是1,也就是在第1行选中了列号P[1],就将flagfirst[P[1]]置位为1,初始值是0;
5)标志位数组flagrow[2n]用于标记beginning[i]记录的每一行的初始位置,当一行遍历完,将flagrow[i]置为1;同时进行初始化;
步骤四,判断k是否大于0;若大于0,则执行步骤五;否则程序终止;
步骤五,基于判断行标志位变量flagrow[k]是否被置位从而判断第k行的所有列号是否均已试过;若没有则执行步骤六,否则执行步骤七;
步骤六,如果当前P[k]同时满足两个要求,则对各标志位数组以及链表做相应的处理,同时停止执行步骤六,并开始执行步骤七;如果不满足,则取链表中的下一个节点为P[k],并返回执行步骤五;
所述P[k]同时满足的两个要求条件具体包括:
第一:flagfirst[k]没有被置位,或者P[k]不等于1;
第二:flagmulti[k*P[k]]没有被置位;
所述对各标志位数组以及链表做相应的处理方法具体包括:
flagmulti[k*P[k]]=1,也就是被置位;link[pre[k]]=next[k];
link[P[k]]=0,表示将P[k]从链表中删除;判断行号k是否等于1,如果等于1,则将flagfirst[P[k]]置位为1;
步骤七,判断当前k行所有的列号是否均已试过;若没有则进一步判断k是否等于最大行号;若有则置换i→P[i]是乘法正形置换,其中0≤i≤2n-1,用于遍历所有的行号,并同时判断该置换是否是加法正形置换;若是则记录下结果,并通过对调行号和列号得到逆置换,并记录下结果;若不是则不记录也不对调;随后回退两行,将对应的两个列号重新加入链表,并将k减1,取下一个节点为P[k],然后返回执行步骤四;如果k不等于最大行号,则将k加1,进入下一行,并完成各标志位以及链表的处理,返回执行步骤四;如果当前k行所有的列号均已试过,执行步骤八;
所述回退两行,将对应的两个列号重新加入链表的方法具体包括:
flagmulti[(2n-2)*P[2n-2]]=flagmulti[(2n-2)*P[2n-2]]=0;
link[P[2n-1]]=next[2n-1];
link[pre[2n-1]]=P[2n-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];
步骤八,k减1,并将当前的P[k]添加到链表中,并取下一个节点为P[k],返回执行步骤四;
所述步骤五和步骤七中,所述判断当前第k行所有的列号是否均已试过具体包括:
判断当前k行所有的列号是否均已试过,判断flagrow[k]是否被置为1,没有被置位即表示还有列号未被尝试。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于华中农业大学,未经华中农业大学许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201910613016.2/1.html,转载请声明来源钻瓜专利网。