一种密码芯片上的固定位宽密钥产生方法与流程

文档序号:11410640阅读:222来源:国知局

本发明涉及一种密码芯片上的密钥产生方法,尤其是涉及一种密码芯片上的固定位宽密钥产生方法。



背景技术:

集成电路和信息技术的日益发展、互联网的迅速普及,为人们日常生活、学习和工作带来极大便利,如支付宝、淘宝、网银以及微信等。大量的信息共享与方便的同时,也出现信息被泄露与篡改的威胁,如网上银行账户被盗、个人隐私泄露以及棱镜门事件等等。如何保证数据信息的安全在密码学中显得尤为突出。密码算法在信息安全领域发挥着至关重要的作用,是保证信息安全传送最有效的方法,其中分组密码和流密码是应对现代通信中信息安全威胁最有效最常用的方法。分组密码是对固定长度的消息进行加密操作,高级加密标准(aes)因其复杂的数学结构,是目前安全性最高的分组密码算法,广泛应于到各种加密系统当中。而流密码则是比特级的加密操作,将产生的具有特定位宽的密钥与需要进行加密的明文数据进行逐比特的异或操作,其安全强度取决于密钥的生成算法。因此,在密码芯片对数据进行安全处理的过程中,固定位宽密钥的产生与选择对安全性有着举足轻重的影响。

hash函数又称哈希函数或者杂凑函数,是现代密码学中最基本的模块之一,该函数以任意长度的消息值作为输入,生成固定长度的输出数据,具有将任意长度数据转换为固定位宽数据的功能。自从2004年密码学家王小云教授宣布攻破常用的hash算法以来,网络信息安全问题进一步凸显。美国国家标准与技术研究所(nist)于2007年公开征集杂凑函数新标准(sha-3算法)的活动,并于2012年10月2日将keccak杂凑算法定位新一代杂凑函数标准,其具有新颖的sponge迭代结构、较强的安全性能以及良好的实现方法。文献(李建瑞,汪鹏君,张跃军,李刚.基于sha-3算法的图像密钥生成方法.华东理工大学学报(自然科学版),vol.41no.5,p693-p697,2015.10)提出采用sha-3算法将任意长度的图像数据转换为固定位宽的密钥产生方法。该密钥产生方法具体过程如下:首先,将待处理图像转换为bmp格式图像,并将bmp格式图像转换为n位十六进制数据;然后,将n位十六进制数据由低位到高位依次进行分组,每64位作为一组十六进制数据,如果一组十六进制数据不足64位,则其高位用0补充;其次,通过keccak-f[b]为迭代置换函数进行12轮的压缩迭代,每一轮的置换函数f都是作用在一个三维矩阵上的五步迭代置换;最后,得到keccak杂凑算法输出数据作为图像密钥。但是,该密钥产生方法存在以下几个方面的问题:1、由于采用三维矩阵的压缩迭代,电路实现所占用的硬件资源较大;2、图像数据的转换速度太慢,且五步迭代置换算法所需处理的时间较长,在实际应用中必须进一步优化;3、由于需要进行12轮的迭代运算,存在轮攻击的数量会较多,其安全性也可能随之降低。

鉴此,设计一种占用的硬件资源较少,速度快,且安全性较高的密码芯片上的固定位宽密钥产生方法,在密码芯片的实际应用方面具有重要意义。



技术实现要素:

本发明所要解决的技术问题是提供一种占用的硬件资源少,速度快,且随着被攻击的轮数的增加,安全性不会随之降低,安全性较高的密码芯片上的固定位宽密钥产生方法。

本发明解决上述技术问题所采用的技术方案为:一种密码芯片上的固定位宽密钥产生方法,包括以下步骤:

a.将n位二进制数据结构的初始密码数据按照串行的方式从低位到高位输入到密码芯片并保存在密码芯片的内部存储器中,其中n为大于等于1的整数;

