当前位置: 首页 > news >正文

通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码

文章目录

    • 1、什么是DES
    • 2、DES的基本概念
    • 3、DES的加密流程
    • 4、DES算法步骤详解
      • 4.1 初始置换(Initial Permutation,IP置换)
      • 4.2 加密轮次
      • 4.3 F轮函数
        • 4.3.1 拓展R到48位
        • 4.3.2 子密钥K的生成
        • 4.3.3 当前轮次的子密钥与拓展的48位R进行异或运算
        • 4.3.4 S盒替换(Substitution Box substitution)
        • 4.3.5 P盒替换
      • 4.4 逆置换(Inverse Permutation)
    • 5、DES的优缺点
    • 6、DES的攻击方法
    • 7、3DES(Triple DES)
    • 8、Python实现DES

1、什么是DES

DES(Data Encryption Standard)是一种对称加密算法。它是在20世纪70年代初期由IBM研发的。它的设计目标是提供高度的数据安全性和性能,并且能够在各种硬件和软件平台上实现。

2、DES的基本概念

DES使用56位的密钥和64位的明文块进行加密。DES算法的分组大小是64位,因此,如果需要加密的明文长度不足64位,需要进行填充;如果明文长度超过64位,则需要使用分组模式进行分组加密
虽然DES算法的分组大小是64位,但是由于DES算法的密钥长度只有56位,因此DES算法存在着弱点,容易受到暴力破解和差分攻击等攻击手段的威胁。因此,在实际应用中,DES算法已经不再被广泛使用,而被更加安全的算法所取代,如AES算法等。
尽管DES已经被取代,但它在密码学的历史上仍然具有重要意义。通过DES可以帮助我们了解对称密钥加密算法的基本概念和运作原理。

3、DES的加密流程

当输入了一条64位的数据之后,DES将通过以下步骤进行加密。在第4部分中,我们对每个流程进行详解。
在这里插入图片描述

  • 1、初始置换(IP置换):将输入的64位明文块进行置换和重新排列,生成新的64位数据块。

  • 2、加密轮次:DES加密算法共有16个轮次,每个轮次都包括四个步骤:

    • a. 将64位数据块分为左右两个32位块。

    • b. 右侧32位块作为输入,经过扩展、异或、置换等操作生成一个48位的数据块。这个48位的数据块被称为“轮密钥”,它是根据加密算法的主密钥生成的子密钥。

    • c. 将左侧32位块和轮密钥进行异或运算,结果作为新的右侧32位块。

    • d. 将右侧32位块与原来的左侧32位块进行连接,生成一个新的64位数据块,作为下一轮的输入。

  • 3 末置换(FP置换):在最后一个轮次完成后,将经过加密的数据块进行置换和重新排列,得到加密后的64位密文。

总的来说,DES加密的过程就是通过一系列置换、异或、扩展等运算,将明文分成若干个小块,然后根据主密钥生成一系列的轮密钥,利用轮密钥对每个小块进行加密,最终将加密结果重新组合成一个整体,得到密文。

4、DES算法步骤详解

4.1 初始置换(Initial Permutation,IP置换)

IP置换是将输入的64位明文块进行置换和重新排列,生成新的64位数据块。
目的:增加加密的混乱程度,使明文中的每一位都能够对后面的加密过程产生影响,提高加密强度。
我们将把64位的顺序按下表中规定的顺序放置,图中的数字是在64位明文中每个比特的索引位置。注意,在DES中,这个置放规则是固定的
在这里插入图片描述
即将原来位于第58个位置的数据放在第1个位置,原来位于第50个位置的元素放在第2个位置,第42个放在第3个,34->4以此类推…

初始置换的逆置换(Final Permutation,FP置换)是将加密后的数据块进行置换和重新排列,得到最终的加密结果,与初始置换相对应。

4.2 加密轮次

初始置换完成后,明文被划分成了相同长度(32位)的左右两部分,记作L0,R0。接下来就会进行16个轮次的加密了。
我们从单独一个轮次来看。首先把目光聚焦在R0这里。
在这里插入图片描述
右半部分R0会作为下一轮次的左半部分L1的输入。其次,R0会补位到48位和本轮次生成的48位K0(马上讲K0的生成)输入到F轮函数中去。F函数的输出结果为32位,结果F(R0,K0)会和L0进行异或运算作为下一轮次右半部分R1的输入。
以此类推,重复16轮运算。所以,上面描述的过程可以用以下公式表述。
在这里插入图片描述

