AES加密(1):AES基础知识和计算过程

从产品代码的安全角度考虑,我们需要对代码、数据进行加密。加密的算法有很多种,基于速度考虑,我们一般使用对称加密算法,其中有一种常见的对称加密算法:AES(Advanced Encryption Standard)。在一些高端的MCU,如I.MX RT1176中,AES直接集成到了硬件中,它有一个OTFAD实时解密引擎,可以将保存在NOR Flash中使用AES加密的代码边解密边运行,可见AES加密的可靠性和重要性。所以本节就来介绍一下AES加密算法的原理。

文章目录

  • 1 简介
  • 2 AES算法
    • 2.1 AES如何工作
    • 2.2 AES计算步骤
    • 2.3 实例
  • 3 总结

1 简介

AES加密算法(也称为Rijndael算法)是一种对称分块密码算法,以块为单位对数据进行加密,一个块的大小为128位。而AES的密钥则可以为128、192和256位。不同的密钥长度对应着不同的加密轮数:128位为10轮、192位为12轮、256位为14轮。AES基于替代-置换网络,也称为SP网络。它由一系列链接操作组成,包括将输入替换为特定的输出(替代)以及涉及位排序(置换)的其他操作。

AES有如下特点:

  • SP网络:与DES算法中的Feistel密码结构不同,它采用了SP网络结构。
  • 密钥扩展:在第一阶段,它仅采用一个密钥,然后扩展为用于各个轮次的多个密钥
  • 字节数据:AES加密算法对字节数据进行操作,而不是位数据。在加密过程中,将128位块大小视为16个字节。
  • 密钥长度:要执行的轮次取决于用于加密数据的密钥长度。128位密钥长度有十轮,192位密钥长度有12轮,256位密钥长度有14轮。

2 AES算法

2.1 AES如何工作

要理解AES的工作方式,首先需要了解它是如何在多个步骤之间传输数据的。由于单个块是16字节,因此我们用一个4x4矩阵(也叫状态数组)保存数据,每个单元保存1个字节的信息。
在这里插入图片描述
对于128位的密钥,加密过程中需要执行16轮操作。每一轮操作都需要使用一个不同的轮密钥。轮密钥是通过对初始密钥进行一系列变换生成的,这个在后面的例子中详细介绍。根据AES标准规定,对于128位密钥,需生成10个轮密钥,用于不同轮次的AES加密操作。

2.2 AES计算步骤

流程图如下:
在这里插入图片描述
这些步骤需要依次对每个块进行操作。成功加密每个块后,将它们组合在一起形成最终的密文。具体步骤如下:

(1)添加轮密钥(Add Round Key)
使用生成的第一个密钥(K0),通过与状态数组中存储的块数据进行异或运算。将得到的状态数组作为下一步的输入。
在这里插入图片描述
(2)字节替换(Sub-Bytes)
在这个步骤中,将状态数组的每个字节转换为十六进制,分为两个4位的数。通过一个替代盒(S-Box)映射生成最终状态数组的新值,其中高四位(行数)和低四位(列数)作为索引,在S-Box中查找对应的字节进行替换。
在这里插入图片描述
(3)行移位(Shift Rows)
它交换行元素之间的位置。第一行不动,第二行循环左移1位,第三行循环左移2位,第四行循环左移3位。
在这里插入图片描述
(4)列混合变换(Mix Columns)
将一个预定义的常数矩阵与状态数组中的每一列进行乘法运算,从而得到下一状态数组中的新列。通过对状态数组中的所有列都执行与相同常数矩阵的乘法运算,最终得到下一步的状态数组。这个步骤在最后一轮中不执行。在这里插入图片描述

  • 注意:这里的运算并不是传统的矩阵乘法,这个在后面的例子中讲解

(5)添加轮密钥(Add Round Key)
将轮次对应的密钥与前一步得到的状态数组进行异或运算。如果这是最后一轮,则得到的状态数组将成为特定块的密文;否则,它将作为下一轮的新状态数组输入。
在这里插入图片描述

2.3 实例

