基于CBC、ECB、CTR、OCF、CFB模式的AES加密算法

news2024/11/28 9:26:45

1、什么是AES加密算法

什么是加密算法?我在文章《从个人角度看什么是加密算法》中描述了我对加密算法的一些浅薄的理解。我不是信息安全领域的大神,只求有一个入门罢了!

这篇文章是文章《从个人角度看什么是加密算法》的延伸,所以在阅读前,请务必仔细阅读并理解上一篇文章的内容。

既然加密算法本质上是对明文和密钥的一系列运算,那么AES加密算法就是一种被定义的具有明确运算方式的过程。这个运算过程不可能简单,不然它也不会成为目前应用最广泛的加密算法。

AES,Advanced Encryption Standard,高级加密标准,又称Rijndael加密法。是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES(Data Encryption Standard),已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院 (NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

AES是对称加密算法,这说明它的加解密使用的密钥相同,且它的加密算法可逆。

1.1、AES的基本结构

AES是分组密码。分组密码就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。

AES规定自己的分组长度固定为128位,16个字节。密钥长度则可以是128、192或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

AES密钥长度(32位比特字)分组长度(32位比特字)加密轮数
AES-1284410
AES-1926412
AES-2568414

所谓的加密轮数,就是对分组数据进行一轮加密,对于AES-128算法来说,共进行10轮加密,其中前9轮加密方式相同,第10轮不同,最终得到的就是密文。

比如明文P,使用加密函数:

C = encrypt(P, K);

加密后得到密文C。在加密函数encrypt()里,共进行10轮计算,前9轮每一轮都是对分组数据P1进行加减乘除,得到的结果P2再进行加减乘除,最后1轮加减乘没有除。运算过程中别忘了让密钥K参与进来。

轮次加密

上面只是举个例子!

实际AES加密中前9轮的操作并不是加减乘除,而是:字节代换、行位移、列混合和轮密钥加。第10轮也并不是加减乘,而是:字节代换、行位移、轮密钥加,不执行列混合。

AES加密过程是在一个4×4的字节矩阵上运作,这个矩阵又称为“体(state)”,其初值就是一个明文矩阵(矩阵中一个元素大小就是明文中的一个Byte字节)。 明文分组的16个字节如何在这个4x4的矩阵中排列呢?遵循:从上到下、从左到右排序。假设明文分组的数据为abcdefghijklmnop,分别对应为:P0、P1、P2、P3、P4、P5、P6、P7、P8、P9、P10、P11、P12、P13、P14、P15,存储在内存中是以编码后的数据保存:0x61、0x62、0x63、0x64、0x65、0x66、0x67、0x68、0x69、0x6A、0x6B、0x6C、0x6D、0x6E、0x6F、0x70。明文数据保存在字节矩阵中的位置为:

字节矩阵中如何存储明文分组数据

实际参与运算的是最后一个矩阵!

不只是明文数据需要放在矩阵表中参与运算,128位密钥K(以AES-128为例)也是用4x4矩阵表示,以字节为单位:K0、K1、K2、K3、K4、K5、K6、K7、K8、K9、K10、K11、K12、K13、K14、K15,按从上到下、从左到右顺序排列:

密钥在字节矩阵中排列

每一轮都需要这样的一个密钥矩阵(128位,16个字节)参与运算,每一轮的密钥又不能相同,而AES-128算法传入的密钥只有128位。怎么办呢?

在加密算法中,会对传入的128位原始密钥通过一个密钥编排函数生成10个密钥矩阵,加上原始密钥矩阵共11个。在第一轮加密前,需要将明文和原始密钥进行一次异或加密操作,然后10轮加密操作分别用生成的10个密钥矩阵参与运算。

下面简单介绍下每轮加密的四个操作:字节代换、行位移、列混合和轮密钥加

1.1.1、字节代换

AES的字节代换其实就是一个简单的查表操作。AES定义了一个S盒和一个逆S盒。每个盒是一个16x16的字节矩阵。需要字节代换的4x4的数据矩阵,每个字节值的高4位作为行值(0-15),低4位作为列值(0-15),在S盒上查找到对应的单元的字节值,全部替换掉即可。如果是解密,就使用逆S盒。

1.1.2 行位移

行移位是一个简单的左循环移位操作。数据矩阵的第0行左移0字节,第1行左移1字节,第2行左移2字节,第3行左移3字节。

1.1.3 列混合

这里的运算我看不大懂!

1.1.4 轮密钥加

数据矩阵与密钥矩阵对应字节位进行异或操作

密文的解密操作不只是加密的10轮操作的逆操作(10-9-8-7-6-5-4-3-2-1),还是每轮中的逆操作(轮密钥加-列混合-行位移-字节代换),还是每个操作的逆操作(比如行位移本来是往左移,逆操作就往右移,字节代换本来是在S盒中查找替换,逆操作就是在逆S盒中查找替换)。

AES算法详细介绍请参考:https://blog.csdn.net/qq_28205153/article/details/55798628?spm=1001.2014.3001.5506。写的非常好!!!

2、AES加密模式

AES加密模式共五种:CBC、ECB、CTR、OCF、CFB。它们每轮加密使用的方法都相同,不同的点在于传入的128位明文数据在加密前需要做一些额外的运算。比如CBC模式,就需要多传入一个初始值,让其与明文分组矩阵进行异或操作,然后再进行10轮加密操作。

五种加密模式的详细介绍请参考:https://www.cnblogs.com/starwolf/p/3365834.html


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428628.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++初阶】:缺省函数和函数重载

c入门一.缺省函数二.函数重载1.参数类型不同2.参数个数不同3.参数顺序不同一.缺省函数 缺省函数,顾名思义就是可以在传参时不传或者少传参数的函数。这里举个例子: 完全缺省 上面的就属于全缺省,可以不传任何参数,当然也可以传参…

Codeforces Round 862 (Div. 2) -- D. A Wide, Wide Graph(树的直径 贪心 简单的树形dp)

题目如下: 题意简说: 树上两点 u,vu, vu,v,如果 u,vu, vu,v 的距离大于等于 kkk 则在图 GkG_kGk​ 上 u,vu, vu,v 有一条无向边。 求当 kkk 等于 [1, n] 的时候,图 GkG_kGk​ 的连通块数量。 思路 or 题解: 我们可以…

【服务器】Dell PowerEdge R750 安装GPU

各种教程 官方教程 https://www.dell.com/support/manuals/zh-cn/poweredge-r750/per750_ism_pub/%E5%AE%89%E8%A3%85-gpu?guidguid-6bb1c301-7595-4c6d-b631-b6a5761c6052&langzh-cn 手册PDF版: https://dl.dell.com/content/manual16153190-dell-emc-powe…

OKR与敏捷开发的结合

当你想达成某件事情时,你在内心会有一个设想的期望结果。这是一个非常简单、基本的概念,并且是从很多人小时候就培养起来的。我们可以将这种现象总结一句话: 通过 ________ 来衡量__________ 。 这就是 John Doerr 在其著作《Measure what Ma…

JavaWeb开发 —— Maven

目录 一、概述 1. 介绍 2. 安装 二、maven-idea 集成 1. 配置及创建Maven项目 2. IDEA 创建Maven项目 3. IDEA导入 Maven 项目 三、依赖管理 1. 依赖配置 2. 依赖传递 3. 依赖范围 4. 生命周期 一、概述 1. 介绍 ① Apache Maven 是一个项目管理和构建工…

【UDP报文和TCP协议特性】

目录1.UDP报文1.1报文长度1.2校验和2.TCP协议特性2.1确认应答2.2超时重传2.3连接管理2.3.1三次握手2.3.2四次挥手2.4滑动窗口2.5流量控制2.6拥塞控制2.7延时应答2.8捎带应答2.9面向字节流2.10异常情况3.小结3.1tcp小结3.2tcp和UDp应用场景的差异4.寄语1.UDP报文 udp是传输层最…

【Android】之【内存管理】

一、Android内存运行是如何运行的? 物理内存即移动设备上的ram,当启动一个android程序时,会启动一个dalvik vm进程,系统会给它分配固定的内存空间【16m,32m,64m,不定,没有统一标准,每个虚拟机会有堆内存阈…

【Minecraft开服教程】使用 MCSM 面板一键搭建我的世界服务器,并内网穿透公网远程联机

文章目录前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址7. 使用固定公网地址远程联机前言 MCSManager是一个开源…

C++ float 数据的保存格式

总体上,在计算机中, float 数据的的保存按照如下转换逻辑:10进制数 >二进制数>科学计数法二进制数>c 条件下下浮点数在内存中的保存格式(这里面有个转换算法,需要理清楚)。 下面举出一个案例&…

Python+selenium自动化测试实战项目(全面,完整,详细)

前言 之前的文章说过, 要写一篇自动化实战的文章, 这段时间比较忙再加回家过清明一直没有更新,今天整理一下实战项目的代码共大家学习。(注:项目是针对我们公司内部系统的测试,只能内部网络访问,外部网络无…

使用fetch()异步请求API数据实现汇率转换器

任务8 https://segmentfault.com/a/1190000038998601 https://chinese.freecodecamp.org/news/how-to-master-async-await-with-this-real-world-example/ 跟随上面的指示,理解异步函数的编写,并且实现这个汇率转换器。 第一步:在工作区初始…

AI失业潮来袭,某些部门裁员过半

历史的车轮滚滚向前,每次生产力的大幅跃进,都会造成一批失业潮。想当年,纺纱机的出现让无数手工作坊的织布师傅失业。如今,在AI技术的催化下,同样的事正在互联网行业的各个领域重演。疯狂的裁员浪潮 “AI15秒做的&…

图神经网络汇总和总结

下面所有博客是个人对EEG脑电的探索,项目代码是早期版本不完整,需要完整项目代码和资料请私聊。 数据集 1、脑电项目探索和实现(EEG) (上):研究数据集选取和介绍SEED 相关论文阅读分析: 1、EEG-SEED数据集作者的—基线论文阅读和…

LeetCode——二叉树的层序遍历

102. 二叉树的层序遍历 I 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]]…