4.3 F轮函数

我们讲到在每轮加密中,会将R和K输入到F中,接下来我们看看F函数中做了哪些处理。
在这里插入图片描述

4.3.1 拓展R到48位

将32位的R0右半部分进行扩展,得到一个48位的数据块。同样的,数据拓展也是根据一个固定的置换表。红框中就是我们要补位的数据。
在这里插入图片描述

由此可见,扩展过程的每一位都是根据上述的置换表从输入的32位数据块中提取出来的。原始数据的第32位被补充到了新增列的第一个,第5位被补充到了第二个新增列的第一个,以此类推…

4.3.2 子密钥K的生成

DES算法采用了每轮子密钥生成的方式来增加密钥的复杂性和安全性。每轮子密钥都是由主密钥(64位)通过密钥调度算法(Key Schedule Algorithm)生成的。DES算法的密钥调度算法可以将64位的主密钥分成16个子密钥,每个子密钥48位,用于每轮加密中与输入数据进行异或运算。
通过子密钥生成的流程图来看下整个过程。
在这里插入图片描述

  • 1、将64位主密钥经过置换选择1(Permuted Choice 1简写为PC-1)后输出了56位,将其分为左右两个28位的数据块,分别记为C0和D0。同上面我们讲过的置换规则一样,PC-1置换函数也是一个固定的置换表。 在这里插入图片描述
    从PC-1的置换表中可以看到,舍弃掉的8位数据是原始数据中每8位数据的最后一位,也就是我们所熟知的奇偶检验位。这8位被丢弃是因为它们对于密钥的安全性没有贡献,而且能够使DES算法的计算速度更快。

  • 2、对C0和D0进行循环左移操作。循环左移完成后生成C1和D1。因此,在16个轮次的计算当中会得到16个32位的数据块C1-C16和D1-D16。在DES中循环左移也有固定的规则

    对于i=1,2,…,16,对于Ci和Di,若i为1,2,9或16,则循环左移一位,否则循环左移两位。

  • 3、 对于C1,D1,将它们经过置换选择2(Permuted Choice 2 简写位PC-2)后,得到48位的子密钥K1,用于每轮加密中与输入数据进行异或运算。PC-2置换的输入是由PC-1置换生成的56位的密钥,而它的输出是48位的子密钥。PC-2置换将56位的密钥重新排列,丢弃了8位并选取了其中的48位作为子密钥。PC-2的置换规则如下:

1417112415
3281562110
2319124268
1672720132
415231374755
304051453348
444939563453
464250362932

即PC-2置换表的第一行表示选择了输入密钥中的第14、17、11、24、1和5位,并将它们作为输出子密钥的前6位。以此类推…

  • 4、至此,经过PC-2后的结果就是我们当前轮次的子密钥K1了。在整个DES加密过程中会生成16个48位子密钥K1-K16,分别用于DES算法中的16轮加密过程,从而保证每轮加密所使用的密钥都是不同的,增加了破解的难度。

4.3.3 当前轮次的子密钥与拓展的48位R进行异或运算

当前轮次的子密钥Ki与拓展的48位Ri进行异或运算。运算结果会作为接下来S盒替换的输入

4.3.4 S盒替换(Substitution Box substitution)

S盒替换(Substitution Box substitution)是一种在密码学中广泛使用的加密技术。它是将明文中的一组比特映射到密文中的一组比特的过程,用于增强密码的安全性。DES中S盒替换用于将上一轮异或运算的48位结果映射到32位输出中去。
在这里插入图片描述

同样的,S盒也是一种置换表。在DES的每一轮计算中S盒都是不一样的。这里我以第一轮计算中的S盒为例。从上图中我们看到,S盒内部有8个S块,记作S1-S8。每个S块都会接收6位字符作为输入并输出四位字符。这里我们以第一个S盒S1为例。他是一个4*16的置换表。

1441312151183106125907
0157414213110612119538
4114813621115129731050
1512824917511314100613

