题外话:个人觉得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

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

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

  1. DES加解密算法Qt实现

      算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...

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

    代码: #include<stdio.h> #include<string.h> #include<stdlib.h> /*-------------------- ...

  3. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

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

    原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DE ...

  5. C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密

    DES加密算法 des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密 ...

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

    DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...

  7. Des加密解密算法java实现

    package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...

  8. DES加密解密算法C++实现

    DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心.蒟蒻并不想说自己用了多久才把代码写好的. 代码: 我真的太难了QAQ #include<iostream> using ...

  9. 实现与JS相同的Des加解密算法【转】

    Java代码 import java.util.ArrayList; import java.util.List; /** * DES加密/解密 * * @Copyright Copyright (c ...

随机推荐

  1. 【音乐App】—— Vue-music 项目学习笔记:用户个人中心开发

    前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 歌曲列表 收藏歌曲 一.用 ...

  2. 2017.2.15 开涛shiro教程-第二十一章-授予身份与切换身份(二) controller

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 开涛shiro教程-第二十一章-授予身份与切换身份(二) 1.回顾 ...

  3. 2015年度新增开源软件排名TOP100

    2015年度新增开源软件排名TOP100 本榜单包含2015年开源中国新收录的软件中,根据软件本身的关注度.活跃程度进行排名前100名的软件.从这份榜单中或许可以了解到最新业界的趋势. 1.Switc ...

  4. Node.js学习入门手册

    Node.js 安装 1.下载http://nodejs.org/dist/v0.12.1/node-v0.12.1-x86.msi并完成安装 2.下载https://www.python.org/f ...

  5. Kali Linux 2.0安装光盘分享

    Kali Linux 2.0安装光盘分享 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I ...

  6. Iowait的成因、对系统影响及对策

    什么是iowait?顾名思义,就是系统因为io导致的进程wait.再深一点讲就是:这时候系统在做io,导致没有进程在干活,cpu在执行idle进程空转,所以说iowait的产生要满足两个条件,一是进程 ...

  7. C语言八进制和十六进制数

    一 赋值 int dex = 100;// 默认十进制 int oct = 0144;// 八进制,以0開始 int hex = 0x64;// 十六进制,以0x開始 二 输出 void show(i ...

  8. python 中给文件加锁——fcntl模块

    如果没有fcntl模块则用 sudo pip install fcntl安装 模块简单说明: 打开文件,不存在则创建之 f = open('./test','w') fcntl.flock(f,fcn ...

  9. 一、Silverlight中使用MVVM(一)——基础

    如果你不知道MVVM模式,我建议你先了解一下MVVM模式,至少要知道实现该模式的意图是什么. 那么我主要通过我认为是已经算是比较简单的例子进行讲解这个模式,当然后面我们会在这个例子的基础上一步一步的进 ...

  10. JavaScript中setInterval用法

    setInterval动作的作用是在播放动画的时,每隔一定时间就调用函数,方法或对象.可以使用本动作更新来自数据库的变量或更新时间显示. setInterval动作的语法格式如下:setInterva ...