密码学基础——DES算法
前面的密码学基础——密码学文章中介绍了密码学相关的概念,其中简要地对称密码体制(也叫单钥密码体制、秘密密钥体制)进行了解释,我们可以知道单钥体制的加密密钥和解密密钥相同,单钥密码分为流密码和分组密码。
- 流密码(或序列密码,Stream Cipher):对明文消息按字符(如二元数字)逐位地进行加密。
- 分组密码(Block Cipher):将明文消息分组(含有多个字符),逐组地进行加密。
那么本文要介绍的DES算法属于分组密码。

一、基础知识
在介绍DES算法之前,我们需要知道几个概念:
1.代换
2.扩散和混淆
3.Feistel加密结构
1.代换
在前一篇介绍密码学基础——古典密码学的文章已经初步介绍了代换和置换的概念:
代换(替代):将明文中的每个字符替换为另一个字符,形成密文。
置换(换位):不改变明文中的字符,而是通过重新排列字符的位置来形成密文。
在 DES 中,代换主要通过 S 盒(Substitution Box)来实现。
2.扩散和混淆
(1)扩散
定义:扩散是指将明文的统计特性散布到密文中去,使得明文的每一位影响密文中的许多位,从而使密文的统计特性与明文的统计特性无关。实现方式是使得密文中每一位由明文中多位产生。
实现方式:在 DES 中,通过多次迭代的置换和异或操作来实现扩散。例如,在每一轮迭代中,数据会经过置换操作,将不同位置的比特进行交换,使得明文的影响逐渐扩散到整个密文。
(2)混淆
定义:混淆是指将密钥和明文之间的关系变得复杂,使得从密文和密钥中难以推出明文的统计特性。
实现方式:DES 通过 S 盒的非线性代换以及密钥与数据的混合操作来实现混淆。S 盒的非线性特性使得输入和输出之间的关系非常复杂,难以通过分析输出得到输入的信息。同时,密钥与数据的异或操作也增加了密钥和明文之间的混淆程度。
3.Feistel 加密结构
Feistel 结构是一种分组密码的设计结构,由 Horst Feistel 提出。DES 采用了 Feistel 结构。
(1)结构原理
加密算法
加密算法的输入是分组长为2w的明文和一个密钥K。将长度为2w位的明文分组分成左右两个w位的子块,分别记为L0和R0,在进行完n轮迭代后,左右两半再合并到一起以产生密文分组。
在进行第i轮迭代时,其计算方式为:
Li=Ri−1,
Ri=Li−1⊕F(Ri−1,Ki)
其中F是轮函数,Ki是第i轮的子密钥。一般,各轮子密钥彼此不同而且与K也不同。经过多轮迭代后,再将最后一轮得到的左右子块进行交换,得到密文。

Feistel网络中每轮结构都相同,每轮中右半数据被作用于轮函数F后,再与左半数据进行异或运算,这一过程就是上面介绍的代换。
每轮轮函数的结构都相同,但以不同的子密钥K作为参数。代换过程完成后,再交换左、右两半数据,这一过程称为置换。
解密算法
解密算法每轮的左右两半用LEi 和 REi表示。

(2)轮函数F
轮函数F是 Feistel 结构的核心组件,它通常包含了代换、置换、密钥混合等操作。通过这些操作,对输入的数据进行非线性变换,从而实现混淆和扩散的效果。不同的分组密码算法在轮函数的具体设计上会有所不同,但目的都是为了增加密码的安全性。
(3)密钥生成与使用
在 Feistel 结构中,密钥通常会被扩展成多个子密钥,分别用于每一轮的迭代运算。密钥扩展算法的设计需要保证子密钥的安全性和独立性,以防止攻击者通过分析子密钥来破解密码。例如,在 DES 算法中,56 位的密钥会被扩展成 16 个 48 位的子密钥,用于 16 轮的迭代。
二、DES加密算法
数据加密标准(Data Encryption Standard,DES)是IBM公司于1970年研制的DES (Data Encryption Standard)算法。该算法每隔五年由美国国家保密局(NSA—National Security Agency)作出评估,并重新批准它是否继续作为联邦加密标准。最后一次评估是在1994年1月,美国已决定1998年12月以后将不再使用DES。
算法概述
明文分组长度为64比特,密钥长度为56比特,生成 64 位的密文分组。16轮迭代
如下图为DES加密算法框图,输入64bit明文数据,64bit密钥,其中8 位用于奇偶校验,实际有效密钥长度为 56 位。将64bit明文数据经过初始置换IP,再经过16轮迭代,每轮中都有置换和代换运算,第16轮变换的输出分为左右两半,并被交换次序。最后再经过一个逆初始置换IP-1(为IP的逆)从而产生64比特的密文。
除初始置换IP和逆初始置换IP-1外,DES的结构和前面的的Feistel密码结构完全相同。