例如输入101010到S1中。S1会将这六位的第一位和第六位拿出来10作为S1的行,中间四位0101拿出来作为S1的列。我们转换成十进制,此时映射到这个S盒的位置就是(2,5)对应S盒的第3行第6列(索引都从0开始数)。
在这里插入图片描述
所以这个输入的结果是6,将6转化为二进制110,S盒的输出是4位,所以得S(101010)=0110

因此,可以看到S盒其实是一种非线性的加密技术,它能够抵御许多传统的密码分析攻击,如差分攻击和线性攻击。

4.3.5 P盒替换

在这里插入图片描述

P盒替换将S盒替换的32位输出作为输入,经过上述固定的替换表进行替换后即为最后F轮函数的结果。

该结果F(R0,K0)与L0进行异或运算得到下一轮的右半部分R1

4.4 逆置换(Inverse Permutation)

在这里插入图片描述
在经过16轮次计算后,DES会对最后的结果进行最后一次置换。即为最后的输出结果。

5、DES的优缺点

优点:

  • 安全性高:DES算法使用密钥进行加密和解密,相同的明文使用不同的密钥加密后得到的密文是不同的。密钥越长,加密的安全性就越高。
  • 算法简单:DES算法的加密和解密过程非简单,基于对称加密,使用相同的key进行加解密。
  • 适用广泛:DES算法是最早也是最广泛使用的加密算法之一,被广泛应用于电子商务、电子邮件、虚拟私人网络等领域,具有广泛的适用性和可移植性。

缺点:

  • 密钥长度较短:DES算法使用56位密钥,虽然在当时足够安全,但在当前计算机的处理能力下,已经不足以保证加密的安全性,易受到暴力破解攻击。
  • 无法抵抗差分密码分析攻击:DES算法无法抵抗差分密码分析攻击,这种攻击可以通过比较相同明文的密文,分析加密算法的行为并推断出密钥。
  • 比较慢:由于DES算法是一种分组密码算法,需要对64位的明文进行加密,加密速度比较慢,不适用于对大量数据进行实时加密和解密。

6、DES的攻击方法

由于DES从诞生距今已经很多年了,但是仍然有部分老旧的系统会使用DES进行加密。因为其密钥长度较短(仅56位)和已知的弱点,因此容易受到以下攻击。

  • 穷举攻击(Brute-Force Attack):由于DES算法的密钥长度较短,可能受到暴力破解攻击,攻击者可以通过穷举所有可能的密钥来尝试破解密文。尽管DES算法的加密速度比较慢,但现代计算机的计算能力很强,可以在合理时间内进行暴力破解攻击。

  • 差分密码分析攻击(Differential Cryptanalysis Attack):差分密码分析是一种比较高效的攻击方式,可以通过对明文和密文之间的差异进行分析,推导出密钥。对于DES算法,攻击者可以通过分析不同的输入和输出差异,以及密钥可能取值的概率,从而获得密钥。

  • 线性密码分析攻击(Linear Cryptanalysis Attack):线性密码分析是一种比较有效的攻击方式,可以通过线性近似计算找到密钥。对于DES算法,攻击者可以通过构造一些线性逼近,以及计算相应的概率,从而推导出密钥。

  • 工作密钥攻击(Known Plaintext Attack):在工作密钥攻击中,攻击者可以获得一些已知明文和相应的密文,然后利用这些信息来推导出密钥。对于DES算法,攻击者可以通过获得足够的已知明文和密文,来推导出密钥。

  • 生日攻击(Birthday Attack):生日攻击是一种利用概率学的攻击方式,可以在相对较短的时间内找到具有相同散列值的两个不同的输入。对于DES算法,攻击者可以使用生日攻击来找到两个不同的密钥,这些密钥都可以加密相同的明文。

7、3DES(Triple DES)

我们讲到了DES目前而言是不安全的。因此也诞生了3DES这样的算法来对DES进行加强。3DES顾名思义,就i是使用DES加密3次,使用3个密钥进行加解密。
在这里插入图片描述