超级详解MySQL执行计划explain

1、什么是MySQL执行计划 要对执行计划有个比较好的理解,需要先对MySQL的基础结构及查询基本原理有简单的了解。 MySQL本身的功能架构分为三个部分,分别是 应用层、逻辑层、物理层,不只是MySQL ,其他大多数数据库产品都是按这种架构…

窗函数的总结

1. 为什么要加窗 每次FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断。即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会存在泄…

C++算法初级10——动态规划

C算法初级10——动态规划 文章目录C算法初级10——动态规划最优化问题动态规划分析流程和条件最优化问题 生活中我们常常遇到这样一些问题: 看到上面的例子,我们发现这些问题都是在最大化(或者最小化)某个指标:最小化…

leetcode重点题目分类别记录(三)动态规划深入与素数理论

文章目录动态规划背包问题01背包抽象出求解目标尝试进程子问题拆分基本情况根据拆分过程定义dp数组与转移方程遍历顺序与状态压缩模板归纳题目应用变种提升组合问题多维01背包有特殊限制的01背包完全背包尝试进行子问题拆分转移方程题目应用变种提升-求组合/排列数打家劫舍变种…

二维数组的总结

一、时间复杂度和空间复杂度 时间复杂度和空间复杂度是衡量算法效率的两个重要指标。时间复杂度是指算法执行所需的时间,而空间复杂度是指算法执行所需的内存空间。 计算时间复杂度和空间复杂度需要分析算法中各个操作的执行次数和内存使用情况。具体的计算方法可以…

【matlab代码】提取任意多边形内的nc数据--以海洋温度为例子

【matlab代码】提取任意多边形内的nc数据–以海洋温度为例子 本文来源于对象想提取一个矩形内的温度数据,从而求平均能看出时间序列变化。 由于平时我们矩形是和经纬度平行,我们可以直接使用lon,lat进行寻找。 例子如图: 图片 这样的水平图,大家都会,直接: find(lon…