图解DES、3DES和AES加密算法

article/2025/9/16 17:13:25

文章目录

      • 一、DES
        • 1. 加密和解密
        • 2. DES的结构(Feistel网络)
      • 二、3DES
        • 1. 3DES加密
        • 2. 3DES解密
      • 三、AES
        • 1. AES最终候选算法和算法确定
        • 2. Rijndael
          • 2.1 什么是Rijndael
          • 2.2 Rijndael的加密和解密
        • 3. AES密钥生成
        • 4. AES算法流程图

一、DES

1. 加密和解密

DES是一种将64bit的明文加密成64bit的密文的对称加密算法。它的密钥长度是56bit。从规格上来讲,DES密钥长度是64bit,但是由于每隔7bit会设置一个用于校验检查的校验位,所以实质上密钥长度是56bit。64位的密钥都会被分成8个8位的块。其中,每个块的第7位都会被用作校验位,用于检验该块的其他7位中1的个数是否为奇数。如果不是奇数,那么校验位会被设置为1,否则为0。

这个校验位的目的是为了检查密钥的正确性和完整性,以确保在加密和解密过程中不会出现错误。如果密钥被篡改或者传输过程中发生了错误,那么校验位就会被检测出来,从而保证密钥的正确性和可靠性。

DES是以64bit的明文为一个单位来进行分组加密的,所以DES每次只能加密64bit的数据。如果需要加密很长的数据,就需要对DES加密进行迭代,而迭代的具体方式就称为模式ECBCBCCFBOFBCTR)。
DES加解密

2. DES的结构(Feistel网络)