b.获取初始密码数据的位数,如果初始密码数据的位数大于1600,则从最低位开始向高位截取1600位二进制数据作为中间密码数据;如果初始密码数据的位数等于1600,则从最低位为开始向高位截取1600位二进制数据作为中间密码数据,如果初始密码数据的位数小于1600,则在其高位补0到1600位二进制数据作为中间密码数据;

c.将中间密码数据按照从低位到高位的顺序进行划分,每64位二进制数据划分为一组,得到25组64位二进制数据,将第k组64位二进制数据记为mk,k=1,2,3,…,25,25组64位二进制数据按划分先后顺序依次存储到密码芯片的内部存储器中;

d.将24组64位二进制数据m1-m24按照查找表的方式依次进行变换,将当前变换的轮数记为nr_round,nr_round=1,2,…,24,将mt变换后的值记为m″t,t=1,2,…,24,在密码芯片中设定六个64位中间寄存器,六个64位中间寄存器分别记为r1_out、r2_out、r3_out、rho_out、iota_out和chi_out;

第1轮-第22轮变换的具体过程为:

d-1.将64位二进制数据mj的值赋给r1_out,j=nr_round,nr_round=1,2,…,22;

d-2.将64位二进制数据mj+1与r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r1_out对r1_out进行更新,得到更新后的r1_out;

d-3.将64位二进制数据mj+2的最高位移到其最低位的右边,然后整体左移1位得到64位二进制数据m'j+2;

d-4.将64位二进制数据m'j+2与步骤d-2中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r2_out;

d-5.将64位二进制数据mj+3与步骤d-2中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r3_out。

d-6.设定轮常数为iota,iota用16进制数据表示如下:

当nr_round=1时,iota=0000000000000001;

当nr_round=2时,iota=0000000000008082;

当nr_round=3时,iota=800000000000808a;

当nr_round=4时,iota=8000000080008000;

当nr_round=5时,iota=000000000000808b;

当nr_round=6时,iota=0000000080000001;

当nr_round=7时,iota=8000000080008081;

当nr_round=8时,iota=8000000000008009;

当nr_round=9时,iota=000000000000008a;

当nr_round=10时,iota=0000000000000088;

当nr_round=11时,iota=0000000080008009;

当nr_round=12时,iota=000000008000000a;

当nr_round=13时,iota=000000008000808b;

当nr_round=14时,iota=800000000000008b;

当nr_round=15时,iota=8000000000008089;

当nr_round=16时,iota=8000000000008003;

当nr_round=17时,iota=8000000000008002;

当nr_round=18时,iota=8000000000000080;

当nr_round=19时,iota=000000000000800a;

当nr_round=20时,iota=800000008000000a;

当nr_round=21时,iota=8000000080008081;

当nr_round=22时,iota=8000000000008080;

d-7.将步骤d-2中更新后的r1_out的最高位移除并在其最低位的右边补一个0后,然后整体左移1位得到的64位二进制数据赋值给rho_out;

d-8.将当前轮的轮常数iota转换为64位二进制数据后与rho_out相加后的值赋值给iota_out;

d-9.将r2_out进行非运算后,与步骤d-2中更新后的r1_out进行异或运算,然后再与r3_out进行异或运算,得到的值赋值给chi_out;

d-10.当步骤d-2中更新后的r1_out的从低位到高位方向的第3位值为“1”时,将rho_out的值赋给m″j,当步骤d-2中更新后的r1_out的从低位到高位方向的第2位值为“1”时,将chi_out的值赋给m″j,当步骤d-2中更新后的r1_out的从低位到高位方向的第1位值为“1”时,将chi_out与rho_out进行异或运算后的值赋给m″j;

第23轮变换的具体过程为:

d-11.将64位二进制数据mj的值赋给r1_out,j=nr_round,nr_round=23;

d-12.将64位二进制数据mj+1与r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r1_out对r1_out进行更新,得到更新后的r1_out;

d-13.将64位二进制数据mj+2的最高位移到其最低位的右边,然后整体左移1位得到64位二进制数据m'j+2;

