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

AES(对称加密)学习记录

简单了解

之前学到的RSA加密是非对称加密,而AES则是对称加密,区分点在于AES加密解密过程中用的密钥是相同的。这里记明文为P,密文为C,密钥为K。支持的密钥K的长度有128位,192位,256位。

加密:C = E(P,K),E为加密函数

解密:P = D(C,K),D为解密函数

大致加密过程

AES加密过程使用的是分组加密,即把明文P分成n组,对n组明文分别使用密钥K加密得到n组密文,将n组密文组合就得到了最终的密文C。且对每一组明文有长度要求,即128bit位(16个字节,每个字节8位)。可以知道,加密得到的每一组密文的长度也是128bit位。

明文填充

加密过程中,很可能出现明文长度不为128整数倍的情况,这就不能保证每一组的明文长度一致,这时就需要进行填充了。填充的方法有这么几种:NoPadding、PKCS#5、PKCS#7、ISO 10126、ANSI X9.23、ZerosPadding 。可以知道,如果在加密的时候,如果使用了某种填充方法,对应解密也需要用对应的填充方法。

填充方法解释

NoPadding:不填充,只能加密长为128bits倍数的信息,很少使用。

PKCS#5、PKCS#7:缺几个字节,就补充几个字节,且补充的值为缺失字节的数量。举例:{1,2,3,4,5,a,b,c,d,e},缺少6个字节,则补全为{1,2,3,4,5,a,b,c,d,e,6,6,6,6,6,6}

ISO 10126:最后一个字节是填充的字节数(包括最后一字节),其他全部填随机数

ANSI X9.23: 类似于ISO 10126,只不过ANSI X9.23其他字节填的都是0而不是随机数

ZerosPadding:全部填充0x00,无论缺多少全部填充0x00

详细加密过程

四个步骤:字节替换、行移位、列合和轮密钥加

注:根据密钥长度不同,加密的轮数也不同,128位的密钥推荐加密轮数为10,192位的密钥推荐加密轮数为12,256位的密钥推荐加密轮数为14在第一轮之前要进行轮密钥加,即将明文矩阵与密钥矩阵进行异或操作。最后一轮没有进行列混合操作。 

1、字节替换

通过一个替换表(S盒)对每个字节进行替换,且过程是可逆的,将每一个字节的前4位作为行值,后4位作为列值,到t查找,进行输出。
下图为S盒,例如字节为0x16,那么前四位的16进制为1,后四位的16进制为6,去查找S盒中的第1行第6列的值,可以看出为0x47,就把原先的字节0x16替换为0x47。
查看源图像

解密过程就是用逆盒进行相同的操作。

2、行移位

将16位的明文P分成16组,放入4*4的矩阵中:

a_{00}a_{01}a_{02}a_{03}
a_{10}a_{11}a_{12}a_{13}
a_{20}a_{21}a_{22}a_{23}
a_{30}a_{31}a_{32}a_{33}

顺序位从上到下,从左到右

加密行移位操作:第0行:保持不动;
                             第1行:循环左移1个字节;
                             第2行:循环左移2个字节;
                             第3行:循环左移3个字节。

移位后的明文矩阵:

a_{00}a_{01}a_{02}a_{03}

 a_{11}

 a_{12}

a_{13}

 a_{10}

 a_{22}

 a_{23}

a_{20}a_{21}

 a_{33}

a_{30}

 a_{31}

 a_{32}

解密操作对应进行右移即可。

3、列混合

加密过程:将得到的状态矩阵左乘另一个给定的4*4的矩阵,即给定矩阵*经过行移位的矩阵

解密过程:只需再次与相乘的矩阵进行异或即可

需要注意的是,这里的矩阵相乘与普通的矩阵相乘不大一样,举例操作:假设给定矩阵第一行为

{02 03 01 01},经过行移位的矩阵的第一列为{d4 bf 5d 30},相乘得到:02*d4⊕03*bf⊕5d⊕30,

对02*d4,计算过程为: 

换成二进制形式,(00000010) * (11010100),d4的二进制最高位为1,此时将d4左移一位再与00011011异或,即(00000010) * (11010100) = (10101000) ⊕ (00011011) = 10110011

若右边的二进制最高位为0,则结果直接为右边的二进制左移一位,即不需再与(00011011)异或。

对03*bf,计算过程为:

换成二进制形式,((00000010)⊕(00000001))*(10111111),bf的二进制最高位也为1,将bf左移一位再与00011011相异或,

即((00000010)⊕(00000001))*(10111111) = (01111110) ⊕ (00011011) = 11011010

对01*5d,就等于5d,二进制为01011101

对01*30,就等于30,二进制为00110000

最后将每一步的结果进行异或:10110011110110100101110100110000 = 00000100 = 04

4、轮密钥加 

将经过列混合的矩阵与轮密钥矩阵,每一列对应进行异或操作。而轮密钥矩阵是通过最开始的密钥矩阵经过密钥扩展得到的。之前说到128位的密钥推荐加密轮数为10,而每一轮都会得到一个轮密钥。

综上,总体过程为:

(一)将明文矩阵与子密钥矩阵进行异或操作

(二)将得到的矩阵进行上述1、2、3、4操作9次

(三)最后进行第10轮循环,只进行1、2、4操作

操作结束后即为密文矩阵

那10轮循环过程中的轮密钥怎么得来的呢---密钥扩展

密钥扩展 

将子密钥K分组,放入矩阵中去:

k_{00}k_{01}k_{02}k_{03}
k_{10}k_{11}k_{12}k_{13}
k_{20}k_{21}k_{22}k_{23}
k_{30}k_{31}k_{32}k_{33}

记每一列为Wi,补上扩展部分:

W1W2W3W4Wi-1Wi

1、如果i不是4的倍数,则Wi的计算公式为:

Wi = W[i-4] ⊕ W[i-1]

2、如果i是4的倍数,则Wi的计算公式为:

Wi = W[i-4] ⊕ T(W[i-1]),这里用到了T函数,T函数由三部分组成:字循环、字节代换、轮常量异或。

字循环:将一个字中的4个字节循环左移一个字节,如{a0,a1,a2,a3}变为{a1,a2,a3,a0}

字节代换:对经过字循环的结果使用S盒进行字节代换

轮常量异或:轮常量是给定的,将上一步得到的结果,与轮常量R[j]异或,j表示轮数

学习思路参考:http://t.csdn.cn/8cmGx 、http://t.csdn.cn/sAj7P

相关文章:

  • 【技术推荐】WebLogic 反序列化漏洞深入分析
  • 提高 IDC 网络带宽利用率
  • JavaWeb综合案例(黑马程序员2021年JavaWeb课程总结,所有功能均实现,包含数据库sql文件)
  • 卫星通信系统按照工作轨道分类
  • JDBC在idea上的配置
  • Kotlin协程:MutableStateFlow的实现原理
  • ElasticSearch入门笔记
  • Pytorch 自动求导的设计与实现
  • 抖音怎么开启直播
  • 【Servlet】Servlet API
  • 关于makefile
  • C语言 变量的存储和引用,内部和外部函数
  • 仿真1 - takeoff_land
  • 基于C语言的图论汇编
  • 非自交任意多边形与矩形框的交集面积计算方法
  • ES6指北【2】—— 箭头函数
  • $translatePartialLoader加载失败及解决方式
  • 10个最佳ES6特性 ES7与ES8的特性
  • cookie和session
  • HTML中设置input等文本框为不可操作
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • react 代码优化(一) ——事件处理
  • react-native 安卓真机环境搭建
  • scala基础语法(二)
  • TiDB 源码阅读系列文章(十)Chunk 和执行框架简介
  • vue数据传递--我有特殊的实现技巧
  • Web标准制定过程
  • 动态魔术使用DBMS_SQL
  • 聚簇索引和非聚簇索引
  • 排序算法之--选择排序
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 算法系列——算法入门之递归分而治之思想的实现
  • 我的zsh配置, 2019最新方案
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 在Mac OS X上安装 Ruby运行环境
  • Hibernate主键生成策略及选择
  • ​​快速排序(四)——挖坑法,前后指针法与非递归
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • ​如何在iOS手机上查看应用日志
  • #NOIP 2014# day.2 T2 寻找道路
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (SpringBoot)第二章:Spring创建和使用
  • (力扣)1314.矩阵区域和
  • (六)Hibernate的二级缓存
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)Scala的“=”符号简介
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Core、DNX、DNU、DNVM、MVC6学习资料
  • .NET Micro Framework初体验(二)
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc