AES加密算法(带示例)

article/2025/10/8 18:16:46

原创不易,转载请注明出处。

目录

1.算法简介

2.算法流程

2.2 轮密钥加

2.3 字节代替

2.4 行位移

2.5 列混淆

3.总结

附录A 运算示例

附录B 下载链接



1.算法简介

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

AES算法属于对称加密算法,是一个分组密码。AES加密算法分为3种,分别是AES-128,AES-192,AES-256。它们之间区别如表1-1所示。

                                                                        表1-1 3种AES加密算法区别

AES

密钥长度(bit

分组长度(bit

加密轮数

AES-128

128

128

10

AES-192

192

128

12

AES-256

256

128

14

本文以最常见的AES-128为例,详细介绍AES加密算法的加密流程。

2.算法流程

AES加密算法主要由4中操作组成:字节代替行位移列混淆轮密钥加。另外还需要对原始密钥进行扩展。主流程图如图2-1所示。

                                               图2-1 AES-128加密算法流程图

加密过程:首先明文进行1次轮密钥加;然后循环9轮字节代替、行位移、列混淆、轮密钥加;注意第10轮没有列混淆。

解密过程:解密过程与加密过程相反,这也是对称加密算法的特点。首先密文进行1次轮密钥加;然后循环9轮逆向行位移、逆向字节代替、轮密钥加、逆向列混淆;注意第10轮没有逆向列混淆。

接下来对每一个流程进行详细介绍。

2.1 扩展密钥

首先对16字节的原始密钥进行扩展,扩展密钥原理图如图2-2所示。

                                图2-2 扩展密钥原理图

  1. 首先需要将16字节原始密钥按列转换成4个32bit的字,即W[0],W[1],W[2],W[3]。
  2. 根据原理图和下式依次求解W[j],j=4……43。

        

函数g如图2-2b所示,具体流程如下:

2.1)将循环左移1字节;

2.2)分别对每个字节按S盒进行映射(S盒见图2-3);

2.3)映射后的值与32bit常量[RC[j/4],0,0,0]进行异或。RC实际只用到后10个字节,RC[0]没有用到,增加RC[0]是为了方便程序中用数组表示。

RC=[0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1B,0x36]

2.2 轮密钥加

在首次进行轮密钥加之前,要对16字节明文进行预处理,将其组成一个4*4的矩阵,然后与初始密钥进行异或运算。之后每次轮密钥加都是与对应扩展的密钥进行异或。

2.3 字节代替

字节代替是通过S盒映射完成的,S盒如图2-3所示。逆向字节代替是通过S盒的逆(S-1)映射完成的。S盒的逆如图2-4所示,其中的值都以16进制表示。

字节代替就是将字节的高4位作为行,低4位作为列,取S盒中对应的行列的值。

例如:字节0x19代替后的值为S(0x19)=S[0x1][0x9]=0xD4;再通过S-1即可替换为原来的值,S-1(0xD4)= S-1 [0xD][0x4]=0x19。

                                            图2-3 S盒(S-box)

                                           图2-4 S盒的逆(Inverse S-box)

2.4 行位移

1)正向行位移

第1行不变

第2行循环左移1字节

第3行循环左移2字节

第4行循环左移3字节

                            图2-5 正向行位移原理图

2)逆向行位移

第1行不变

第2行循环右移1字节

第3行循环右移2字节

第4行循环右移3字节

2.5 列混淆

利用GF(28)域上算术特性的一个代替。

1)正向列混淆

正向列混淆将数据左乘一个固定矩阵,原理图如图2-6所示。

                                     图2-6 正向列混淆原理图

此处的矩阵乘法不是一般数学意义上的相乘,而是定义在GF(28)上的乘法,需注意以下节点:

a)乘法满足分配率,如07*S­­­0,0=(010203)* S­­­0,0= S­­­0,0(02* S­­­0,0)(04*S­­­0,0)

b)加法为异或运算

c) 乘2就是将二进制左移1位,若原始的值最高位为1,需将移位后的结果异或00011011(若没有移位则不用异或00011011)。

举例:

02*d4=02*(1101 0100)B=(1010 1000)B(0001 1011)B=(1011 0011)B

03*bf=(0102)*bf=01*(1011 1111)B02*(1011 1111)B=(1011 1111)B(0111 1110)B(0001 1011)B=(1101 1010)B

01*5d=(0101 1101)B

01*30=(0011 0000)B

则:(1011 0011)B(1101 1010)B (0101 1101)B (0011 0000)B­=04

2)逆向列混淆