为什么是3DES不是2DES
3DES使用了三个密钥,将DES算法的加密过程重复三次,从而大大增强了安全性。3DES的密钥长度为168位,远高于DES算法的56位密钥长度和2DES算法的112位密钥长度。2DES暴力破解的时间复杂度为O(257),仍然有很大的可能被暴力破解。
举个例子看下:
对于明文P,密文C, C由经过两次加密Ek1,Ek2得到K1,K2分别是第一二次加密的密钥。
在这里插入图片描述

  • 遍历P到第一次加密的K1,最多有256种可能。
  • 由于加解密是相同的key。所以我们同时还能对C进行暴力解密找key。同样有最多256种可能。
  • 当我们遍历能找到一个Ek1(P)=Dk2(C) 使用这个密钥去加解密不同的明文和加密结果(P’,C’)。
  • 如果能成功,那么此次暴力破解的时间复杂度为O(257)。因此依旧不够安全。

8、Python实现DES

由于篇幅过长,需要源码可以前往wechat公众号关注"一颗程序树",回复"DES"获取源码。

相关文章:

通俗易懂,十分钟读懂DES,详解DES加密算法原理,DES攻击手段以及3DES原理。Python DES实现源码

文章目录1、什么是DES2、DES的基本概念3、DES的加密流程4、DES算法步骤详解4.1 初始置换(Initial Permutation,IP置换)4.2 加密轮次4.3 F轮函数4.3.1 拓展R到48位4.3.2 子密钥K的生成4.3.3 当前轮次的子密钥与拓展的48位R进行异或运算4.3.4 S盒替换(Subs…...

为多态基类声明virtual析构函数

我们知道,有时会让一个基类指针指向用 new 运算符动态生成的派生类对象(类似接口的作用);同时,用 new 运算符动态生成的对象都是通过 delete 指向它的指针来释放的。如果一个基类指针指向用 new 运算符动态生成的派生类…...

啊哈 算法读书笔记 第 2 章 栈、队列、链表

第 2 章 栈、队列、链表 目录 第 2 章 栈、队列、链表 队列: 解密回文——栈 纸牌游戏: 链表 模拟链表 队列: 首先将第 1 个数删除,紧接着将第 2 个数放到这串数的末尾,再将第 3 个数删除并将第 4 个数放到这串…...

Git ---- IDEA 集成 Git

Git ---- IDEA 集成 Git1. 配置 Git 忽略文件2. 定位 Git 程序3. 初始化本地库4. 添加到暂存区5. 提交到本地库6. 切换版本7. 创建分支8. 切换分支9. 合并分支10. 解决冲突1. 配置 Git 忽略文件 1. Eclipse 特定文件 2. IDEA 特定文件 3. Maven 工程的 target 目录 问题1…...

【LeetCode 704】【Go】二分查找

二分查找题解 一、碎碎念 从本周开始,重新更新刷题记录了哈。 基于费曼学习法的原理,最好的输入是输出,所以与大家分享。 鉴于目前这个糟糕的市场环境,还是要练好自己的基本技术,万一那天就被迫 N 1了,你…...

【代码随想录训练营】【Day23】第六章|二叉树|669. 修剪二叉搜索树 |108.将有序数组转换为二叉搜索树|538.把二叉搜索树转换为累加树

修剪二叉搜索树 题目详细:LeetCode.669 做这道题之前建议先看视频讲解,没有想象中那么复杂:代码随想录—修剪二叉搜索树 由题可知,需要删除节点值不在区间内的节点,所以可以得到三种情况: 情况一&#…...

CV——day78 读论文:通过静态背景构建扩展低通道路边雷达的探测距离(目标是规避风险)

Extending the Detection Range for Low-Channel Roadside LiDAR by Static Background Construction 通过静态背景构建扩展低通道路边雷达的探测距离I. INTRODUCTIONII. RELATED WORKA. LiDAR-Based 3-D Vehicle and Road User DetectionB. LiDAR Data Background FilteringC.…...

【编程入门】应用市场(go语言版)

背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目,使…...

Linux(openEuler)没有界面连接互联网方法

前言: 系统版本openEuleropenEuler-22.03-LTS-x86_64-dvd 我们在安装linux之后,一般都是无界面的情况。大部分情况都是需要自己安装界面的,如果路由器的情况下直接插上网络就好了。下面就开始介绍两种方法进行linxu网络的连接。 注意: 小编是使用的第一…...

第一天 软考中级--嵌入式系统设计师考试复习教程开始了

第一天 嵌入式系统设计师考试复习教程 第二天 软考中级--嵌入式系统设计师考试考试大纲解析 目录...

分享 10 个高频 Python 面试题

Python 很容易学会,但很难掌握。你可以在几天内了解它的基本语法,但是要能够用 Python 开发出足够好的商业软件,多年的实践是必须的。因为,无论你使用哪种编程语言,你都必须对其复杂的内部机制有足够的了解&#xff0c…...

ThreadLocal原理、结构、源码解析

文章目录一、Thread简介1.什么是ThreadLocal2.为什么要是用ThreadLocal2.1Synchronized、Lock保证线程安全2.2ThreadLocal保证线程安全3.ThreadLocal和Synchronized的区别二、ThreadLocal原理1.Thread抽象内部结构2.ThreadLocal源码2.1Thread、ThreadLocal、ThreadLocalMap、En…...

分布式之PBFT算法

写在前面 在分布式之拜占庭问题 一文中我们分析了拜占庭问题,并一起看了支持拜占庭容错的口信消息性和签名消息性算法,但是这两种算法都有一个非常严重的问题,就是消息数量太多,通信的成本太大,消息数量复杂度为O(n ^…...

Linux 操作系统——查看/修改系统时区、时间、本地时间修改为UTC

文章目录1.背景描述2.知识储备3.解决步骤1. 查看当前时区2.修改设置Linux服务器时区3.复制相应的时区文件,替换系统时区文件;或者创建链接文件4. 查看和修改Linux的时间5. 硬件时间和系统时间的 相互同步1.背景描述 最近一个项目日期采用java8的LocalDa…...

CSS数据类型以及符号

css数据类型定义的是css属性中具有代表性的值&#xff0c;在规范的语法格式中&#xff0c;使用关键字外加一对 <和>表示&#xff0c;例如数值类型<number>、色值类型<color>等。 举个例子&#xff1a;background-image这个css属性语法结构如下&#xff1a; …...

LeetCode-54. 螺旋矩阵

题目来源 54. 螺旋矩阵 题目思路 while循环只遍历"环"&#xff0c;不成环就不遍历了 四个边界 上边界 top : 0下边界 bottom : matrix.length - 1左边界 left : 0右边界 right : matrix[0].length - 1 矩阵不一定是方阵 top < bottom && left < r…...

【Python入门第十八天】Python For 循环

Python For 循环 for 循环用于迭代序列&#xff08;即列表&#xff0c;元组&#xff0c;字典&#xff0c;集合或字符串&#xff09;。 这与其他编程语言中的 for 关键字不太相似&#xff0c;而是更像其他面向对象编程语言中的迭代器方法。 通过使用 for 循环&#xff0c;我们…...

Qt图片定时滚动播放器

目录参考结构PicturePlay.promain.cpppictureplay.hpictureplay.cpppictureplay.ui效果源码参考 Qt图片浏览器 QT制作一个图片播放器 Qt中自适应的labelpixmap充满窗口后&#xff0c;无法缩小只能放大 可以显示jpg、jpeg、png、bmp。可以从电脑上拖动图到窗口并显示出来或者打开…...

李宏毅2023春季机器学习课程

目录2021&2022课程重磅须知我维护的其他项目更新日志课程地址课程资料直链课程作业直链其他优质课程2021&2022课程 CSDN Github 重磅须知 为方便所有网课资料与优质电子书籍的实时更新维护&#xff0c;创建一个在线实时网盘文件夹&#xff1b;   网盘获取方式&#…...

计算机操作系统知识点汇总

计算机操作系统选择填空题&#xff0c;300知识点&#xff0c;包含操作系统概论、处理机管理、内存管理、设备管理、文件管理等&#xff0c;为大学生期末创造奇迹提供无限可能 1、填空题 1、操作系统是对计算机资源进行管理的软件 2、操作系统是提供了处理机管理、 存储器管理…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时&#xff0c;可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案&#xff1a; 1. 检查电源供电问题 问题原因&#xff1a;多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Python爬虫(二):爬虫完整流程

爬虫完整流程详解&#xff08;7大核心步骤实战技巧&#xff09; 一、爬虫完整工作流程 以下是爬虫开发的完整流程&#xff0c;我将结合具体技术点和实战经验展开说明&#xff1a; 1. 目标分析与前期准备 网站技术分析&#xff1a; 使用浏览器开发者工具&#xff08;F12&…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...