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

AES加密解密算法

一,AES算法概述

AES属于分组加密,算法明文长度固定为128位(单位是比特bit,1bit就是1位,128位等于16字节)

而密钥长度可以是128、192、256位

当密钥为128位时,需要循环10轮完成加密,在此基础上,密钥每增加64位,就要多循环2轮(即192位密钥循环12轮,256位密钥循环14轮)


 二,加密过程

(零)加密过程总览

以128位密钥为例子,AES算法会对明文先进行【初始变换】(这里的初始变化),然后是9轮【循环运算】,加1轮【最终轮】,最终得到密文

这里的最终轮其实唯一的区别就是最终轮少了9轮主循环中第3步的列混合

 (一)初始变换

首先要理解,无论是明文还是密钥,16个字节(即128位)的字符,在进行加密的过程中都是以4*4的矩阵形式存在的,这个矩阵也有要求——输入的字符需要按从上到下从左往右的顺序排列成矩阵

接受了这个概念后,我们来看AES的初始变换操作,其实十分简单,就是对明文矩阵和密钥矩阵对应的元素异或得到新矩阵,如下图

(二)9轮循环运算

 (1)字节代换

对于完成第一步初始变换的矩阵进行字节代换

我们要将矩阵中的每一个元素都替换掉,但替换是有规则的替换,即S-BOX,按照矩阵元素的值去映射S-BOX中对应的值

(2)行移位

对于完成字节替换的矩阵进行行移位

规则是矩阵的第一行不变,第二行向左移动1个字节,第三行向左移动2个字节,第四行向左移动3个字节

注意,这里认为矩阵的最左边连通最右边,即坐标(2,1)的p2左移后出现在坐标(2,4)

下图是步骤(1)字节替换后的矩阵进行行移位的结果

(3)列混合(该操作在最终轮不执行)

对于完成行移位的矩阵进行列混合

规则是左乘一个给定的4*4矩阵,注意这个矩阵是程序设计时给定的,可能每个程序使用的AES算法中的这个矩阵不一定相同

(注意,这里的矩阵乘法并不是简单的线性代数中的元素相乘相加,本篇不展开讲,详见本篇->关于AES的列混合计算和解密流程问题_aes列混合运算-CSDN博客)

下图是步骤(2)行移位后的矩阵进行列混合的结果

(4)轮密钥加

对于完成列混合的矩阵进行轮密钥加

规则是对完成列混合的矩阵和轮密钥矩阵对应的元素进行异或,这里我们先知道要这样操作即可,至于轮密钥矩阵在后面马上就介绍了

(*)轮密钥矩阵

最开始只有一个密钥矩阵(假设就是下图这个矩阵),我们对这个矩阵的列进行如下标号

9轮循环运算中,每进行一轮,需要对密钥拓展出如下图的ai列,并使(a1, a2, a3, ai)成为当前轮的轮密钥矩阵

拓展时,使用如下规则——

  • 如果i不是4的倍数,那么第i列由如下等式确定:a[i]=a[i-4] ^ a[i-1],例如i等于5时:a[i]=a[1] ^ a[4],即第2列和第5列异或(第1轮没有第5列,第2轮才有第5列)
  • 如果i是4的倍数,那么第i列由如下等式确定:a[i]=a[i-4]^T(a[i-1]),例如i等于4时,a[i]=a[0] ^ T(a[3]),即第1列和经过T函数计算的第4列异或

函数T由3部分组成:字循环、字节代换和轮常量异或(坚持一下,就要结束了┭┮﹏┭┮)

①字循环

下图是对i等于4的情况下进行字循环操作

②字节代换

和9轮循环运算中的第(1)步操作是一样的,将字节映射到进行的S-BOX中进行字节替换

③轮常量异或

轮常量是给定的,这里的Rcon就是轮常量矩阵,可能每个程序使用的AES算法中的这个矩阵不一定相同

(注意,下图左,橙色列和黄色列是轮常量异或,最终再异或蓝色列是按照公式a[i]=a[i-4]^T(a[i-1])拓展轮密钥矩阵,蓝色列就是公式中的a[i-4])


 (补充),AES加密的不同模式