逆向列混淆原理图如图2-7所示。他与正向列混淆的差别仅仅是左乘的矩阵不同。正向列混淆与逆向列混淆左乘的矩阵,相乘之后为单位矩阵,所以逆向列混淆可以恢复原文。

3.总结

本文以AES-128为例,详细介绍了AES加密算法的流程,AES-192和AES-256与AES-128相似,只是密钥长度和加密轮数不一样。AES作为对称加密算法,加密和解密用相同密钥;加密速度快,适合用于经常发送数据的场合。

 

附录A 运算示例

输入消息(16字节)

0x32,0x43,0xf6,0xa8,0x88,0x5a,0x30,0x8d,

0x31,0x31,0x98,0xa2,0xe0,0x37,0x07,0x34

原始密钥(16字节)

0x2b,0x7e,0x15,0x16,0x28,0xae,0xd2,0xa6,

0xab,0xf7,0x15,0x88,0x09,0xcf,0x4f,0x3c

扩展密钥:

0x2b7e1516        0x28aed2a6         0xabf71588         0x09cf4f3c

0xa0fafe17          0x88542cb1        0x23a33939        0x2a6c7605

0xf2c295f2         0x7a96b943        0x5935807a        0x7359f67f

0x3d80477d        0x4716fe3e         0x1e237e44         0x6d7a883b

0xef44a541         0xa8525b7f         0xb671253b        0xdb0bad00

0xd4d1c6f8        0x7c839d87        0xcaf2b8bc         0x11f915bc

0x6d88a37a        0x110b3efd         0xdbf98641        0xca0093fd

0x4e54f70e         0x5f5fc9f3          0x84a64fb2         0x4ea6dc4f

0xead27321        0xb58dbad2        0x312bf560         0x7f8d292f

0xac7766f3         0x19fadc21         0x28d12941        0x575c006e

0xd014f9a8         0xc9ee2589         0xe13f0cc8         0xb6630ca6

先对明文进行1次轮密钥加

0x19,0x3d,0xe3,0xbe,0xa0,0xf4,0xe2,0x2b,

0x9a,0xc6,0x8d,0x2a,0xe9,0xf8,0x48,0x08

1轮:

字节代替后:

0xd4,0x27,0x11,0xae,0xe0,0xbf,0x98,0xf1,

0xb8,0xb4,0x5d,0xe5,0x1e,0x41,0x52,0x30

行位移后:

0xd4,0xbf,0x5d,0x30,0xe0,0xb4,0x52,0xae,

0xb8,0x41,0x11,0xf1,0x1e,0x27,0x98,0xe5

列混淆后:

0x04,0x66,0x81,0xe5,0xe0,0xcb,0x19,0x9a,

0x48,0xf8,0xd3,0x7a,0x28,0x06,0x26,0x4c

2-10

附录B 下载链接

https://download.csdn.net/download/u013073067/13138312

编译环境:VS2010

语言:C

原创不易,转载请注明出处。水平有限,欢迎大家批评指正。


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

相关文章

tinyproxy一直报错,无法连接

需要关闭防火墙 延迟0.2秒在启动,在一个配置文件

centos 安装tinyproxy 代理

安装 (服务器ip 33.22.33.22) yum -y install tinyproxy配置文件 /etc/tinyproxy/tinyproxy.conf User root Group root Port 8888 Timeout 600 DefaultErrorFile "/usr/local/tinyproxy/share/tinyproxy/default.html" StatFile "/usr/local/tinyproxy/sha…

Centos Tinyproxy 使用教程

安装 TinyProxy yum -y install tinyproxy 配置 TinyProxy vim /etc/tinyproxy/tinyproxy.conf 修改 Port 端口,默认为 8888 Port 8888 注释掉 Allow,表示放行所有 Allow 127.0.0.1 Allow 192.168.0.1 Allow xxx.xxx.xxx.xxx 隐藏掉Via请求头部&#xff…

Linux环境 tinyproxy安装配置及使用教程【超详细】

安装 # centos sudo yum install tinyproxy # ubuntu sudo apt install tinyproxy配置 vim /etc/tinyproxy/tinyproxy.conf需要修改的是: # 注释掉这一行 # Allow 127.0.0.1 # 修改端口号 Port 8787Allow 是允许访问的主机IP,不写就是允许所有主机访问…

CentOS 7 搭建 TinyProxy 代理

Tinyproxy是一个轻量级的用于POSIX操作系统的http/https代理守护进程。在设计之初就遵循着更快并且更小的原则。在相关的运用案例中,它是一种理想的解决方案,例如在一个需要全部HTTP代理特性的嵌入式部署的案例中。然而,对于需要更大的代理案…

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两…