d-14.将64位二进制数据m'j+2与步骤d-12中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r2_out;

d-15.将64位二进制数据m1与步骤d-12中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r3_out;

d-16.设定轮常数为iota,iota用16进制数据表示如下:当nr_round=23时,iota=0000000080000001;

d-17.将步骤d-12中更新后的r1_out的最高位移除并在其最低位的右边补一个0后,然后整体左移1位得到的64位二进制数据赋值给rho_out;

d-18.将当前轮的轮常数iota转换为64位二进制数据后与rho_out相加后的值赋值给iota_out;

d-19.将r2_out进行非运算后,与步骤d-12中更新后的r1_out进行异或运算,然后再与r3_out进行异或运算,得到的混合逻辑值赋值给chi_out;

d-20.当步骤d-12中更新后的r1_out的第3位值为“1”时,将rho_out的值赋给m″j,当步骤d-12中更新后的r1_out的第2位值为“1”时,将chi_out的值赋给m″j,当步骤d-12中更新后的r1_out的第1位值为“1”时,将chi_out与rho_out进行异或运算后的值赋给m″j;

第24轮变换的具体过程为:

d-21.将64位二进制数据mj的值赋给r1_out,j=nr_round,nr_round=24;

d-22.将64位二进制数据mj+1与r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r1_out对r1_out进行更新,得到更新后的r1_out;

d-23.将64位二进制数据m1的最高位移到其最低位的右边,然后整体左移1位得到64位二进制数据m'1;

d-24.将64位二进制数据m'1与更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r2_out;

d-25.将64位二进制数据m2与更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r3_out;

d-26.设定轮常数为iota,iota用16进制数据表示如下:当nr_round=24时,iota=8000000080008008;

d-27.将步骤d-22中更新后的r1_out的最高位移除并在其最低位的右边补一个0后,然后整体左移1位得到的64位二进制数据值赋给rho_out;

d-28.将当前轮的轮常数iota转换为64位二进制数据后与rho_out相加后的值赋值给iota_out;

d-29.将r2_out进行非运算后,与步骤d-22中更新后的r1_out进行异或运算,然后再与r3_out进行异或运算,得到混合逻辑值赋值给chi_out;

d-30.当步骤d-22中更新后的r1_out的第3位值为“1”时,将rho_out的值赋给m″j,当步骤d-22中更新后的r1_out的第2位值为“1”时,将chi_out的值赋给m″j,当步骤d-22中更新后的r1_out的第1位值为“1”时,将chi_out与rho_out进行异或运算后的值赋给m″j;

e.从步骤d中得到的m"1-m"24和m25这25组二进制数据中随机选择四组二进制数据拼接为256位二进制数据作为固定位宽的密钥输出。

与现有技术相比,本发明的优点在于通过将n位二进制数据结构的初始密码数据按照串行的方式从低位到高位输入到密码芯片中并保存在密码芯片的内部存储器中,然后获取初始密码数据的位数,如果初始密码数据的位数大于1600,则从最低位开始向高位截取1600位二进制数据作为中间密码数据;如果初始密码数据的位数等于1600,则从最低位为开始向高位截取1600位二进制数据作为中间密码数据,如果初始密码数据的位数小于1600,则在其高位补0到1600位二进制数据作为中间密码数据,接着将中间密码数据按照从低位到高位的顺序进行划分,每64位二进制数据划分为一组,得到25组64位二进制数据,将第k组64位二进制数据记为mk,k=1,2,3,…,25,25组64位二进制数据按划分先后顺序依次存储到密码芯片的内部存储器中,然后在密码芯片中设定六个64位中间寄存器,六个64位中间寄存器分别记为r1_out、r2_out、r3_out、rho_out、iota_out和chi_out,将24组64位二进制数据m1-m24按照查找表的方式依次进行变换,得到m"1-m"24,最后从m"1-m"24和m25这25组二进制数据中随机选择四组二进制数据拼接为256位二进制数据作为固定位宽的密钥输出,该方法在采用查找表对数据进行变换过程中,每轮查找表的大小都保持一致,不会随着轮数的增加引起芯片安全性的降低,结合加密芯片内部的存储器和寄存器进行数据存储和数据交换,从加密芯片内部的存储器读写数据实现读取运算,在寄存器中寄存每次计算结果以及一些中间变量,涉及的六个中间变量在每一轮运算中都采取共用的方式,可以有效降低芯片的硬件资源开销,实现同时对一个分组数据进行运算处理,覆盖新的运算结果,降低算法执行功耗,安全性较高,在提高处理速度的同时有效降低面积开销。

