DES加密(未完成)

DES加密

一. 简介

1.1 背景

在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 DES是什么

数据加密标准(英语:Data Encryption Standard,缩写为 DES)是一种对称密钥加密块密码算法,1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),随后在国际上广泛流传开来。它基于使用56位密钥的对称算法

这个算法因为包含一些机密设计元素,相对短的密钥长度以及怀疑内含美国国家安全局(NSA)的后门而在开始时有争议,DES因此受到了强烈的学院派式的审查,并以此推动了现代的块密码及其密码分析的发展。

DES现在已经不是一种安全的加密方法,主要因为它使用的56位密钥过短。1999年1月,distributed.net与电子前哨基金会合作,在22小时15分钟内即公开破解了一个DES密钥。也有一些分析报告提出了该算法的理论上的弱点,虽然在实际中难以应用。为了提供实用所需的安全性,可以使用DES的派生算法3DES来进行加密,虽然3DES也存在理论上的攻击方法。在2001年,DES作为一个标准已经被高级加密标准(AES)所取代。另外,DES已经不再作为国家标准科技协会(前国家标准局)的一个标准。

在某些文献中,作为算法的DES被称为DEA(Data Encryption Algorithm,数据加密算法),以与作为标准的DES区分开来。

1.3 Feistel

分组密码常用的结构有SP、Feistel、Lai-Massey、MISTY等,其中Feistel结构的使用较为普遍,不仅DES用到了,后续的很多经典算法中都有涉及。

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

加密和解密公式如下:

加密和解密公式

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

Feistel

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

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

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

加解密的流程


二. 算法流程

DES算法原理

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即可。

DES算法原理

2.2 每轮的操作

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

轮操作流程

每一轮主要涉及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。

轮操作流程


第二节 源码解析

暂无。


第三节 实战应用

暂无。


参考:

🔗 密码算法详解——DES

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

🔗 数据加密标准