DES的基本结构是由Horst Feistel设计的,因此也叫Feistel网络Feistel 结构 或者Feistel密码。很多密码算法中都用到这种结构。
在Feistel网络中,加密的各个步骤称之为,整个加密过程就是进行若干次轮的循环。DES 是一种16轮循环的Feistel网络。
Fesitel网络中的一轮
上图表示Fesitel网络中的一轮,根据上图讲解一下Fesitel网络的具体结构。

  1. 上面两个方框表示本轮要加密的64bit 明文,输入的数据会被分为左右两个部分分别处理。
  2. 下面两个方框表示本轮输出的左侧(密文)和右侧(明文
  3. 中间的子密钥指的是本轮加密所使用的密钥,在Fesitel网络中,每一轮都需要不同的子密钥。由于子密钥只是在一轮中使用,所以它是局部密钥,因此才被称为子密钥
  4. 轮函数 的作用是根据 右侧子密钥 生成对左侧进行加密的bit序列,它是密码系统的核心。将轮函数输出的bit序列左侧进行异或运算,其结果就是加密后的左侧
  5. 输入的右侧将直接输出

生成子密钥的过程如下:

  1. 首先,将64位的密钥通过一个称为初始置换(Initial Permutation)的置换表进行重排,得到一个56位的密钥,其中8位被用作校验位,不参与后续的计算。
  2. 然后,将这个56位的密钥分成左右两个28位的部分,分别称为C0和D0。
  3. 接下来,对C0和D0进行16轮的迭代,每轮迭代都包括以下步骤:
    a. 对Cn和Dn进行左移操作,得到Cn+1和Dn+1。左移操作将Cn和Dn的位数分别向左移动1或2位,具体的移动次数由轮数决定。
    b. 将Cn+1和Dn+1合并成一个56位的密钥Kn+1,通过一个称为压缩置换(Compression Permutation)的置换表进行重排,得到一个48位的子密钥Kn。
    c. 将生成的子密钥Kn存储起来,作为加密和解密时使用的密钥。
  4. 最后,经过16轮迭代之后,就生成了16个48位的子密钥,这些子密钥被用于加密和解密数据。

如果只看上面,我们的右侧是没有被加密的,所以我们才需要用不同的子密钥进行多次的轮操作,并且每两轮直接左右需要对调。如下图:
3轮
上图是进行了3轮循环,DES加密是16轮。

二、3DES

1. 3DES加密

3DES也是三重DES,是为了增加DES的强度,将DES重复3次所得到的一种加密算法。

3DES
由于DES密钥长度实质上是56bit,此三重DES的密钥长度就是3*56=168 bit。
上图我们可以发现,三重DES并不是进行三次DES加密(加密 -> 加密 -> 加密),而是加密-解密-加密的过程。为什么加密算法中要加入解密算法呢?其目的是为了让3DES兼容普通的DES
三重DES中所有密钥都相同时,三重DES就等于普通的DES了。因为前两次加密-解密得到的就是最初的明文,然后在进行一次DES加密,就相当于只做了一次DES加密。因此以前用DES加密的密文,也能用3DES来进行解密。
3des=des
如果密钥1和密钥3相同,密钥2使用不同的密钥,这种三重DES就称为 DES_EDE2,如下图:

在这里插入图片描述

2. 3DES解密

三重DES解密过程和加密过程正好相反,以密钥3-密钥2-密钥1的顺序执行解密-加密-解密的操作
3DES解密

三、AES

AES也是分段加密的,它是取代DES而成为新标准的一种对称密码算法。

1. AES最终候选算法和算法确定

AES最终候选算法名单

名称提交者
MARSIBM公司
RC6RSA公司
RijndaelDaemen、Rijmen
SerpentAnderson、Biham、Knudsen
TwofishCoumterpane公司

最终Rijndael,被NIST选定为AES标准

2. Rijndael

2.1 什么是Rijndael

Rijndael的分组长度密钥长度可以分别以32bit为单位在128bit~256bit范围内进行选择,不过在AES的规格中,分组长度固定为128bit,密钥长度只有128、192和256bit 三种。

2.2 Rijndael的加密和解密

DES一样,Rijndael算法也是由多个构成,其中每一轮分别为SubBytes(逐字节替换)ShiftRows(平移行)MixColumns(混合列)AddRoundKey(与轮密钥异或) 共4个步骤。

Rijndael输入分组为128bit,也就是16字节。输入的明文和密钥都是由16个字节组成的数据,它是按照字节的先后顺序从上到下、从左到右进行排列的。
在这里插入图片描述
然后对输入的16个字节逐个进行SubBytes处理。所谓SubBytes,就是以每个字节的值(0~255的任意值)为索引,从一张拥有256个值的替换表(S-Box)中查找出对应值的处理(注意:S-Box表是通过某种方法计算出来的)。简单说就是将一个1字节的值替换成另一个1字节的值。如下图所示为4x4=16字节的数据中通过S-Box替换1字节的情形。
在这里插入图片描述
SubBytes之后需要进行ShiftRows处理。这一步是将以4字节为单位的行按照一定的规则向左平移。且每行平移的字节数是不同的。如下图:
在这里插入图片描述
ShiftRows之后需要进行MixColumns处理。混合列变换是通过矩阵相乘来实现的,经行移位后的状态矩阵与固定的矩阵相乘,得到混淆后的状态矩阵,如下图:
在这里插入图片描述
最后将MixColumns输出的与轮密钥进行异或,即进行AddRoundKey 处理。如下图:
在这里插入图片描述
通过上面的结构我们可以知道AES一轮加密的过程,经过一轮已经感觉很复杂了。而完整的AES加密需要经过多轮,密钥长度每增加64位,算法的循环次数就增加2轮,128位循环10轮、192位循环12轮、256位循环14轮。

3. AES密钥生成

上面讲了明文加密过程,现在讲一下AES密钥生成过程.

128位密钥也是用字节为单位的矩阵表示,矩阵的每一列被称为1个32位比特字。通过密钥编排函数该密钥矩阵被扩展成一个44个字组成的序列W[0],W[1], … W[42],W[43],该序列的前4个元素W[0],W[1],W[2],W[3]是原始密钥,用于加密运算中的初始轮AddRoundKey。后面40个字分为10组,每组4个字(128比特)分别用于10轮加密运算中的AddRoundKey,如下图所示:
preview

图片来源:密码学基础:AES加密算法

4. AES算法流程图

请添加图片描述
每一轮加密中,都会依次执行SubBytes、ShiftRows、MixColumns和AddRoundKey四个操作,其中AddRoundKey操作在第一轮加密是唯一的操作。在最后一轮加密中,没有MixColumns操作,只有SubBytes、ShiftRows和AddRoundKey操作。

因此,总的来说,AES加密算法的轮数为11轮(10轮加密和1轮初始轮)或13轮(12轮加密和1轮初始轮)或15轮(14轮加密和1轮初始轮),具体取决于所使用的密钥长度。

AES解密过程就是一个逆过程,但是整体流程还是一样的。先进行AddRoundKey,在进行轮函数。但是解密中轮函数执行顺序是AddRoundKey、InvMixColumns、InvShiftRows、InvSubBytes
其中,AddRoundKey是与轮密钥进行XOR运算,这一步加密和解密是一样的。剩下的步骤方法前面都带有Inv,这表示的是与加密相对应的逆运算。

参考博客:The Design of Rijndael、密码学基础:AES加密算法、AES加密算法的详细介绍与实现

参考书籍:《图解加解密技术》


http://chatgpt.dhexx.cn/article/DubFYnAF.shtml

相关文章

ArcGIS版本高级应用 数据归档(历史归档 存档数据)

QQ交流群:607330463 GIS开发技术最强交流群 未经允许 禁止转载 可以参考 目录 1地理数据库 (Geodatabase) 存档 2启用存档 3存档过程 4使用历史版本 5使用历史标记 6使用地理数据库历史查看器 7直接使用存档类 8架构更改和存档 9禁用存档 10存档情景…

文件归档功能

在帮助大家运维EDI平台的这几年中,常常有些客户反馈为什么之前发送的数据页面上都没有了呢?我想查询下之前的数据是否有成功发送给我们的客户应该怎么确认呢?业务数据量太大,文件占用磁盘空间太多,我如何快速地确认一些…

如何创建归档?

首先这里我们先了解两个概念归档和压缩,归档就相当于将文件批量打包在一块,便于之后工作查找文件的位置,但是总体文件的大小是不变的,例如我们将10个不通路径下且每个大小都是10M的文件打包在一块,那么归档后的大小就是…

大数据归档-冷热数据分离

1. 什么是TokuDB? TokuDB 是一个支持事务的“新”引擎,有着出色的数据压缩功能,由美国 TokuTek 公司(现在已经被 Percona 公司收购)研发。拥有出色的数据压缩功能,如果您的数据写多读少,而且数…

数据归档,存储的完美储备军

数据爆炸性增长的同时,存储成为了大家首要担心的问题 大家都希望自家数据保存20年、50年后仍完好无损 但是,N年后的数据量已达到一个无法预测的峰值 如此大量的数据在保存时极可能存在丢失、损坏等问题 这时需要提前对数据进行“备份”、“归档” 备份是…

oracle数据库归档模式修改ARCHIVELOG

oracle数据库归档模式修改ARCHIVELOG 一、查看当前数据库的归档模式 第一步:查看oracle数据库的归档模式 命令如下:(该命令登录sys用户可查) select log_mode from v d a t a b a s e ; 如 果 值 为 N O A R C H I V E L O G &am…

数据归档神器-pt-archiver

前言介绍 pt-archiver是用来归档表的工具,可以做到低影响、高性能的归档工具,从表中删除旧数据,而不会对 OLTP 查询产生太大影响。可以将数据插入到另一个表中,该表不需要在同一台服务器上。可以将其写入适合 LOAD DATA INFILE 的…

从MYSQL 数据库归档 到 归档设计

到数据归档,很多人的第一个概念就是,不就是无用的数据,换个地方放吗,直接拷贝,删除不就得了,有那么麻烦。 我见到过的,听到过的数据库归档的方法有以下几种 1 数据通过人工的手段来进行清理&am…

数据存储领域的“归档Archive”

档案圈的朋友想必对档案领域的“归档”一词已经耳熟能详,按照DA/T 58-2014《电子档案管理基本术语》中的定义,归档(Archiving)是指“按照国家规定将具有保存价值的电子文件及其元数据的保管权交给档案部门的过程”。 今天我们要聊…

那些年跟领导聊过的数据归档【DB篇】:从梳理到落地-DB单表千万级归档详细流程讲解

文章目录 知人论世执笔蓝图V1 - 浅尝辄止V2 - 初窥门镜V3 - 木已成舟 躬行方案安内攘外 卓有成效沉淀之石道阻且长 知人论世 无论何种需求的出现都是因为某种迫切解决的问题契机,它是业务发展中定数也是劫数,近期DBA反馈磁盘存储空间超过80%不足以支撑未…

进来偷学一招,数据归档二三事儿

Hello,大家好,我是楼下小黑哥~ 随着业务的快速增长,业务体量变得越来越大,这个过程我们会碰到各种问题,倒逼着我们进行技术升级。 那今天我们来聊下,这个过程将会碰到关于数据的问题。 数据增长带来的烦…

MySQL 归档数据的方法你知道了吗

归档,在 MySQL 中,是一个相对高频的操作。 它通常涉及以下两个动作: 迁移。将数据从业务实例迁移到归档实例。删除。从业务实例中删除已迁移的数据。 在处理类似需求时,都是开发童鞋提单给 DBA,由 DBA 来处理。 于…

7.数据归档(Archiver)

1.归档的基本概念 归档: 是指将数据写入文件存储到程序的沙盒中,当再次重新打开程序时,可以还原这些数据. 称它为数据序列化, 数据持久化. 临时数据: 存储在内存中的数据, 程序关闭, 内存释放,数据丢失数据持久性的方式 1) NSKeyedArchiver—-对象归档 2) NSUserDefaults 3)…

