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

AES笔记整理

文章目录

  • 1. 简介
  • 2. 密钥加法层
  • 2. 字节代换层
  • 3. 行位移 - ShiftRows
  • 4. 列混淆 - MixColumn
  • 5. 其他
    • 5.1列混淆矩阵乘法运算
    • 5.2 AES密钥生成
  • 6. 参考资料

以下内容为信息安全开发过程中,AES对称加密算法的笔记,大部分内容转载其他文章,若描述不清楚,可以直接看原文。

1. 简介

在这里插入图片描述

AES算法主要有四种操作处理,分别是密钥加法层(也叫轮密钥加,英文Add Round Key)、字节代换层(SubByte)、行位移层(Shift Rows)、列混淆层(Mix Column)。而明文x和密钥k都是由16个字节组成的数据(当然密钥还支持192位和256位的长度,暂时不考虑),它是按照字节的先后顺序从上到下、从左到右进行排列的。而加密出的密文读取顺序也是按照这个顺序读取的,相当于将数组还原成字符串的模样了,然后再解密的时候又是按照4·4数组处理的。AES算法在处理的轮数上只有最后一轮操作与前面的轮处理上有些许不同(最后一轮只是少了列混淆处理),在轮处理开始前还单独进行了一次轮密钥加的处理。在处理轮数上,我们只考虑128位密钥的10轮处理。
输入字节顺序
在这里插入图片描述
AES算法流程图

在这里插入图片描述
以下分别介绍密钥加法层(也叫轮密钥加,英文Add Round Key)、字节代换层(SubByte)、行位移层(Shift Rows)、列混淆层(Mix Column)、秘钥变换方法。

2. 密钥加法层

在密钥加法层中有两个输入的参数,分别是明文和子密钥k[0],而且这两个输入都是128位的。这里需要注意在扩展域中加减法操作和异或运算等价,所以这里的处理也就异常的简单了,只需要将两个输入的数据进行按字节异或操作就会得到运算的结果。
在这里插入图片描述

2. 字节代换层

字节代换层的主要功能就是让输入的数据通过S_box表完成从一个字节到另一个字节的映射,S_box表是一个拥有256个字节元素的数组,可以将其定义为一维数组,也可以将其定义为16·16的二维数组,如果将其定义为二维数组(目前看见的常规用法),读取S_box数据的方法就是要将输入数据的每个字节的高四位作为第一个下标,第四位作为第二个下标。逆S盒与S盒对应,用于解密时对数据处理,我们对解密时的程序处理称作逆字节代换,只是使用的代换表盒加密时不同而已。
S盒
在这里插入图片描述
Eg:输入数据为0x19,对应输出为0xD4(第1行,第9列)
逆S盒
在这里插入图片描述

3. 行位移 - ShiftRows

行位移操作最为简单,它是用来将输入数据作为一个4·4的字节矩阵进行处理的,然后将这个矩阵的字节进行位置上的置换。ShiftRows子层属于AES手动的扩散层,目的是将单个位上的变换扩散到影响整个状态,从而达到雪崩效应。在加密时行位移处理与解密时的处理相反,我们这里将解密时的处理称作逆行位移。它之所以称作行位移,是因为它只在4·4矩阵的行间进行操作,每行4字节的数据。在加密时,保持矩阵的第一行不变,第二行向左移动8Bit(一个字节)、第三行向左移动2个字节、第四行向左移动3个字节。而在解密时恰恰相反,依然保持第一行不变,将第二行向右移动一个字节、第三行右移2个字节、第四行右移3个字节。
在这里插入图片描述

4. 列混淆 - MixColumn

列混淆子层是AES算法中最为复杂的部分,属于扩散层,列混淆操作是AES算法中主要的扩散元素,它混淆了输入矩阵的每一列,使输入的每个字节都会影响到4个输出字节。
在加密的正向列混淆中,我们要将输入的4·4矩阵左乘一个给定的4·4矩阵。而它们之间的加法、乘法都在扩展域GF(2^8)中进行。
具体运算法则见:“列混淆矩阵乘法运算”

在这里插入图片描述
在这里插入图片描述
PS:在解密的逆向列混淆中与正向列混淆的不同之处在于使用的左乘矩阵不同,它与正向列混淆的左乘矩阵互为逆矩阵,也就是说,数据矩阵同时左乘这两个矩阵后,数据矩阵不会发生任何变化。
在这里插入图片描述

5. 其他

5.1列混淆矩阵乘法运算

注意正矩阵中只有0x01、0x02、0x03,0x01与任何数相乘不发生变换,0x02、0x03运算规则如下:
在这里插入图片描述
在这里插入图片描述

5.2 AES密钥生成

记子秘钥矩阵第一列为w0,第二列为w2,…,wi,w0~w3为初始秘钥矩阵,这里介绍i >= 4的计算方法(128对应i为9;196对应11;256对应为13)
在这里插入图片描述
具体框图如下:
在这里插入图片描述
G函数处理流程分为以下几步:
字循环:将1个字中的4个字节循环左移8bit(同“行移位”处理方式一致)
字节代换:对字循环的结果使用S盒字节代换
轮常量异或:将字节代换结果与轮系数进行异或(注意这里只与字节代换的最高byte进行异或)

在这里插入图片描述

6. 参考资料

  • https://zhuanlan.zhihu.com/p/78913397
  • https://www.bilibili.com/video/BV1i341187fK/?
http://www.lryc.cn/news/503765.html

相关文章:

  • Jmeter 性能压测-Tomcat连接数
  • 基于Vue3的组件封装技巧分享
  • python中r代表什么意思
  • 《量子计算对人工智能发展的深远影响》
  • 12.2【JAVA EXP4]next.js的各种问题,DEBUG,前端补强,前后端交互,springSecurity ,java 配置,h2数据库
  • docker启动一个helloworld(公司内网服务器)
  • 使用 Netty 实现 RPC 通信框架
  • 【机器学习06--贝叶斯分类器】
  • 创建vue3项目步骤以及安装第三方插件步骤【保姆级教程】
  • [146 LRU缓存](https://leetcode.cn/problems/lru-cache/)
  • 【Java Nio Netty】基于TCP的简单Netty自定义协议实现(万字,全篇例子)
  • 【JavaWeb后端学习笔记】Redis常用命令以及Java客户端操作Redis
  • pdb调试器详解
  • 项目15:简易扫雷--- 《跟着小王学Python·新手》
  • Flink CDC实时同步mysql数据
  • 题解 - 自然数无序拆分
  • dfs_bool_void 两种写法感悟
  • MySQL 主从复制与 Binlog 深度解析
  • 大连理工大学《2024年845自动控制原理真题》 (完整版)
  • Java性能调优 - 多线程性能调优
  • 行为树详解(4)——节点参数配置化
  • 计算机网络中的三大交换技术详解与实现
  • 《杨辉三角》
  • ARM学习(35)单元测试框架以及MinGW GCC覆盖率报告
  • 边缘计算+人工智能:让设备更聪明的秘密
  • neo4j知识图谱AOPC的安装方法
  • 图像分割数据集植物图像叶片健康状态分割数据集labelme格式180张3类别
  • Python学习(二)—— 基础语法(上)
  • Cesium-(Primitive)-(CircleOutlineGeometry)
  • 计算机网络技术基础:2.计算机网络的组成