AES加密算法的模式主要有五种,它们是ECB模式、CBC模式、CFB模式、OFB模式和CTR模式。它们之间的主要区别在于加密过程中明文和密文的处理方式以及安全性特点:

  1. ECB模式

    • 每个明文块被独立加密,相同的明文块得到相同的密文块。
    • 不适合加密大量数据或具有重复模式的数据,容易受到攻击。
  2. CBC模式

    • 使用前一个密文块对当前明文块进行加密,增加了随机性,相同的明文块在不同位置得到不同密文块。
    • 需要使用初始化向量(IV)来增加安全性。
  3. CFB模式

    • 使用前一个密文块作为输入生成伪随机密钥流与明文进行异或运算得到密文。
    • 可以支持实时加密和流加密。
  4. OFB模式

    • 类似于CFB,使用前一个密文块生成伪随机密钥流,然后与明文进行异或运算。
    • 对加密和解密中的错误更加鲁棒,但不支持部分更新。
  5. CTR模式

    • 使用一个计数器与密钥输入加密算法生成伪随机密钥流,与明文进行异或运算。
    • 可以并行加密和解密,适用于需要高效加密的场景。

选择哪种模式取决于具体应用的需求和安全性要求,例如需要实时加密或流加密的场景可选用CFB模式,而需要高效加密的场景可选用CTR模式。


三,实际运用

博主最近在钻研逆向技术,在逆向分析过程中会遇到AES加密,因此需要略微了解AES算法的原理(深入了解就是密码学者干的事情了,逆向分析但求能一眼看出是AES加密即可)

如下图,在第31行运用到了AES加密(当然这题属于十分基础的,函数名直接表明是AES加密了)

在函数中此函数中,能够很清晰地看出AES的循环加密过程

知道它是AES加密后,逆向的工作就很清楚了,我们只需要从程序中分析获取密文和密钥,解密即可获得flag,至于解密的具体代码不必关心,可以直接借助python的第三方库解决,会写脚本即可

(这里只做举例,具体问题请具体分析)

from Crypto.Cipher import AES#注意解密过程中密钥的格式需要为byte类型,字符串转byte直接在开头加个b标志
key = b'1234567890123456' 
#注意解密过程中密文的格式需要为byte类型,本题获取到的是十六进制文本,处理成字符串后使用bytes.fromhex()函数转为对应的字节数组
en_text = bytes.fromhex('F3498AED82CE44E2357C23F5DCF897A43B6A7BFEE0467C591E301CBC38F99913')aes = AES.new(key, AES.MODE_ECB) #创建一个AES解密对象,需要传入密钥和加密模式(这里是ECB模式)
print(aes.decrypt(en_text)) #调用decrypt方法实现解密

相关文章:

AES加密解密算法

一,AES算法概述 AES属于分组加密,算法明文长度固定为128位(单位是比特bit,1bit就是1位,128位等于16字节) 而密钥长度可以是128、192、256位 当密钥为128位时,需要循环10轮完成加密&#xff0…...

计算机网络(05)

计算机网络(04) 网络负载均衡 由多台服务器以对称的方式组成一个服务器集合每台服务器都具有等价的地位 , 可以单独对外提供服务而无须其他服务器的辅助均衡负载能够平均分配客户请求到服务器列阵,借此提供快速获取重要数据,解决…...

6、ChatGLM3-6B 部署实践

一、ChatGLM3-6B介绍与快速入门 ChatGLM3 是智谱AI和清华大学 KEG 实验室在2023年10月27日联合发布的新一代对话预训练模型。ChatGLM3-6B 是 ChatGLM3 系列中的开源模型,免费下载,免费的商业化使用。 该模型在保留了前两代模型对话流畅、部署门槛低等众多…...

python面试题(1~10)

1、列表(list)和元组(tuple)有什么区别? ①列表是不可变的,创建后可以对其进行修改。元组是不可变的,元组一旦创建,就不能对其进行修改。 ②列表表示的顺序,它们是有序…...

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测

分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测 目录 分类预测 | Matlab实现CNN-LSTM-Mutilhead-Attention卷积神经网络-长短期记忆网络融合多头注意力机制多特征分类预测分类效果基本介绍模型描述程序设计参…...

SQLServer CONCAT 函数的用法

