密码算法详解——DES

0 DES简介

  在20世纪60年代后期,IBM公司成立了一个由Horst Feistel负责的计算机密码学研究项目。1971年设计出密码算法LUCIFER后,该项目宣告结束。LUCIFER被卖给了伦敦的Lloyd公司,用在一样由IBM公司开发的现金发放系统上。LUCIFER是分组长度为64位、密钥长度为128位、具备Feistel结构的分组密码算法。由于LUCIFER很是成功,IBM决定开发一个适合于芯片实现的商业密码产品。这一次由Walter Tuchman和Carl Meyer牵头,参与者不只有IBM公司的研究人员,并且还有美国国家安全局(NSA)的技术顾问。此次努力的结果是给出了LUCIFER的一个修订版,它的抗密码分析能力更强,并且密钥长度减少为56位。git

  1973年,美国国家标准局(NBS)征求美国国家密码标准方案时,IBM将Tuchman-Meyer方案提交给NBS,它是全部应征方案中最好的一个,因此1977年NBS将它采纳为数据加密标准,即DES。github

  以上内容直接来自与参考文献[1],参考文献[2]给出了更加详细的一些介绍,有兴趣能够阅读。算法

1 Feistel

  分组密码经常使用的结构有SP、Feistel[3]、Lai-Massey、MISTY等,其中Feistel结构的使用较为广泛,不只DES用到了,后续的不少经典算法中都有涉及,故在此先对其进行介绍。安全

1.1 Feistel介绍

  Feistel是以发明者Horst Feistel的名字命名的。加解密的原理如右图1,左边表示的加密过程,右边表示解密过程。网络

  在每一轮加密过程当中,明文被分红左右两部分。函数

  加密和解密公式以下:编码

  不一样的是,在加密过程当中,轮数和轮密钥从小开始递增;解密时正好相反,从最大开始递减。加密

  从图中能够看出,加密最后一轮的操做与前面的有所不一样,最后一轮获得的两个部分没有交换,之因此这样是为了保持解密的流程和加密一致,这样在硬件设计时可使用相同的结构,进而减小硬件面积。spa

  可是对于Feistel结构最本质的特色究竟是什么,我也一直不太明白,比较浅显的一点认识就是:每一轮只有一半的比特位参与计算,另一半直接做为下一轮的输入。设计

 

1.2 一个简单的例子

  假设明文为(L0,R0),一共有两轮计算,每轮的密钥分别为k0、k1,加解密的流程如图2。

2 算法流程

  DES算法原理如右图,相关参数以下: 

    • 明文分组长度:64 bits
    • 密钥长度:64 bits
    • 轮数:16轮

  整个操做能够分为3部分:

    • 初始置换和逆初始置换:这是一对可逆操做,一组数字通过初始置换(或逆初始置换)后,再通过逆初始置换(或初始置换)便可恢复原来的值;
    • 每轮的加解密操做:64位明文和48为密钥通过必定的操做,输出64位密文;
    • 轮密钥计算:64位初始密钥通过置换、循环移位等获得16轮的密钥,每轮密钥长度为48位。

  接下来分别对这三种核心操做进行介绍。

 

 

2.1 初始置换与逆初始置换

  置换的操做以下表一、表2,将一个64位的输入经过各位的提到获得一个新的64位输出。观察能够发现x = IP-1 ( IP(x) ) = IP ( IP-1(x) )。  

  须要注意的一点是,图中的索引值从1开始(下文中的数字也相似),有些资料中是从0开始的,若是从零开始,则全部的数字减1便可。

2.2 每轮的操做

  每一轮的流程如图4,从图中能够看出DES用到了Feistel结构。F即为图中虚线框的内容。

                                                                                                        图4 轮操做流程

  每一轮主要涉及3中操做:

    • 扩展/置换:将32位输入扩展成48位输出,如表3;
    • S盒:将48位输入分红8组分别做为8个S盒的输入,每组6位,最高位和最低位做为行索引,中间4位做为列索引,获得一个值x(0<=x<=15),表示为二进制即为4位,8个S盒的输出和在一块儿正好32位。表4是S1的数值;
    • 置换:对32位输入进行位的变化,输出仍为32位,如表5。

2.3 轮密钥扩展

  从图1和图4中能够得出,密钥扩展流程能够表示以下:

    1) 64位初始密钥P进行置换选择1,获得56位输出K;

    2) 将K循环左移必定位数,再进行置换选择2获得48位输出k1(即第一轮的密钥);

    3) 循环步骤2),直至获得16轮的密钥(k1、k2、……、k16);

    4) 结束。

  置换选择一、置换选择2和左移次数的值分别如表六、表七、表8。

 

3 其它密码算法

  近期介绍了DES、AES和Simon3种密码算法,他们都属于分组密码算法,后续有时间再介绍其它分组密码算法、流密码算法、杂凑函数(Hash算法)等。读者有兴趣能够参考《密码学与网络安全——原理与实践》以及网上相关资料,算法原理基本都差很少。

4 参考资料

[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