假设明文为Two One Nine Two,而加密密钥为Thats my Kung fu,我们需要使用它们的16进制来进行计算,它们的长度都是128bit,如下图所示:
在这里插入图片描述
接着我们生成接下来10轮的扩展密钥(轮密钥):
在这里插入图片描述
所有的轮密钥都是从Round 0密钥进行扩展的,首先将每一列从0开始索引:
在这里插入图片描述
我们根据以下公式可以一列一列地求出后面的轮密钥:
如果这个索引不是4的倍数,则 W i = W i − 4 ⊕ W i − 1 W_i=W_{i-4} \oplus W_{i-1} Wi=Wi4Wi1
如果索引是4的倍数,则 W i = W i − 4 ⊕ T ( W i − 1 ) W_i=W_{i-4} \oplus T(W_{i-1}) Wi=Wi4T(Wi1)。其中T函数包括:
①字循环:假设 W i − 1 W_{i-1} Wi1从上到下为 [ a 1 , a 2 , a 3 , a 4 ] [a_1,a_2,a_3,a_4] [a1,a2,a3,a4],则字循环后为 [ a 2 , a 3 , a 4 , a 1 ] [a_2,a_3,a_4,a_1] [a2,a3,a4,a1]
②字节代换:将字循环的结果使用S盒进行字节代换
③轮常量异或:将字循环的结果、字节代换的结果和轮常量三者进行异或得到最终的 T ( W i − 1 ) T(W_{i-1}) T(Wi1),其中轮常量是一个固定的10×4的矩阵

