http://xueshu.baidu.com/s?wd=paperuri:(27624be4b435764ce6fa3d9fcccc8bfd)&filter=sc_long_sign&sc_ks_para=q%3DI-PRESENT%3A+An+Involutive+Lightweight+Block+Cipher&tn=SE_baiduxueshu_c1gjeupa&ie=utf-8&sc_us=131043553867608968
http://xueshu.baidu.com/s?wd=paperuri%3A%2827624be4b435764ce6fa3d9fcccc8bfd%29&filter=sc_long_sign&tn=SE_xueshusource_2kduw22v&sc_vurl=http%3A%2F%2Fwww.oalib.com%2Fpaper%2F3111973&ie=utf-8&sc_us=131043553867608968
先放上论文链接,这个论文是国外研究人员写的。
我本人其实没怎么做前期的工作,这个密码是和实验室项目有关,实验室学长学姐之前负责一个电力系统的加密传输项目……然后老板叫我把这哥密码实现一下……问题是为什么要我实现,学长学姐为什么没有实现……
总之最后是实现了。
由于时间问题,这篇文章编辑时间比较长,目前先写到这儿。
我打算先把present加密算法介绍一下,再把这个改进的present加密算法介绍一下,然后会上传写好的改进型present算法文件。
1.PRESENT加密算法简介
(引用一下度娘……)
在CHES2007上,Bogdanov等提出了PRESENT算法,该算法具有出色的硬件实现性能和简洁的轮函数设计。PRESENT密码算法与现有的轻量级分组密码算法TEA、MCRYPTON、HIGHT、SEA和CGEN相比,有着更简单的硬件实现,因此被称为超轻量级密码算法。
PRESENT分组密码算法采用SPN结构,分组长度为64位,支持80位、128位两种密钥长度。共迭代31轮,每轮轮函数F 由轮密钥加、S盒代换、P置换3部分组成。
加密过程如下:
1) 轮密钥加:64bit 轮输入同轮密钥进行异或。
2) S 盒代换层:将轮密钥加64bit 输出查找16 个4 进4 出的S 盒。
3) P 置换层:通过置换表P(i)对S 盒代换64bit 输出按比特进行重新排列。
为提高算法安全性,PRESENT 在第31 轮后使用64bit 密钥K32 进行后期白化操作
(*目前CSDN上面有C++编写的present算法,但是只有一个分组内的加密。本来有打算把代码公布出来,不过感觉有点对不起原作者所以就不公布啦……有兴趣的同学请自行下载,地址:https://download.csdn.net/download/jinzhong1011/3841349。)
然后再根据自己搜索的资料稍稍详细地介绍一下present算法的几个特点(本人对于密码学的,关于分组密码学的基本知识就不赘述了……):
1)PRESENT密码是一种分组密码,,每个分组为64比特大小;
2)用于加密解密的密钥可选择128bit和80bit的,csdn上目前我只找到80bit密钥版本;
3)需要进行31轮的迭代每一轮都需要经过轮密钥加、S盒变换和P置换三种操作;
4)为什么说是轻量型加密算法呢?以AES为例,AES的分组大小是128比特,密钥长度则可以是128,192或256位,相比之下present算法的分组大小为64bit,密钥为80bit或者128bit,硬件开销上小于aes算法;
5)个人测试发现PRESENT加密字符串的时间很长。国密SM4的加密速度能达到AES的水准,相比之下PRESENT的加密时间会达到SM4的数倍(之前SM4花6秒加密的数据,PRESENT要30秒左右,经过检查应该不是自己拼接字符串出错);
(*更详细的资料看这里吧,比如P变换,S变换,轮密钥加都是啥……https://wenku.baidu.com/view/dcb9a0454b35eefdc8d333cd.html?from=search)
改进后的present算法(以下简称I-PRESENT)的特点:
1)算法中使用了一个对合函数S盒(也就是说原先的S盒和逆S是不一样的,而这个对合函数S盒,可以理解为对称的S盒,经过两次对合函数S盒变换,分组就可以恢复)。另外论文中的S盒和逆S盒是错误的,请参考程序中的S盒和逆S盒;
2)密钥扩展时候的左移61位变成左移53位,不过实际上如果原始版本的密钥扩展变为53位,并不会影响加密解密,没记错的话左移61+8*i位都不影响加密解密,原理不知道……(本质上密钥扩展没变);
3)原先的PRESENT算法需要31轮运算,