centos7 搭建 tinyProxy代理

文章转载于:https://www.cnblogs.com/gezp/p/14962924.html 一、简介 Tinyproxy是一个轻量级的用于POSIX操作系统的http/https代理守护进程。在设计之初就遵循着更快并且更小的原则。在相关的运用案例中,它是一种理想的解决方案,例如在一个需…

使用TinyProxy搭建代理

本次基于Ubuntu 18.04搭建 0x01.下载TinyProxy(服务器) 步骤一:安装TinyProxy sudo apt install tinyproxy 步骤二:如 安装后提示 Use apt autoremove to remove them.错误 ,请先执行 sudo apt autoremove 命令,再执行sudo a…

Ubuntu tinyproxy

安装 yum install tinyproxy #失败 dnf install tinyproxy #失败yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm #成功 ubuntu 新系统 #设置密码 sudo passwd #登录 su #更新系统 apt-get update apt-get upgrade#安装tinyproxy apt-g…

利用tinyproxy云服务器配置成代理服务器

云服务配置成代理服务器 什么是正向代理? 简而言之就是: 隐藏自己的客户端,通过一个代理服务器来对目标服务器进行访问。服务器端不知道是你在对他进行请求访问。 如果一个服务器限制了ip来源,可以尝试使用正向代理来进行访问。 实战: 云服务器IP &…

腾讯云服务器Ubuntu、Centos7配置为代理服务器,使用tinyproxy

1.安装tinyproxy 1.1Ubuntu系统 apt-get install tinyproxy 1.2Centos7系统​​​​​​​ yum -y install tinyproxy 2.修改tinyproxy配置 vi /etc/tinyproxy/tinyproxy.conf 主要有两处配置 2.1端口配置 注意需要在你的防火墙中开启你设置的端口号 这是默认端口号…

轻量级的开源代理服务器Tinyproxy安装与配置

TinyProxy Tinyproxy 是一个面向 POSIX 系统开发的轻量级的开源 HTTP/HTTPS 代理守护进程,其从底层开始进行设计,保证了在高速的同时体积依然很小。它很适合用于需要完整 HTTP 代理特性,但系统资源又不足以运行大型代理的场景,比…

最新TinyProxy联通卡 停机卡tiny免流模式

tiny模式,默认接点,具体自测 首先下载tiny:https://wwa.lanzous.com/iV6Qdm8qgre 打开tiny,点击右上角将模式复制粘贴进去,完成保存,先查询现有的流量,然后下载一个小软件,过一段时…

java 取交集方法retainAll

java 取交集方法retainAll 有两个集合newCoures和oldCourses,判断这两个集合是否包含相同的对象或元素, 可以使用retainAll方法:oldCourses.retainAll(newCoures)。 如果存在相同元素,oldCourses中仅保留相同的元素。 如果不存…

Java List retainAll 记录坑

描述 我们知道使用List的retainAll方法可以获取两个集合的交集&#xff0c;但是在某些情况下方法的返回值并非我们想象那样。 现象 先看两个例子&#xff1a; public static void main(String[] args) {List<String> a new ArrayList<>();a.add("READ&quo…

关于ArrayList中的retainAll的一些思考

思考 我们都知道&#xff0c;比较两个对象的是否相同&#xff0c;一般是先通过hashcode方法比较hash值是否相等&#xff0c;如果相同&#xff08;哈希碰撞&#xff09;然后通过equals进行比较各个属性值是否相同&#xff0c;如果都相同&#xff0c;那么才是真正的相同。 我们…

java集合中retainAll方法

我们先来看看retainAll的源码 public boolean retainAll(Collection<?> c) {return batchRemove(c, true); } private boolean batchRemove(Collection<?> c, boolean complement) {//获得当前对象的所有元素final Object[] elementData this.elementData;//w…

Java取交集方法retainAll()

1 retainAll方法示例 如何判断一个集合与另外一个集合中有相同的元素 例如A.retainAll(B); 如果AB中有相同的元素&#xff0c;那么A中会保留相同的元素&#xff0c;将不同的元素移除 如果AB中没有相同的元素&#xff0c;那么会返回[] 当A中的元素有变化时会返回true&#…

Java中取多个集合的交集——retainAll()

Java中取多个集合的交集 集合 Collection 接口中定义了 retainAll()方法 retainAll() Retains only the elements in this set that are contained in the specified collection (optional operation). In other words, removes from this set all of its elements that are …