<密码学入门>关于DES加密算法解密算法及相关问题

题外话:个人觉得DES加密解密真的是一种过程冗长的方法,S盒,P盒还有各种各样的变换让人眼花缭乱。

(一)Feistel密码结构

要先说Feistel密码结构的原因是DES加密过程是和Feistel密码结构完全一致的。

Feistel密码结构首先要将待加密的部分分为左右R0,L0,下一步的操作是将L0不做处理直接传递给R1,R0首先要经过一个轮函数F(Rx,Kx)的处理之后再和L0的每一位进行半加操作,一般情况下,在左右两部分不断交换的过程中,子密钥Kx也会不断地发生变化,实质上是使F(Rx,Kx)函数要进行的操作处理因为Kx的变化而改变。不断交换的过程也就使明文的统计特性分散到了密文之中,也就是所谓”混淆扩散“,其中轮函数F是整个加密过程中的唯一非线性部分,轮函数的复杂性决定了加密的程度。

代数表达Feistel密码结构就是:

Ri = Li+1;

Li = Ri+1⊕F (Li+1,Ki)(其中半加/抑或操作使得加密过程和解密过程除了子密钥的顺序相反之外完全相同)

(二)DES加密过程

DES算法处理的整个过程是将待加密的64bit明文,经过64BIT的密钥来进行加密,最后生成目标64bit的密文,加密过程具体如下:

1.第一步是从目标的文件或者buffer之中得到将要加密处理的文件指针或者指针,待加密的明文设为如下:

01 02 03 04 05 06 07 08

09 10 11 12 13 14 15 16

17 18 19 20 21 22 23 24

25 26 27 28 29 30 31 32

33 34 35 36 37 38 39 40

41 42 43 44 45 46 47 48

49 50 51 52 53 54 55 56

57 58 59 60 61 62 63 64

经过IP置换之后形成新的明文序列:(以下b均省略)

58 50 42 34 26 18 10 02

60 52 44 36 28 20 12 04

62 54 46 38 30 22 14 06

64 56 48 40 32 24 16 08

57 49 41 33 25 17 09 01

59 51 43 35 27 19 11 03

61 53 45 37 29 21 13 05

63 55 47 39 31 23 15 07

关于IP置换的具体过程网上的解释版本真的是很多,但是这并不妨碍我们的DES加密过程,因为将明文IP置换的过程就是一次遍历明文按索引的过程,我们只需要开出64*sizeof(char)的空间就可以完成初始的IP置换过程。易知在加密过程结束之中我们需要一次IP置换的逆置换(对于矩阵PAA^(-1)=P):

40  08  48  16  56  24  64  32  39  07  47  15  55  23  63  31  38  06  46  14  54  22  62  30  37  05  45  13  53  21  61  29  36  04  44  12  52  20  60  28  35  03  43  11  51  19  59  27  34  02  42  10  50  18  58  26  33  01  41  09  49  17  57  25

2.子密钥的生成过程

我们最先得到的所谓子密钥是64bit的,但是其中真正能够使用到的部分是48位的子密钥,其中经过了如下一次变换:

(PC-1置换的对应下标矩阵,首先去掉了每行的第8位奇偶校验位,然后进行置换)

57 49 41 33 25 17 09

01 58 50 42 34 26 18

10 02 59 51 43 35 27

19 11 03 60 52 44 36

-----------------------

63 55 47 39 31 23 15

07 62 54 46 38 30 22

14 06 61 53 45 37 29

21 13 05 28 20 12 04

经过了PC-1置换之后将得到的部分分为前28bit和后28bit分别为C0,D0

然后将C0,D0分别循环移位一位或者两位,具体的位数由下面这个数列决定

1  1  2  2  2  2  2  2  1  2  2  2  2  2  2  1

在DES的十六次迭代过程中,子密钥的生成过程严格按照上述顺序进行,如果要将每次循环移位后得到的数据使用到轮函数中作为参数的话,我们需要另一个压缩置换矩阵PC-2下标矩阵如下:

14 17 11 24 01 05

03 28 15 06 21 10

23 19 12 04 26 08

16 07 27 20 13 02

41 52 31 37 47 55

30 40 51 45 33 48

44 49 39 56 34 53

46 42 50 36 29 32

进行PC-2压缩置换之后我们得到的是48位的子密钥,至于怎么用进轮函数之中,下文会有具体介绍。总而言之子密钥的不断迭代生成过程可以用如下图表表示:

3.关于轮函数F(Rx,Kx)内部

首先轮函数接受的参数有两个一个是待加密的32bit串,另一个是48位的当前迭代轮生成的子密钥,运算过程如下:

(1)膨胀过程,将32bit的待加密串膨胀为48bit串,这一步也被叫做扩展置换,扩展置换的实质是把32bit串的某些位进行重复出现从而实现扩展,扩展下标表如下所示:

32 01 02 03 04 05

04 05 06 07 08 09

08 09 10 11 12 13

12 13 14 15 16 17

16 17 18 19 20 21

20 21 22 23 24 25

24 25 26 27 28 29

28 29 30 31 32 01

这一过程也被称为“E盒”。之后将通过E盒得到的膨胀后的串和48位的子密钥进行抑或运算/半加运算,得到一个新48bit串

