密码算法详解——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位,因而很适合于在单片机环境下使用。

  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

时间: 2024-10-11 22:25:39

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

密码算法详解——AES

0 AES简介 美国国家标准技术研究所在2001年发布了高级加密标准(AES).AES是一个对称分组密码算法,旨在取代DES成为广泛使用的标准. 根据使用的密码长度,AES最常见的有3种方案,用以适应不同的场景要求,分别是AES-128.AES-192和AES-256.本文主要对AES-128进行介绍,另外两种的思路基本一样,只是轮数会适当增加. 1 算法流程 AES加解密的流程图如下: AES加密过程涉及到4种操作:字节替代(SubBytes).行移位(ShiftRows).列混淆(MixCo

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

转发注明出处: http://www.cnblogs.com/0zcl/p/6105825.html 一.基本概念 古典密码是基于字符替换的密码.加密技术有:Caesar(恺撒)密码.Vigenere(维吉尼尔)密码.Playfair密码.Hill密码-- 明文:未经过加密的信息:密文:加密后的信息 加密解密的过程:如下图 二.Caesar密码 这里我先简单讲下恺撒密码,咸觉挺简单的,后面再主要讲Playfair算法原理与编程. 基本原理: 在开拓罗马帝国的时候,恺撒担心信使会阅读他送给士兵的命

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

本文主要介绍了DES算法的步骤,包括IP置换.密钥置换.E扩展置换.S盒代替.P盒置换和末置换. 安全体系(零)-- 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(二)--RSA算法详解 安全体系(三)--SHA1算法详解 1.DES算法简介 DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准. DES是一个分组加密算法,典型的DES以64位为分组对数据加密,加密和解密用的是同一个算法. 密钥长64位,密钥事实上是56位参与DES运算(第8.16.24.32.40

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

本文主要讲述使用SHA1算法计算信息摘要的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 安全体系(二)——RSA算法详解 为保证传输信息的安全,除了对信息加密外,还需要对信息进行认证.认证的目的有两:一是验证信息的发送者是合法的,二是验证信息的完整性.Hash函数就是进行信息认证的一种有效手段. 1.Hash函数和消息完整性 Hash函数也称为杂凑函数或散列函数,函数输入为一可变长度x,输出为一固定长度串,该串被称为输入x

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

本文主要讲述RSA算法使用的基本数学知识.秘钥的计算过程以及加密和解密的过程. 安全体系(零)—— 加解密算法.消息摘要.消息认证技术.数字签名与公钥证书 安全体系(一)—— DES算法详解 1.概述 RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当时他们三人都在麻省理工学院工作.RSA算法以他们三人姓氏开头字母命名. RSA是目前最有影响力的公钥加密

EM算法(3):EM算法详解

目录 EM算法(1):K-means 算法 EM算法(2):GMM训练算法 EM算法(3):EM算法详解

[转] KMP算法详解

转载自:http://www.matrix67.com/blog/archives/115 KMP算法详解 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第六个自然段.    我们这里说的KMP不是拿来放电影的(虽然我很喜欢这个软件),而是一种算法.KMP算法是拿来处理字符串匹配的.换句话说,给你两个字符串,你需要回答,B串是否是A串的子串(A串是否包含B串).比如,字符串A="I'm matrix67",字符串B="matrix",我们就说B是A的子串.

[搜索]波特词干(Porter Streamming)提取算法详解(3)

 接上 [搜索]波特词干(Porter Streamming)提取算法详解(2) 下面分为5大步骤来使用前面提到的替换条件来进行词干提取. 左边是规则,右边是提取成功或者失败的例子(用小写字母表示). 步骤1 SSES -> SS                   caresses  ->  caress IES  -> I                          ponies    ->  poni ties      ->  ti SS   -> S

KMP算法详解(图示+代码)

算法过程非常绕,不要企图一次就能看明白,多尝试就会明白一些.下面试图用比较直观的方法解释这个算法,对KMP算法的解释如下: 1. 首先,字符串"BBC ABCDAB ABCDABCDABDE"的第一个字符与搜索词"ABCDABD"的第一个字符,进行比较.因为B与A不匹配,所以搜索词后移一位. 2. 因为B与A不匹配,搜索词再往后移. 3. 就这样,直到字符串有一个字符,与搜索词的第一个字符相同为止. 4. 接着比较字符串和搜索词的下一个字符,还是相同. 5. 直到字