IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> AES(对称加密)学习记录 -> 正文阅读

[网络协议]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

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章           查看所有文章
加:2022-09-25 23:23:31  更:2022-09-25 23:24:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/19 0:23:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码