CONCAT函数用于将多个字符串值连接在一起。以下是一个简单的示例,演示了如何使用CONCAT函数: -- 创建一个示例表 CREATE TABLE ExampleTable (FirstName NVARCHAR(50),LastName NVARCHAR(50) );-- 插入一些示例数据 INSERT INTO ExampleTable (FirstNam…...

python快速入门一

变量 定义一个变量并打印到控制台 message "Hello World!" print(message)控制台输出 Hello World!修改变量 message "Hello World!" print(message) message "Hello Python World!" print(message)控制台输出 Hello World! Hello Pytho…...

Elasticsearch 面试题及参考答案:深入解析与实战应用

在大数据时代,Elasticsearch 以其强大的搜索能力和高效的数据处理性能,成为了数据架构师和开发者必备的技能之一。本文将为您提供一系列精选的 Elasticsearch 面试题及参考答案,帮助您在面试中脱颖而出,同时也为您的大数据架构设计提供实战参考。 1. 为什么要使用 Elastic…...

【ARM 嵌入式 C 入门及渐进 18 -- 字符数字转整形函数 atoi 介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 字符数字转整形函数 atoiatoi 简单实现 字符数字转整形函数 atoi 在 C 语言中,main 函数能够接收命令行参数。这些参数通过两个参数传递给 main 函数:int argc 和 char *argv[]。argc 是命令行参数的数量&a…...

全国超市数据可视化仪表板制作

全国超市消费数据展示 指定 Top几 客户销费数据展示 指定 Top几 省份销费数据展示 省份销售额数据分析 完整结果...

react native 总结

react app.js 相当与vue app.vue import React from react; import ./App.css; import ReactRoute from ./router import {HashRouter as Router,Link} from react-router-dom class App extends React.Component {constructor(props){super(props)}render(){return ( <…...

什么是自然语言处理(NLP)?自然语言处理(NLP)的概述

什么是自然语言处理&#xff1f; 自然语言处理&#xff08;NLP&#xff09;是人工智能&#xff08;AI&#xff09;和计算语言学领域的一个分支&#xff0c;它致力于使计算机能够理解、解释和生成人类语言。随着技术的发展&#xff0c;NLP已经从简单的模式匹配发展到了能够理解…...

共享旅游卡怎么使用?共享旅游卡的奥秘与魅力,解锁高效旅行的新方式

在共享经济的浪潮下&#xff0c;共享旅游卡逐渐崭露头角&#xff0c;成为众多旅行爱好者青睐的出行选择。如何有效利用这类卡片&#xff0c;使之成为节省成本、丰富旅行体验的利器呢&#xff1f; 本文将深入解析共享旅游卡的内涵、获取途径、使用要点&#xff0c;以及如何根据…...

使用yolov9来实现人体姿态识别估计(定位图像或视频中人体的关键部位)教程+代码

yolov9人体姿态识别&#xff1a; 相较于之前的YOLO版本&#xff0c;YOLOv9可能会进一步提升处理速度和精度&#xff0c;特别是在姿态估计场景中&#xff0c;通过改进网络结构、利用更高效的特征提取器以及优化损失函数等手段来提升对复杂人体姿态变化的捕捉能力。由于YOLOv9的…...

「14」四个步骤,让你在直播间轻松演义你的教案……

「14」窗口采集捕获指定程序的窗口画面 在 OBS 软件中&#xff0c;窗口采集功能可以用于捕捉特定应用程序或窗口的屏幕内容&#xff0c;以显示在直播窗口中&#xff0c;如PPT、思维导图、Word、Excel、AI、PS、腾讯会议、IPAD、手机画面等等显示窗口。 窗口采集在使用 OBS 直播…...

分解质因子

分解质因子 题目描述 将一个正整数分解质因数&#xff0c;例如&#xff0c;输入90&#xff0c;输出2 3 3 5。 输入 输入一个正整数n&#xff08;2<n<2000&#xff09;。 输出 从小到大输出n的所有质因子&#xff0c;每两个数之间空一格。 样例输入 20样例输出 2…...

iOS18系统中,苹果可能不再使用Siri,转用Gemini

生成式人工智能&#xff08;Generative AI&#xff09;是苹果公司近两年来默默投资的强大人工智能工具。 坊间流有多种传闻&#xff0c;官方最近终于曝光结果&#xff1a;苹果和谷歌正在谈判将 Gemini AI 引入 iPhone&#xff0c;预计将于今年在所有 iOS 18 设备上推出。 到目前…...

python笔记进阶--模块、文件及IO操作(1)

目录 一&#xff0e;模块 1.模块的导入和使用 1.1导入整个模块 1.2导入函数 1.3使用as给模块指定别名 2.常见标准库 2.1 import random&#xff1a; 2.2 import math&#xff1a; 2.3正则表达式处理 2.4turtle 二&#xff0e;文件及IO操作 1.文件 1.1绝对路径与相…...

单元测试框架 Junit

目录 什么是Junit&#xff1f; Junit的基础注解有哪些&#xff1f; 什么是参数化&#xff1f;参数化通过哪几种方式传输数据&#xff1f; 单参数 多参数 CSV文件获取参数 方法获取参数 测试用例执行顺序如何控制&#xff1f; 什么是断言assert&#xff1f;Assertions类…...

数电票怎么查询真伪|发票识别接口|发票查验接口|PHP接口文档

对于财务工作者而言&#xff0c;发票管理是一项即繁琐又十分重要的工作&#xff0c;尤其是在数字化电子发票快速普及的当下&#xff0c;发票识别、核验、查重等工作无疑增加了财务人员的工作难度。财务人员每天都要与大量的发票打交道&#xff0c;人工管理模式难免会出现手动录…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】

微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来&#xff0c;Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...