如何用matlab求出矩阵简化阶梯形顺带算出主元所在的列

matlab用rref函数 函数格式 [R,j]rref(A) A是矩阵 R是简化后的阶梯形 j是主元例子:求矩阵A的简化阶梯形与主元所在的列 >> A [1 1 -2 1 4; 2 4 -6 4 8; 2 -3 1 -1 2; 3 6 -9 7 9]; >> [R,j]rref(A)R 1 0 -1 0 40 1 -1 0 …

(线性代数笔记)2.阶梯型矩阵

1.阶梯形矩阵的定义 矩阵的主元 2.任意矩阵经过有限次初等行变换化为阶梯形 这里C是由B通过初等行变化得到的,C也是A的阶梯形 3.矩阵的秩 例题(矩阵通过初等行变换转化为阶梯形)

行阶梯型矩阵,行最简形矩阵,标准形矩阵

行阶梯形矩阵: 行最简形矩阵: 标准形矩阵:

MATLAB--矩阵操作(1.4)

矩阵的逆 >> A*inv(A) ans 1.0000 0 -0.0000 -0.0000 1.0000 -0.0000 -0.0000 0 1.0000 >> norm((ans-eye(3))) ans 1.8620e-15 一个矩阵中行(列)的最大线性无关组的行(列)向量的个…

python 矩阵化为最简阶梯型

from sympy import Matrix import numpy as np原数据是矩阵matrix A_matrix np.array([[1, 0, 0, 0, 1, 0], [1, 0, 0, 0, 0, 1], [0, 1, 0, 1, 0, 0],[0, 1, 0, 0, 0, 1], [0, 0, 1, 1, 0, 0], [0,0,1,0,1,0],[1,1,1,-1,-1,-1]])#系数矩阵,类型matrix# 阶梯行 A…

Python3 矩阵求最简行阶梯矩阵

由于在Python numpy库中没有直接对Matrix求RREF的方法,度娘了好久发现在另一个科学计算包sympy中可以利用A.rref()的方法对Matrix直接求RREF,但是有另一个问题,大家一般常用的是numpy,而sympy和numpy使用的是不同的数据类型&#…

用c语言将一般矩阵化为简化阶梯型

(完整的程序附在文末) 1、问题描述: 用C/C设计一个算法,把矩阵M化为行最简形梯形矩阵A。矩阵A应该满足以下几个条件: 1)若有零行,则零行应在最下方; 2)非零首元(即非零行的第一个不为零的元素&a…