标签:
在20世纪60年代后期,IBM公司成立了一个由Horst Feistel负责的计算机密码学研究项目。1971年设计出算法LUCIFER后,该项目宣告结束。LUCIFER被卖给了伦敦的Lloyd公司,用在同样由IBM公司开发的现金发放系统上。LUCIFER是分组长度为64位、密钥长度为128位、具有Feistel结构的分组密码。因为LUCIFER非常成功,IBM决定开发一个适合于芯片实现的商业密码产品。这一次由Walter Tuchman和Carl Meyer牵头,参与者不仅有IBM公司的研究人员,而且还有美国国家安全局(NSA)的技术顾问。这次努力的结果是给出了LUCIFER的一个修订版,它的抗密码分析能力更强,而且密钥长度减小为56位,因而很适合于在单片机环境下使用。
1973年,美国国家标准局(NBS)征求美国国家密码标准方案时,IBM将Tuchman-Meyer方案提交给NBS,它是所有应征方案中最好的一个,所以1977年NBS将它采纳为数据加密标准,即DES。
以上内容直接来自与参考文献[1],参考文献[2]给出了更加详细的一些介绍,有兴趣可以阅读。
密码学常用的结构有SP、Feistel[3]、Lai-Massey、MISTY等,其中Feistel结构的使用较为普遍,不仅DES用到了,后续的很多经典算法中都有涉及,故在此先对其进行介绍。
Feistel是以发明者Horst Feistel的名字命名的。加解密的原理如右图1,左边表示的加密过程,右边表示解密过程。
在每一轮加密过程中,明文被分成左右两部分。
加密和解密公式如下:
不同的是,在加密过程中,轮数和轮密钥从小开始递增;解密时正好相反,从最大开始递减。
从图中可以看出,加密最后一轮的操作与前面的有所不同,最后一轮得到的两个部分没有交换,这样是为了让解密可以使用和加密相同的硬件结构。
但是对于Feistel结构最本质的特点到底是什么,我也一直不太明白,比较浅显的一点认识就是:每次只有一半的位变化,两外一半直接作为下一轮的输入。
假设明文为(L0,R0),一共有两轮计算,每轮的密钥分别为k0、k1,加解密的流程如图2。
DES算法原理如右图,相关参数如下:
整个操作可以分为3部分:
接下来分别对这三种核心操作进行介绍。
感觉绕的次数比较多,各种置换、扩展、提取等操作,看得可能比较累,先从整体把握吧,再慢慢把细节弄清楚,↖(^ω^)↗。
置换的操作如下表1、表2,将一个64位的输入通过各位的提到得到一个新的64位输出。观察可以发现x = IP-1 ( IP(x) ) = IP ( IP-1(x) )。
需要注意的一点是,图中的索引值从1开始(下文中的数字也类似),有些资料中是从0开始的,如果从零开始,则所有的数字减1即可。
每一轮的流程如图4,从图中可以看出DES用到了Feistel结构。F即为图中虚线框的内容。
图4 轮操作流程
每一轮主要涉及3中操作:
从图1和图4中可以得出,密钥扩展流程可以表示如下:
1) 64位初始密钥P进行置换选择1,得到56位输出K;
2) 将K循环左移一定位数,再进行置换选择2得到48位输出k1(即第一轮的密钥);
3) 循环步骤2),直至得到16轮的密钥(k1、k2、……、k16);
4) 结束。
置换选择1、置换选择2和左移次数的值分别如表6、表7、表8。
近期介绍了DES、AES和Simon3中密码算法,他们都属于分组密码算法,对于流密码算法、公钥密码算法、杂凑函数(Hash算法)等近期将不再介绍,后续有时间再更新。读者有兴趣可以参考《密码学与网络安全——原理与实践》以及网上相关资料,算法原理基本都差不多,只要懂了基本的思想,代码实现就不是太难了。
[1] William Stallings著;王张宜等译. 密码编码学与网络安全——原理与实践(第五版)[M]. 北京:电子工业出版社,2012.1.
[2] http://en.wikipedia.org/wiki/Data_Encryption_Standard
[3] http://en.wikipedia.org/wiki/Feistel_cipher
[4] https://github.com/tarequeh/DES
标签:
原文地址:http://www.cnblogs.com/luop/p/4366902.html