<密码学入门>关于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密码结构就是:
(二)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加密算法解密算法相关问题的更多相关文章
- DES加解密算法Qt实现
算法解密qt加密table64bit [声明] (1) 本文源码 大部分源码来自:DES算法代码.在此基础上,利用Qt编程进行了改写,实现了DES加解密算法,并添加了文件加解密功能.在此对署名为b ...
- DES加密解密算法C语言代码实现
代码: #include<stdio.h> #include<string.h> #include<stdlib.h> /*-------------------- ...
- java 实现 DES加密 解密算法
DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...
- JavaScript与C#互通的DES加解密算法
原文地址:传送门 本文提供了一个能使JavaScript与C#互通的DES加解密算法的实现,在前台页面中用JavaScript版本的DES算法将数据加密之后,传到服务器端,在服务器端可用C#版本的DE ...
- C#和PHP加密结果一致的DES加密解密算法。php实现和c#一致的DES加密解密
DES加密算法 des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密 ...
- android -------- DES加密解密算法
DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信 ...
- Des加密解密算法java实现
package tech.fullink.eaglehorn.utils; import javax.crypto.Cipher; import javax.crypto.SecretKey; imp ...
- DES加密解密算法C++实现
DES加密算法并不难,是由一些简单的变换得来的,难的是要有足够的耐心.蒟蒻并不想说自己用了多久才把代码写好的. 代码: 我真的太难了QAQ #include<iostream> using ...
- 实现与JS相同的Des加解密算法【转】
Java代码 import java.util.ArrayList; import java.util.List; /** * DES加密/解密 * * @Copyright Copyright (c ...
随机推荐
- oracle软件安装完毕之后,如何创建数据库
oracle软件安装完毕之后,如何创建数据库 学习了:https://zhidao.baidu.com/question/1800966379896476147.html 使用了Database Co ...
- PHP之面向对象学习
1.类 Class lio{ Public Protect Private Function __constructor(){} } 2.类的实例化 <? php class lio{ //定义 ...
- 抽象类(abstract)和接口(interface)的区别
1 抽象类是不能被实例化的类,只能作为由其他类继承的基类: 接口则定义了实现某种服务的一般规范(Objective-C中将接口称为“协议”(protocol)),声明了必需的函数和常量,但不指定 ...
- Sahi ---实现 Web 自动化测试
参考网址:http://sahipro.com/docs/sahi-apis/index.html Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具.Sa ...
- XXE攻击
1.背景 现在很多应用都存在XXE(XML External Entity attack)漏洞,就是xml外部实体攻击,比如facebook,很多XML的解析器默认是含有XXE漏洞的. 2.xml的定 ...
- 一文了解@Conditional注解说明和使用
@Conditional:Spring4.0 介绍了一个新的注解@Conditional,它的逻辑语义可以作为"If-then-else-"来对bean的注册起作用. @Con ...
- erlang中的图片下载
问题如题,这是在一个群里问的一个的问题.其实就是http的Server的上传下载的功能. ibrowse:start().ibrowse:send_req("http://img1.gti ...
- PHP服务端如何通过程序将图上传到指定的图片服务器与图片服务器的优化方案
一:PHP服务端如何通过程序将图上传到指定的图片服务器与图片服务器的优化方案 (1) php服务器把图片处理成缩率图或指定大小的图片在通过PHP程序代码 操作FTP 上传到图片服务器. 二:图片服务器 ...
- Redis源代码分析(十七)--- multi事务操作
redis作为一非关系型数据库,居然相同拥有与RDBMS的事务操作,不免让我认为比較吃惊.在redis就专门有文件就是运行事务的相关操作的.也能够让我们领略一下.在Redis的代码中是怎样实现事务操作 ...
- iOSPOI检索详细总结
iOS百度地图路径规划和POI检索详细总结 路径规划.png 百度地图的使用 百度地图API的导入网上说了许多坑,不过我遇到的比较少,这里就放两个比较常见的吧.坑一: 奥联WIFI_xcodeproj ...