加密过程
1.初始置换(IP)
将 64 位的明文按照特定的置换表进行位置置换,得到初始置换后的结果。
DES的置换表如下:


2.轮函数(Feistel 结构)
DES 的轮函数采用 Feistel 结构,如下图为DES加密算法的轮结构。
先看左侧将 64 bit的中间数据分为左右两个 32 bit的子块,记为记为L和R。在第i轮迭代时:
Li=Ri−1,
Ri=Li−1⊕F(Ri−1,Ki)
轮密钥 为48比特。

轮函数F的具体操作包括:
- 将轮输入的右半部分R进行扩展置换(E表),从 32 位扩展到 48 位;
- 然后与 48 位的子密钥K进行异或运算;
- 接着将结果通过 8 个 S 盒进行代换,将 48 位数据压缩回 32 位;
- 最后进行 P 盒置换。

F 中的代换由8个S盒组成,每个S盒的输入长为6比特、输出长为4比特,其变换关系如下表所示,每个S盒给出了4个代换(由一个表的4行给出)



3.密钥生成
首先,将 64 位的密钥(其中包含 8 位奇偶校验位)经过置换选择 1(PC - 1),得到 56 位的密钥。

然后,将这 56 位密钥分为两部分,每部分 28 位,进行循环左移操作,移位的位数根据轮数而定。
(c)左循环移位位数