具体实施方式

以下结合实施例对本发明作进一步详细描述。

实施例:一种密码芯片上的固定位宽密钥产生方法,包括以下步骤:

a.将n位二进制数据结构的初始密码数据按照串行的方式从低位到高位输入到密码芯片中并保存在密码芯片的内部存储器中,其中n为大于等于1的整数;

b.获取初始密码数据的位数,如果初始密码数据的位数大于1600,则从最低位开始向高位截取1600位二进制数据作为中间密码数据;如果初始密码数据的位数等于1600,则从最低位为开始向高位截取1600位二进制数据作为中间密码数据,如果初始密码数据的位数小于1600,则在其高位补0到1600位二进制数据作为中间密码数据;

c.将中间密码数据按照从低位到高位的顺序进行划分,每64位二进制数据划分为一组,得到25组64位二进制数据,将第k组64位二进制数据记为mk,k=1,2,3,…,25,25组64位二进制数据按划分先后顺序依次存储到密码芯片的内部存储器中;

d.将24组64位二进制数据m1-m24按照查找表的方式依次进行变换,将当前变换的轮数记为nr_round,nr_round=1,2,…,24,将mt变换后的值记为m″t,t=1,2,…,24,在密码芯片中设定六个64位中间寄存器,六个64位中间寄存器分别记为r1_out、r2_out、r3_out、rho_out、iota_out和chi_out;

第1轮-第22轮变换的具体过程为:

d-1.将64位二进制数据mj的值赋给r1_out,j=nr_round,nr_round=1,2,…,22;

d-2.将64位二进制数据mj+1与r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r1_out对r1_out进行更新,得到更新后的r1_out;

d-3.将64位二进制数据mj+2的最高位移到其最低位的右边,然后整体左移1位得到64位二进制数据m'j+2;

d-4.将64位二进制数据m'j+2与步骤d-2中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r2_out;

d-5.将64位二进制数据mj+3与步骤d-2中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r3_out。

d-6.设定轮常数为iota,iota用16进制数据表示如下:

当nr_round=1时,iota=0000000000000001;

当nr_round=2时,iota=0000000000008082;

当nr_round=3时,iota=800000000000808a;

当nr_round=4时,iota=8000000080008000;

当nr_round=5时,iota=000000000000808b;

当nr_round=6时,iota=0000000080000001;

当nr_round=7时,iota=8000000080008081;

当nr_round=8时,iota=8000000000008009;

当nr_round=9时,iota=000000000000008a;

当nr_round=10时,iota=0000000000000088;

当nr_round=11时,iota=0000000080008009;

当nr_round=12时,iota=000000008000000a;

当nr_round=13时,iota=000000008000808b;

当nr_round=14时,iota=800000000000008b;

当nr_round=15时,iota=8000000000008089;

当nr_round=16时,iota=8000000000008003;

当nr_round=17时,iota=8000000000008002;

当nr_round=18时,iota=8000000000000080;

当nr_round=19时,iota=000000000000800a;

当nr_round=20时,iota=800000008000000a;

当nr_round=21时,iota=8000000080008081;

当nr_round=22时,iota=8000000000008080;

d-7.将步骤d-2中更新后的r1_out的最高位移除并在其最低位的右边补一个0后,然后整体左移1位得到的64位二进制数据赋值给rho_out;

d-8.将当前轮的轮常数iota转换为64位二进制数据后与rho_out相加后的值赋值给iota_out;