(2)S盒,这一步也是最关键的一步,因为这一步所进行的过程是完全非线性的,也是加密过程中的核心部分。将最新得到的48bit串按顺序分为8个6bit的串,每一个6bit通过一个对应的S盒产生一个4位的输出。具体的过程是这样的,从6bit串中取第一位和第六位合并合起来作为S盒的行坐标,剩下的四位作为列坐标,例如010111串的第一位是0第六位是1,那么行坐标就是01B列坐标就是1011B即0xB,S盒的每一对坐标都可以得到其中的4位数据如下图所示:

最后将从8个S盒得到的输出结果按顺序链接起来得到一个新的32bit串,再经过一个P盒变换产生一个新的32bit串,P盒变换和E盒变换的过程是相似的,下标矩阵如下:

16 07 20 21

29 12 28 17

01 15 23 26

05 18 31 10

02 08 24 14

32 27 03 09

19 13 30 06

22 11 04 25

这样的数据从P盒出来就是完成了轮函数的整个过程拉,出来的结果于另半部分合并后再经过16次循环后IP逆置换就得到了密文,下面是我自己绘制的程序框架:

DES算法非常复杂,但是加密程度也非常高,严格遵循了雪崩效应 ,使密钥中一位的改动会导致子密钥的牵连改变从而完成混淆扩散的目的。

#################################

Problem1:证明DES算法的加密过程是解密过程的逆运算。

Ans:

DES算法遵守Feistel密码结构,因此有

Ri+1=Li

Li+1=Li⊕F(Ri,Ki)

解密过程中将Ri+1,Li+1代入上述式得(解密左右顺序是反的):

Li+1=Ri

Li+1⊕F(Ri,Ki)=Li⊕F(Ri,Ki)⊕F(Li+1,Ki)=Li⊕F(Ri,Ki)⊕F(Ri,Ki)=Li

因此代入后左右两边得到的结果是加密过程之中的上一轮的左右部分。

时间: 2025-01-04 07:53:14

<密码学入门>关于DES加密算法解密算法及相关问题的相关文章

DES加解密算法Qt实现

算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为bengold1979的网友表示感谢!本文是对DES算法代码一文代码的具体描述.该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 图片及部分解析来自 http://zh.wikipedia.org/wiki/%E8%B3%87%E6%96%99%E5%8A%A0%E5%AF%86%E6%A8%9

DES加密解密算法C语言代码实现

代码: 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 /*------------------------ 5 定义枚举型全局变量 6 ------------------------*/ 7 typedef enum 8 { 9 false = 0, 10 true = 1 11 } bool; 12 13 // 十六轮子密钥 14 static bool SubKey[16][48]=

DES加密解密算法

DES加密解密算法 // 仿射变换加解密.cpp : 定义控制台应用程序的入口点. // #include <stdio.h> #include <conio.h> static char key[10], key_a[5], code[8], key_b[5], temp[10], key_aa[8], key_bb[8], l[4], r[4], l_a[4], r_a[4], V[8] = { 0, 1, 0, 1, 0, 1, 0, 1 }, b[8]; char Code

java 实现 DES加密 解密算法

DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种:加密或解密.  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果:如 Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果.在通信网络的两端,双方约定一致

javascript DES加密解密算法

原文:javascript DES加密解密算法 源代码下载地址:http://www.zuidaima.com/share/1550463672044544.htm javascript DES加密解密算法,java通过ScriptEngineManager调用的例子. 源码截图:

用JAVA实现的DES加密解密算法

package Encrypt; import java.security.*; import javax.crypto.*; import sun.misc.*; /** * 使用DES加密与解密,可对byte[],String类型进行加密与解密 * 密文可使用String,byte[]存储. * 方法: * void getKey(String strKey)从strKey的字条生成一个Key * String getEncString(String strMing)对strMing进行加密

JavaScript与C#互通的DES加解密算法

原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DES解密算法将其解密,得到原始数据,以起到一定的保密作用.但基于算法本身和密钥保密程度方面的考虑,使用本算法加密后的数据,其保密程度不是很高,故请酌情使用. 声明:本文中的JavaScript版的DES加解密算法来自于互联网,但为了方便于转化成C#版本的代码,本人对其进行了细微调整. JavaScri

DES加解密算法的简单实现

前几天刚写完一个简单的DES算法的实验,拿来作为第一次发到博客的随笔,填充一下空空如也的博客,献丑了 因为主要目的是Easy-To-Understand,再现一个直观的DES加解密的过程,所以很浪费地每一个数据位都用一个short整型存储,用来理ying解fu过zuo程ye就好(虽说DES这种对称加密算法十多年前就已经被淘汰了,现在一般建议用AES或者DES3 “1973 年,美国国家标准局(NBS)开始征集一种标准的数据加密标准算法(DES),以用于非机密性政府机构.商业部门和民间的对非机密的

android -------- DES加密解密算法

DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中使用,随后该算法在国际上广泛流传开来.需要注意的是,在某些文献中,作为算法的DES称为数据加密算法(Data Encryption Algorithm,DEA),已与作为标准的DES区分开来. DES加密介绍DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法.DES加密算法