最后,经过置换选择 2(PC - 2),从 56 位密钥中选出 48 位作为每轮的子密钥,共生成 16 个子密钥,用于 16 轮的加密运算。
解密过程
DES 的解密过程与加密过程基本相同,只是子密钥的使用顺序相反。首先对密文进行初始置换,然后按照逆序使用 16 个子密钥进行 16 轮的轮函数运算,最后进行逆初始置换得到明文。
DES系统的保密性主要取决于什么?
密钥的安全性。穷举法破解
安全性
DES的56位密钥可能太小
DES的迭代次数可能太少(16次恰巧能抵抗差分分析)
相关文章:
密码学基础——DES算法
前面的密码学基础——密码学文章中介绍了密码学相关的概念,其中简要地对称密码体制(也叫单钥密码体制、秘密密钥体制)进行了解释,我们可以知道单钥体制的加密密钥和解密密钥相同,单钥密码分为流密码和分组密码。 流密码࿰…...
在 Linux 终端中轻松设置 Chromium 的 User-Agent:模拟手机模式与自定义浏览体验
在 Linux 系统中,通过终端灵活控制 Chromium 的行为可以大幅提升工作效率。本文将详细介绍如何通过命令行参数和环境变量自定义 Chromium 的 User-Agent,并结合手机模式模拟,实现更灵活的浏览体验。 为什么需要自定义 User-Agent?…...
ChatGPT 4:引领 AI 创作新时代
文章目录 前言一、ChatGPT 4 的技术革新二、AI 文案创作:精准生成与个性化定制三、AI 绘画艺术:从文字到图像的神奇转化四、AI 视频制作:自动化剪辑与创意实现五、知识库与 ChatGPT 4 的深度融合六、全新的变革和机遇七、相关书籍推荐《ChatG…...
http页面的加载过程
HTTP/2 核心概念 1.1 流(Stream) • 定义:HTTP/2 连接中的逻辑通道,用于传输数据,每个流有唯一标识符(Stream ID)。 • 特点: ◦ 支持多路复用(多个流并行传输&#…...
MySQL【8.0.41版】安装详细教程--无需手动配置环境
一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统,由瑞典公司 MySQL AB 开发,现属于 Oracle 旗下。它基于 SQL(结构化查询语言)进行数据管理,支持多用户、多线程操作,广泛应用于 Web 应用、…...
鸿蒙ArkTS实战:从零打造智能表达式计算器(附状态管理+路由传参核心实现)
还在为组件状态混乱、页面跳转丢参数而头疼? 这篇博客将揭秘如何用鸿蒙ArkTS打造一个漂亮美观的智能计算器: ✅ 输入完整表达式,秒出结果——字符串切割简单计算 ✅ 状态管理黑科技——Provide/Consume 实现跨组件实时响应 ✅ 路由传参实战—…...
【58】编程技巧:单片机编程命名规范
【58】编程技巧:单片机编程命名规范 引言 在大型嵌入式项目开发中,变量和常量的命名混乱会导致代码难以维护。本文系统阐述变量、常量、指针、结构体等命名规范,通过统一规则提升代码可读性与协作效率。目标是帮助开发者建立清晰的命名习惯&…...
Windows 部署项目 apache + mod_wsgi,nginx + waitress
文章目录 1、apache mod_wsgi,nginx waitress两种部署方式的区别2、以nginx waitress为例 有些项目必须部署在windows上,有IIS wfastcgi、apache mod_wsgi,nginx waitress部署方式 1、apache mod_wsgi,nginx waitress两种…...
车辆视频检测器linux版对于密码中包含敏感字符的处理方法
由于密码中含有敏感字符,导致前端页面异常,图标变灰,坐标拾取打不开图像等,主要原因是:密码比较前后不一致,左边是Abc_110,右边是:Abc_110%2B,对于此问题,特别…...
Java服务端开发基石:深入理解Spring IoC与依赖注入 (DI)
今天,我们从现代Java开发,尤其是企业级应用中,几乎无处不在的Spring框架的核心概念开始:控制反转(Inversion of Control, IoC) 与 依赖注入(Dependency Injection, DI)。理解它们&am…...
【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例
今天田辛老师和小伙伴探讨了一个有趣的多义词问题, 在人工智能技术日新月异的今天,大语言模型(LLM)对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的? 比如:当用户提到"…...
贪心算法(17)(java)可被三整除的最大整数和
给你一个整数数组 nums,请你找出并返回能被三整除的元素 最大和。 示例 1: 输入:nums [3,6,5,1,8] 输出:18 解释:选出数字 3, 6, 1 和 8,它们的和是 18(可被 3 整除的最大和)。 …...
qq邮箱群发程序
1.界面设计 1.1 环境配置 在外部工具位置进行配置 1.2 UI界面设计 1.2.1 进入QT的UI设计界面 在pycharm中按顺序点击,进入UI编辑界面: 点击第三步后进入QT的UI设计界面,通过点击按钮进行界面设计,设计后进行保存到当前Pycharm…...
K8S学习之基础七十九:关闭istio功能
关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间,pod都会开启istio功能 反之,如果要开启istio,在对应命名空间打上该标签即可...
上门预约洗鞋店小程序都具备哪些功能?
现在大家对洗鞋子的清洗条件越来越高,在家里不想去,那就要拿去洗鞋店去洗。如果有的客户没时间去洗鞋店,这个时候,有个洗鞋店小程序就可以进行上门取件,帮助没时间的客户去取需要清洗的鞋子,这样岂不是既帮…...
在Ubuntu 22.04上配置【C/C++编译环境】
在Ubuntu 22.04上配置C/C编译环境 如果你想在Ubuntu 22.04上编译和运行C或C程序,首先需要安装一个合适的编译器和相关工具。本文将为你提供详细的安装建议和操作步骤,帮助你快速搭建开发环境。 准备工作 在开始之前,确保你的系统可以通过终…...
蓝桥杯——走迷宫(Java-BFS)
这是一个经典的BFS算法 1. BFS算法保证最短路径 核心机制:广度优先搜索按层遍历所有可能的路径,首次到达终点的路径长度即为最短步数。这是BFS的核心优势。队列的作用:通过队列按先进先出的顺序处理节点,确保每一步探索的都是当…...
Spring MVC与Spring Boot文件上传配置差异对比及文件上传关键类详细说明与对比
一、Spring MVC与Spring Boot文件上传配置差异对比 1. 配置方式差异 框架配置方式依赖管理自动配置Spring MVC需手动配置MultipartResolver(如StandardServletMultipartResolver)需自行引入commons-fileupload等依赖无,默认不启用文件上传支…...
LLM 的model.generate() 参数说明
LLM 的model.generate() 参数说明 目录 LLM 的model.generate() 参数说明生成长度控制参数采样策略参数重复惩罚参数束搜索参数其他参数model.generate() 方法是 Hugging Face Transformers 库中用于文本生成的核心方法,它有众多参数可用于控制生成过程 生成长度控制参数 min…...
下载firefox.tar.xz后如何将其加入到Gnome启动器
起因:近期(2025-04-07)发现firefox公布了130.0 版本,可以对pdf文档进行签名了,想试一下,所以卸载了我的Debian12上的firefox-esr,直接下载了新版本的tar.xz 包。 经过一番摸索,实现了将其加入Gn…...
Flutter性能优化终极指南:从JIT到AOT的深度调优
一、Impeller渲染引擎调优策略 1.1 JIT预热智能预编译 // 配置Impeller预编译策略 void configureImpeller() {ImpellerEngine.precacheShaders(shaders: [lib/shaders/skinned_mesh.vert,lib/shaders/particle_system.frag],warmupFrames: 30, // 首屏渲染前预编译帧数cach…...
加密≠安全:文件夹密码遗忘背后的数据丢失风险与应对
在数字化时代,保护个人隐私和数据安全变得尤为重要。许多人选择对重要文件夹进行加密,以防止未经授权的访问。然而,一个常见且令人头疼的问题也随之而来——文件夹加密密码遗忘。当你突然发现自己无法访问那些加密的文件夹时,那种…...
实习技能记录【2】-----LVGL[基本概念]
LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象,所有的可见 UI 元素最终都会添加到某个屏幕上(通常是活动屏幕)。 功能: 作为其他 UI 元素的父对象。 可以拥有自己的背景颜色、背景图片等样…...
【操作系统(Linux)】——通过案例学习父子进程的线程异步性
本篇旨在通过几个案例来学习父子进程的线程异步性 一、父进程与子进程 我们将要做的: 创建父子进程,观察父子进程执行的顺序,了解进程执行的异步行为 源代码: #include <stdio.h> #include <sys/types.h> #include…...
Go 语言范围 (Range)
Go 语言范围 (Range) Go 语言是一种静态强类型、编译型、并发型编程语言,由 Google 开发。它的简洁性和高效性使其成为众多开发者的首选。在 Go 语言中,range 是一个非常有用的关键字,用于遍历数组、切片、字符串以及通道(channe…...
【开源宝藏】30天学会CSS - DAY12 第十二课 从左向右填充的文字标题动画
用伪元素搞定文字填充动效:一行 JS 不写,效果炸裂 你是否曾经在设计页面标题时,觉得纯文字太寡淡?或者想做一个有动感的文字特效,但又不想引入 JS 甚至 SVG? 在这篇文章中,我们将通过 一段不到…...
nginx或tengine服务器,配置HTTPS下使用WebSocket的线上环境实践!
问题描述: HTTPS 下发起WS连接,连接失败,Chrom 浏览器报错。 socket.js:19 Mixed Content: The page at https://app.XXX.com was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ws://172.16.10.80:903…...
WSA(Windows 安卓子系统)过检测教程
windows安卓子系统WSA的root和magisk的安装教程 安卓子系统WSLWSA的rootmagisk安装 WSA(Windows 安卓子系统)过检测的方法与思路 一、引言 Windows 安卓子系统(WSA)为 Windows 用户提供了在电脑上运行安卓应用的便利。然而&…...
蓝桥杯 B3620 x 进制转 10 进制
题目描述 给一个小整数 x 和一个 x 进制的数 S。将 S 转为 10 进制数。对于超过十进制的数码,用 A,B,… 表示。 输入格式 第一行一个整数 x; 第二行一个字符串 S。 输出格式 输出仅包含一个整数,表示答案。 输入输出样例 …...
【Oracle篇】跨字符集迁移:基于数据泵的ZHS16GBK转AL32UTF8全流程迁移
💫《博主主页》:奈斯DB-CSDN博客 🔥《擅长领域》:擅长阿里云AnalyticDB for MySQL(分布式数据仓库)、Oracle、MySQL、Linux、prometheus监控;并对SQLserver、NoSQL(MongoDB)有了解 💖如果觉得文章对你有所帮…...