d-9.将r2_out进行非运算后,与步骤d-2中更新后的r1_out进行异或运算,然后再与r3_out进行异或运算,得到的值赋值给chi_out;

d-10.当步骤d-2中更新后的r1_out的从低位到高位方向的第3位值为“1”时,将rho_out的值赋给m″j,当步骤d-2中更新后的r1_out的从低位到高位方向的第2位值为“1”时,将chi_out的值赋给m″j,当步骤d-2中更新后的r1_out的从低位到高位方向的第1位值为“1”时,将chi_out与rho_out进行异或运算后的值赋给m″j;

第23轮变换的具体过程为:

d-11.将64位二进制数据mj的值赋给r1_out,j=nr_round,nr_round=23;

d-12.将64位二进制数据mj+1与r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r1_out对r1_out进行更新,得到更新后的r1_out;

d-13.将64位二进制数据mj+2的最高位移到其最低位的右边,然后整体左移1位得到64位二进制数据m'j+2;

d-14.将64位二进制数据m'j+2与步骤d-12中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r2_out;

d-15.将64位二进制数据m1与步骤d-12中更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r3_out;

d-16.设定轮常数为iota,iota用16进制数据表示如下:当nr_round=23时,iota=0000000080000001;

d-17.将步骤d-12中更新后的r1_out的最高位移除并在其最低位的右边补一个0后,然后整体左移1位得到的64位二进制数据赋值给rho_out;

d-18.将当前轮的轮常数iota转换为64位二进制数据后与rho_out相加后的值赋值给iota_out;

d-19.将r2_out进行非运算后,与步骤d-12中更新后的r1_out进行异或运算,然后再与r3_out进行异或运算,得到的混合逻辑值赋值给chi_out;

d-20.当步骤d-12中更新后的r1_out的从低位到高位方向的第3位值为“1”时,将rho_out的值赋给m″j,当步骤d-12中更新后的r1_out的从低位到高位方向的第2位值为“1”时,将chi_out的值赋给m″j,当步骤d-12中更新后的r1_out的从低位到高位方向的第1位值为“1”时,将chi_out与rho_out进行异或运算后的值赋给m″j;

第24轮变换的具体过程为:

d-21.将64位二进制数据mj的值赋给r1_out,j=nr_round,nr_round=24;

d-22.将64位二进制数据mj+1与r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r1_out对r1_out进行更新,得到更新后的r1_out;

d-23.将64位二进制数据m1的最高位移到其最低位的右边,然后整体左移1位得到64位二进制数据m'1;

d-24.将64位二进制数据m'1与更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r2_out;

d-25.将64位二进制数据m2与更新后的r1_out按位进行异或运算,得到异或运算逻辑值,并将该异或运算逻辑值赋给r3_out;

d-26.设定轮常数为iota,iota用16进制数据表示如下:当nr_round=24时,iota=8000000080008008;

d-27.将步骤d-22中更新后的r1_out的最高位移除并在其最低位的右边补一个0后,然后整体左移1位得到的64位二进制数据值赋给rho_out;

d-28.将当前轮的轮常数iota转换为64位二进制数据后与rho_out相加后的值赋值给iota_out;

d-29.将r2_out进行非运算后,与步骤d-22中更新后的r1_out进行异或运算,然后再与r3_out进行异或运算,得到混合逻辑值赋值给chi_out;

d-30.当步骤d-22中更新后的r1_out的从低位到高位方向的第3位值为“1”时,将rho_out的值赋给m″j,当步骤d-22中更新后的r1_out的从低位到高位方向的第2位值为“1”时,将chi_out的值赋给m″j,当步骤d-22中更新后的r1_out的从低位到高位方向的第1位值为“1”时,将chi_out与rho_out进行异或运算后的值赋给m″j;

e.从步骤d中得到的m"1-m"24和m25这25组二进制数据中随机选择四组二进制数据拼接为256位二进制数据作为固定位宽的密钥输出。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1