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

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.kler.cn/a/9909.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Monitor方案MT9800学习笔记(三) —— 点屏(V-by-One信号接口)

点屏1. 硬件准备1.1 屏1.2 屏线1.3 背光接口2. 软件配置2.1 新增屏驱2.2 屏参配置2.3 点屏3. LVDS信号接口点屏介绍1. 硬件准备 1.1 屏 点屏前,要先确认其参数和功能,再选择匹配的主板。 这里以 Innolux 的 M280DGJ-L30 作为例子说明,先来看…

MybatisPlus <= 3.5.3.1 TenantPlugin 组件 存在 sql 注入漏洞(CVE-2023-25330)

漏洞描述 MyBatis-Plus TenantPlugin 是 MyBatis-Plus 的一个为多租户场景而设计的插件,可以在 SQL 中自动添加租户 ID 来实现数据隔离功能。 MyBatis-Plus TenantPlugin 3.5.3.1及之前版本由于 TenantHandler#getTenantId 方法在构造 SQL 表达式时默认情况下未对…

测试:腾讯云轻量4核8G12M服务器CPU流量带宽系统盘

腾讯云轻量4核8G12M应用服务器带宽,12M公网带宽下载速度峰值可达1536KB/秒,折合1.5M/s,每月2000GB月流量,折合每天66GB,系统盘为180GB SSD盘,地域节点可选上海、广州或北京,4核8G服务器网来详细…

pytorch进阶学习(三):在数据集数量不够时如何进行数据增强

对图片数据增强,可以对图片实现: 1. 尺寸放大缩小 2. 旋转(任意角度,如45,90,180,270) 3. 翻转(水平翻转,垂直翻转) 4. 明亮度改变(变…

花30分钟,我用ChatGPT写了一篇2000字文章(内附实操过程)

有了ChatGPT之后,于我来说,有两个十分明显的变化: 1. 人变的更懒 因为生活、工作中遇到大大小小的事情,都可以直接找ChatGPT来寻求答案。 2. 工作产出量更大 之前花一天,甚至更久才能写一篇原创内容,现…

【LeetCode】剑指 Offer 49. 丑数 p240 -- Java Version

题目链接:https://leetcode.cn/problems/chou-shu-lcof/ 1. 题目介绍(49. 丑数) 我们把只包含质因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。 质因数:质因子&#xff08…

JavaScript 基础入门速成上篇

JavaScript 嵌入页面的方式 1. 行间事件 <button onclick"alert(点击按钮)">按钮</button> 2. script标签 <script type"text/javascript">console.log(Hello javascript !) </script> 3. 外部引入 <script type"t…

IO流复习

目录字符集git pull origin master --allow-unrelated-historiesCTRL ALT T进行整块代码的操作&#xff08;会出现一个选项栏&#xff09;字符集的编码和解码操作IO流字节输入流和字节输出流文件拷贝资源释放的方式字符输入流和字符输出流缓冲流字节缓冲流的性能分析字符缓冲流…

算法题:图的表示形式与遍历框架

图的基本概念 在数据结构和算法上&#xff0c;图的数据表示一般使用邻接表和邻接矩阵的形式。 比如&#xff1a; 邻接表和邻接矩阵存储如下。邻接表是用vector[vector[i]] 存储每个节点指向的节点&#xff0c;邻接矩阵是用一个二维矩阵matrix[i][j]表示&#xff0c;如果第数据…

小米手机root后过软件检测

工具&#xff1a; https://wwp.lanzouf.com/b0cybm3ib 密码: 9hn8 视频讲解&#xff1a;隐藏root终极教程&#xff08;2022年&#xff09; 演示机型&#xff1a;小米10&#xff0c;安卓14&#xff0c;MIUI14.0.2 问题描述 安装magisk后使用病毒扫描发现支付环…

Flink (十) --------- 容错机制

目录一、 检查点&#xff08;Checkpoint&#xff09;1. 检查点的保存2. 从检查点恢复状态3. 检查点算法4. 检查点配置5. 保存点&#xff08;Savepoint&#xff09;二、状态一致性1. 一致性的概念和级别2. 端到端的状态一致性三、端到端精确一次&#xff08;end-to-end exactly-…

ActiveMQ使用(二):在JavaScript中使用mqtt.js

ActiveMQ使用(二):在JavaScript中使用mqtt.js 1. 环境准备 jQuery-1.10 下载地址:https://www.jsdelivr.com/package/npm/jquery-1.10.2?tabfilesmqtt.js 4.3.7: 下载地址:https://www.jsdelivr.com/package/npm/mqtt 2. 相关代码 <!DOCTYPE html> <html lang&q…

和开振学Spring boot 3.0之Spring MVC:④获取参数(上)

之前&#xff0c;我反复说过处理器封装了控制器&#xff0c;HandlerMapping的机制找到处理器后&#xff0c;通过处理器就能运行控制器&#xff0c;那么处理器增强了控制器什么功能呢&#xff1f; 我们用脑子想一下&#xff0c;要运行控制器之前&#xff0c;我们需要做什么&…

《Java8实战》第1章 Java 8、9、10 以及 11 的变化

如想了解 Oracle 公司对 JDK 的最新支持情况&#xff0c;请访问https://www.oracle.com/technetwork/java/java-se-supportroadmap.html。所有的示例代码均可见于图灵社区本书主页 http://ituring.com.cn/book/2659“随书下载”处。 1.1 为什么要关心 Java 的变化 Java8做的…

小程序的组件化开发

目录&#xff1a; 1 小程序组件化思想 2 自定义组件的过程 3 组件样式实现细节 4 组件使用过程通信 5 组件插槽定义使用 6 Component构造器 在小程序里面需要创建组件的话需要在最外层建component包&#xff0c;然后在使用新建component来创建类似page的4个文件&#xff…

Spark 简介与原理

目录标题1 Spark 简介与原理1.1 Spark与Hadoop的区别1.2 Spark的应用场景1.3 Spark的作业运行流程1.4 Spark 2.X与Spark 1.X的区别1 Spark 简介与原理 Spark 是一个大规模数据处理的统一分析引擎。 具有迅速、通用、易用、支持多种资源管理器的特点。 Spark生态系统: Spark SQL…

C++之AVL树

文章目录前言一、概念二、AVL树结点的定义三、AVL树的插入四、AVL树的旋转1.右单旋的情况以及具体操作抽象图h 0h 1h 2代码实现2.左单旋的情况以及具体操作抽象图代码实现3.右左双旋的情况以及具体操作抽象图h 0h 1h 23.左右双旋的情况以及具体操作抽象图5.总结6.完整实现…

stable-diffusion-webui浅叙

GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UI 使用Git下载&#xff1a; git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.git 运行 webui-user.bat : git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui.g…

Python每日一练(20230413)

目录 1. 最后一个单词的长度 ※ 2. 全排列 &#x1f31f;&#x1f31f; 3. 计数质数 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 最后一个单词的长度 给你一个字符串 s&…

sql server 入门教程

sql server 入门教程 1、创建数据库 1&#xff09;鼠标右键数据库选项&#xff0c;点击新建数据库 2&#xff09;命名数据库 根据自己业务情况取一个自定义数据库名字&#xff0c;比如&#xff1a;my_database 3&#xff09;查看数据库 如果添加没看到&#xff0c;那么可鼠…
最新文章