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位。

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

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

1 Feistel

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

1.1 Feistel介绍

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

  在每一轮加密过程中,明文被分成左右两部分。

  加密和解密公式如下:

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

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

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

1.2 一个简单的例子

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

2 算法流程

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

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

  整个操作可以分为3部分:

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

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

2.1 初始置换与逆初始置换

  置换的操作如下表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) 结束。

  置换选择1、置换选择2和左移次数的值分别如表6、表7、表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

密码算法详解——DES的更多相关文章

  1. 密码算法详解——AES

    0 AES简介 1997年1月2号,美国国家标准技术研究所宣布希望征集一个安全性能更高的加密算法(AES)[3],用以取代DES.我们知道DES的密钥长度是64 bits,但实际加解密中使用的有效长度 ...

  2. AES密码算法详解(转自https://www.cnblogs.com/luop/p/4334160.html)

    0 AES简介 我们知道数据加密标准(Data Encryption Standard: DES)的密钥长度是56比特,因此算法的理论安全强度是256.但二十世纪中后期正是计算机飞速发展的阶段,元器件 ...

  3. 密码算法详解——Simon

    0 Simon简介 详细文档请直接阅读参考文献[1]. Simon是由NSA设计的轻量级分组密码算法(LIGHTWEIGHT BLOCK CIPHER).主要应用于硬件或软件条件受限(例如:芯片面积要 ...

  4. 信息安全-1:python之playfair密码算法详解[原创]

    转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere ...

  5. 安全体系(一)—— DES算法详解

    本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(二)——RSA算 ...

  6. 安全体系(二)——RSA算法详解

    本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 ...

  7. 安全体系(三)——SHA1算法详解

    本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保 ...

  8. BM算法  Boyer-Moore高质量实现代码详解与算法详解

    Boyer-Moore高质量实现代码详解与算法详解 鉴于我见到对算法本身分析非常透彻的文章以及实现的非常精巧的文章,所以就转载了,本文的贡献在于将两者结合起来,方便大家了解代码实现! 算法详解转自:h ...

  9. kmp算法详解

    转自:http://blog.csdn.net/ddupd/article/details/19899263 KMP算法详解 KMP算法简介: KMP算法是一种高效的字符串匹配算法,关于字符串匹配最简 ...

随机推荐

  1. 解决ios上微信无法捕获返回键按钮事件的问题

    1 //匿名函数 $(function(){ getHistory(); var flag=false; setTimeout(function(){ flag=true },1000) window ...

  2. Akka边学边写(2)-- Echo Server

    EchoServer 上篇文章里,我们用Akka写了一个简单的HelloWorld样例,对Akka(以及Actor模式)有了初步的认识.本文将用Akka写一个EchoServer,看看在Actor的世 ...

  3. iOS 苹果app提交 ITC.apps.validation.prerelease_build_missing

    提示这信息,由于没有选择包文件, 在提交页面以下bulid的区域, 加入你的app就可以 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxpbmNleG ...

  4. Redux中的重要概念

    Action/Reducer/Store 首先,先看看第一张图,图中展示了Redux的单向数据流,以及Action.Reducer和Store这三个核心概念. 下面就围绕上图,非别介绍Action.R ...

  5. 使用 React 和 Flux 创建一个记事本应用

    React,来自 Facebook,是一个用来创建用户界面的非常优秀的类库.唯一的问题是 React 不会关注于你的应用如何处理数据.大多数人把 React 当做 MV* 中的 V.所以,Facebo ...

  6. 高效的SQL分页存储过程

    CREATE PROCEDURE SP_CommonPageList @Fields VARCHAR(500), @From VARCHAR(1000), @Condition VARCHAR(100 ...

  7. Struts2 工作流程

    Struts2使用了WebWork的设计核心(XWork),在内部使用拦截器处理用户请求,从而允许用户业务逻辑控制器和ServletAPI分离.Struts2内部是一个MVC架构,Struts2 的核 ...

  8. Python中安装numpy,scipy,matplotlib安装方法

    这个吧,说简单也简单,说难吧我捣鼓了两天才弄出来,真是头发都急白了.其实只要一个网址就搞定了,嘿嘿 http://www.lfd.uci.edu 这里面有你需要的任何东西,当你运行python imp ...

  9. phonegap安卓环境下使用BarcodeScanner插件扫描二维码教程

    由于一直在使用phoneGap来开发安卓应用,而对于原生Java小白的我最近这几天一直陷入了如何使用phonegap的BarcodeScanner插件这件事情上,可以说查遍了百度和Google,虽然只 ...

  10. Python成长之路第二篇(3)_字典的置函数用法

    字典的置函数用法(字典dict字典中的key不可以重复) class dict(object): """ dict() -> new empty dictionar ...