(1)添加轮密钥(Add Round Key)
在这里插入图片描述
(2)字节替换(Sub-Bytes):通过一个16x16的S-Box进行字节替换
这里就不列出S-Box的原型了,假设最终的结果如下:
在这里插入图片描述
(3)行移位(Shift Rows)
在这里插入图片描述
(4)列混合变换(Mix Columns)
在这里插入图片描述
这里以得出状态矩阵的第一个元素0xBA为例,看看是怎么计算得到的:
res  = ( 2 × 0 x 63 ) + ( 3 × 0 x 2 F ) + 0 x A F + 0 x A 2 = 0 x B A \text { res }=(2\times0\text{x}63)+(3 \times0\text{x}2 F)+0\text{x}A F+0\text{x}A 2=0\text{x}B A  res =(2×0x63)+(3×0x2F)+0xAF+0xA2=0xBA
根据AES的规定,这里有两个地方需要转化:第一个加法需要转为异或运算,第二个乘法的运算的转换有些复杂,规则如下:
( 00000010 ) × ( a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 ) = { ( a 6 a 5 a 4 a 3 a 2 a 1 a 0 0 ) , a 7 = 0 ( a 6 a 5 a 4 a 3 a 2 a 1 a 0 0 ) ⊕ ( 00011011 ) , a 7 = 1 ( 00000011 ) × ( a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 ) = [ ( 00000010 ) ⊕ ( 00000001 ) ] × ( a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 ) = [ ( 00000010 ) × ( a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 ) ] ⊕ ( a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0 ) \begin{aligned} & (00000010) \times\left(a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0\right)=\left\{\begin{array}{c} \left(a_6 a_5 a_4 a_3 a_2 a_1 a_0 0\right), a_7=0 \\ \left(a_6 a_5 a_4 a_3 a_2 a_1 a_0 0\right) \oplus(00011011), a_7=1 \end{array}\right. \\ & (00000011) \times\left(a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0\right)=[(00000010) \oplus(00000001)] \times\left(a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0\right) \\ & =\left[(00000010) \times\left(a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0\right)\right] \oplus\left(a_7 a_6 a_5 a_4 a_3 a_2 a_1 a_0\right) \end{aligned} (00000010)×(a7a6a5a4a3a2a1a0)={(a6a5a4a3a2a1a00),a7=0(a6a5a4a3a2a1a00)(00011011),a7=1(00000011)×(a7a6a5a4a3a2a1a0)=[(00000010)(00000001)]×(a7a6a5a4a3a2a1a0)=[(00000010)×(a7a6a5a4a3a2a1a0)](a7a6a5a4a3a2a1a0)
乘法运算需要将数转化为二进制,上图中第一个公式为2乘以一个uint8的数的规则。第二行为3乘以一个uint8的数的规则,实际上就是根据乘法分配率转变为第一个公式。
我们现在就来计算一下上面的两个乘法:
2 × 0 x 63 = ( 00000010 ) b × ( 01100011 ) b = ( 11000110 ) b = 0 × C 6 3 × 0 x 2 F = [ ( 00000010 ) b × ( 00101111 ) b ] ⊕ ( 0010111 ) b = ( 01011110 ) b ⊕ ( 00101111 ) b = ( 01110001 ) b = 0 × 71 res  = 0 x C 6 ⊕ 0 x 71 ⊕ 0 x A F ⊕ 0 x A 2 = 0 x B A \begin{aligned} & 2\times0\text{x}63=(00000010) b\times(01100011) b=(11000110) b=0 \times C 6 \\ & 3\times0\text{x}2 F=\left[(00000010) b\times(00101111) b\right]\oplus(0010111) b=(01011110) b\oplus(00101111) b=(01110001) b=0 \times 71 \\ & \text { res }=0\text{x}C 6\oplus0 \text{x}71\oplus 0\text{x}A F{ }\oplus 0\text{x}A 2=0 \text{x}B A \end{aligned} 2×0x63=(00000010)b×(01100011)b=(11000110)b=0×C63×0x2F=[(00000010)b×(00101111)b](0010111)b=(01011110)b(00101111)b=(01110001)b=0×71 res =0xC60x710xAF0xA2=0xBA

(5)添加轮密钥(Add Round Key):这一步异或上前面的Round 1密钥
在这里插入图片描述
这个状态数组将成为下一轮的输入,根据密钥的长度,重复上述步骤,直到完成第10轮,就得到了最终的密文。
在这里插入图片描述

3 总结

AES算法用于加密与解密数据,在计算机领域中具有高度的安全性和效率。AES算法的数据块大小为128位,密钥长度可以是128位、192位或256位。算法在加密过程中使用了不同的轮数,这些轮数也根据密钥长度的不同而有所变化。本文对AES加密的原理做了一个简单的介绍,并举了一个简单的例子。和我之前写的CRC、MD5的博客一样,有了原理后一定要在代码中实现,这才是理论的意义,这也能帮我们更深入地理解代码。所以下一节,我将深入地剖析一下AES的代码实现。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密

本插件可以在虚幻引擎中使用蓝图对字符串,字节数组,文件进行Base64的加密和解密。 目录 1. 节点说明 String To Base64 Base64 To String Binary To Base64 Base64 To Binary File To Base64 Base64 To File 2. 案例演示 3. 插件下载 1. 节点说…

普罗米修斯之一实现图形化监控

普罗米修斯之一实现图形化监控 1:prometheus1. 下载:2. 安装:3. 启动:1:启动方式之一加入systemctl2:启动方式之二---直接启动3:启动方式之三----后台运行 4:默认配置文件prometheus…

Idea使用Docker插件实现maven打包自动构建镜像

Docker 开启TCP 服务 vi /lib/systemd/system/docker.service改写以下内容 ExecStart/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock重启服务 #重新加载配置文件 systemctl daemon-reload #重启服务 systemctl restart docker.service此时docker已…

考研408 | 【计算机网络】物理层

导图: 一、通信基础 基本概念: 物理层接口特性:物理层解决如何在连接各种计算机的传输媒体上传输数据比特流,而不是指具体的传输媒体。 物理层主要任务:确定与传输媒体接口有关的一些特性 典型的数据通信模型 数据通…

Springboot中拦截GET请求获取请求参数验证合法性

目录 目的 核心方法 完整代码 创建拦截器 注册拦截器 测试效果 目的 在Springboot中创建拦截器拦截所有GET类型请求,获取请求参数验证内容合法性防止SQL注入(该方法仅适用拦截GET类型请求,POST类型请求参数是在body中,所以下面…

WhatsApp 实时聊天小插件:快速触达客户的秘密

当您进入商店时,您希望销售人员会向您打招呼,或者至少在您需要时可以找到人提供帮助。对于电子商务商店,客户的期望不会降低。但谁应该担任 24-7的商店经理?实时聊天可以成为您的电子商务商店经理。 什么是 WhatsApp 实时聊天小插…

MySQL 索引 详解

一、索引概述 索引是帮助 MySQL 高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上…

XML(eXtensible Markup Language)

目录 为什么需要XML? 一 XML语法 1.文档声明 2.元素 语法: 3.属性 4.注释 5.CDATA节 二 树结构 三 转义字符 四 DOM4J 1.XML解析技术 2.dom4j介绍 3.dom4j基本使用 XML 指可扩展标记语言(eXtensible Markup Language)。 XML 被设计用来传…

Redux中reducer 中为什么每次都要返回新的state!!!

Redux中reducer 中为什么每次都要返回新的state!!! 最近在学习react相关的知识,学习redux的时候遇到看到一个面试题: 如果Redux没返回新的数据会怎样? 这就是要去纠结为什么编写reducer得时候为什么不允许直…

【数学】CF1796 C

Problem - 1796C - Codeforces 题意&#xff1a; 思路&#xff1a; 模拟一下样例可以发现一些规律 Code&#xff1a; #include <bits/stdc.h>#define int long longusing i64 long long;constexpr int N 1e6 10; constexpr int mod 998244353;void solve() {int l…

自定义注解(Annontation)

目录 1.注解定义 2.元注解定义 3. 自定义注解&#xff08;自定义的注解名称相同的会覆盖原注解&#xff09; 4.Annotation架构&#xff08;元注解参数介绍&#xff09; 1.注解定义 注解是用来将任何的信息或元数据&#xff08;metadata&#xff09;与程序元素&#xff08;类…

激荡十三年,消费金融进入“体验争夺战”的下半场

消费金融行业又开始涌动着变局。 先是一些老玩家悬着的心&#xff0c;终于落地。过去两年&#xff0c;消费金融是蚂蚁集团整改的关键板块。前不久&#xff0c;蚂蚁集团被监管部门开出71.23亿元的“罚单”&#xff0c;市场普遍认为这是利空出尽的信号。 与此同时&#xff0c;竞…

【RTT驱动框架分析06】-pwn驱动框架分析+pwm驱动实现

pwm pwm应用程序开发 访问 PWM 设备API 应用程序通过 RT-Thread 提供的 PWM 设备管理接口来访问 PWM 设备硬件&#xff0c;相关接口如下所示&#xff1a; 函数描述rt_device_find()根据 PWM 设备名称查找设备获取设备句柄rt_pwm_set()设置 PWM 周期和脉冲宽度rt_pwm_enable…

PyTorch 微调终极指南:第 2 部分 — 提高模型准确性

一、说明 如今&#xff0c;在训练深度学习模型时&#xff0c;通过在自己的数据上微调预训练模型来迁移学习已成为首选方法。通过微调这些模型&#xff0c;我们可以利用他们的专业知识并使其适应我们的特定任务&#xff0c;从而节省宝贵的时间和计算资源。本文分为四个部分&…

使用 `nmcli` 在 CentOS 8 上添加永久路由

CentOS 8 使用 NetworkManager 作为默认的网络管理工具&#xff0c;因此我们可以使用 nmcli 工具来实现相同的目标。使用 nmcli 可以更加直观地管理路由&#xff0c;并且更符合 CentOS 8 的默认网络管理方式。 以下是使用 nmcli 在 CentOS 8 上添加永久路由的步骤&#xff1a;…

Linux 的基本使用

1、Linux 是什么 Linux 是一个操作系统. 和 Windows 是 "并列" 的关系 Linux 严格意义来说只是一个 "操作系统内核". 一个完整的操作系统 操作系统内核 配套的应用程序. CentOS 和 RedHat 的关系 RedHat一直都提供源代码的发行方式&#xff0c;Cent…

杭电多校 Rikka with Square Numbers 费马平方和定理

&#x1f468;‍&#x1f3eb; Rikka with Square Numbers &#x1f9c0; 参考题解 &#x1f37b; AC code import java.util.Scanner;public class Main {static boolean isSqu(int x){int t (int) Math.sqrt(x);return t * t x;}public static void main(String[] args…

CSS-grid布局

网格布局也叫grid布局&#xff0c;平常写样式的时候基本上都是用的flex布局。 像以下布局&#xff0c;用flex布局就可能会有有点麻烦&#xff0c;这时候用grid布局就方便的多了。 或者是照片墙 grid布局就是将容器划分为行和列&#xff0c;产生单元格&#xff0c;然后在指定的…

代码审计-Thinkphp框架审计前置知识点

代码审计必备知识点&#xff1a; 1、代码审计开始前准备&#xff1a; 环境搭建使用&#xff0c;工具插件安装使用&#xff0c;掌握各种漏洞原理及利用,代码开发类知识点。 2、代码审计前信息收集&#xff1a; 审计目标的程序名&#xff0c;版本&#xff0c;当前环境(系统,中间件…

iconfont 使用

官网地址 iconfont-阿里巴巴矢量图标库 常规操作&#xff1a;注册账号 首页 搜索想要的图片 加入购物车并添加项目没有就创建一个 在线生成链接 复制生成的css 在前端软件创建相关的wxss文件 全局 import "/static/iconfont/iconfont.wxss";page {height: 100%; }…