AES加密算法和原理
.
本文包括:AES架构,AES加解密四大阶段,密钥扩展。
Rijndeal是AES于2000年最终选取的密码算法,出自比利时的密码学家。
.
.
AES分类
名字 | AES-128 | AES-196 | AES-256 |
---|---|---|---|
明文分组长度 /位 | 128 | 128 | 128 |
密钥长度 /位 | 128 | 196 | 256 |
迭代轮数 | 10 | 12 | 14 |
密钥越长,越难破译,可惜效率也会越低。后面仅讨论 AES-128。
复习一下DES:
明文分组64位,密钥也64位(实际56位+8位校验位)
.
.
AES-128架构
加密:
- 明文分组——128bit。
- 密钥扩展——K0到K10,一共11个K
- 初始变换——明文 ⊕ K0
- 9轮迭代,每轮包括4个步骤——字节替换,行移位,列混淆,轮密钥加。
- 第10轮迭代,仅3个步骤——字节替换,行变换,轮密钥加。
解密:
- 密文分组——128bit。
- 密文 ⊕ K10 (对应初始变换)。
- 9轮迭代——逆行移位,逆字节替换,轮密钥加,逆列混淆。
- 第10轮迭代——逆行移位,逆字节替换,轮密钥加
.
.
.
AES加/解密 四大阶段
1.字节替换
- 一句话:查S盒。
之前我们学过的DES轮函数,包括 扩展,异或密钥,S盒压缩和P盒置换 四个阶段,这里面用到的S盒和本文的可不一样。
AES的S盒是单独定义的,是一个16 * 16个字节的矩阵。
一个明文分组有16个字节(128bit),把每4个字节排成一行(也称为1个字),排成4 * 4的样子。如图中的S0,0,S0,1,…,S3,3,逐个字节替换。
因为一个16进制数是4bit,所以1字节(8bit)的数据可以表示2个16进制的数。比如上图中的S1,1
查表:S1,1里面这两个16进制数,处于高位(左边)的作为X输入(第几行);处于低位的作为Y输入(第几列)。如上图所示
下图是S盒的表格
示例:
- {86}被映射到{44}。
- {B4}映射到{8D}。
【大括号里的数是16进制】
.
S盒的构造:
- S盒的每个字节映射为它在GF(28)中的逆,其中{00}映射成{00}。这是非线性的,也是加密中唯一的非线性阶段。
.
s盒构造:
- 初始化:构建16*16的S盒。对第y行,第x列的位置,设定初值为{yx}。
- 在GF(28)中求{yx}的逆。【求逆可参见:扩展的欧几里得算法和AES的S-BOX】
- 对2.的结果矩阵变换(可逆)。
- 将列向量(二进制数)转为字节(16进制数),并填充至(y,x)。
矩阵运算如图,注意:b7到b0是由下到上 倒序排列的。
构造栗子:
- 取输入{95}
- {95}的逆为{8A}={10001010}
- M * [0 1 0 1 0 0 0 1]T+[1 1 0 0 0 1 1 0]T
- 结果化成16进制,等于{2A}
逆S盒的构造:
- 将字节转为列向量
- 对1.的结果异或,用逆矩阵变换
- 将列向量转为字节
- 在GF(28)中求{yx}的逆
- 填入逆S盒的对应位置
S盒的特点:
- 输出位和输入位相关性很低
- 输出值不是输入值的线性数学函数,而是——乘法逆
- 没有不动点
有限域的乘法逆是一种非线性变换?
.
.
.
2.行移位
第一行 不动;
第二行 左移一位;
第三行 左移二位;
第四行 左移三位。
so easy~
.
逆变换:
第一行 不动;
第二行 右移一位;
第三行 右移二位;
第四行 右移三位。
Also very simple~
.
.
.
3.列混淆
每一列都分别去左乘此矩阵,得到的结果仍是列向量,再分别放回原位置,就结束啦。
不过,换个思路,更简单粗暴一点,如下图:
注意:我们用到的加法和乘法都是定义在GF(28)上的,即加法=异或,乘法=拆分+移位+取模+异或合并。具体请参考 AES加密之 有限域GF(2^n)算术
.
此矩阵的选择是基于码字间有最大距离的线性编码,即混淆性更好。
列混淆和行移位在几轮迭代以后,所有的输入位和输出位都是相关的。
.
逆 列混淆:
再左乘上面矩阵的逆矩阵。
验证还原:
.
.
.
4.轮密钥加
- 此阶段是加密/解密中 唯 一 用到了密钥的环节。
一句话:按位异或。
逆轮密钥加和轮密钥加变换是一样的,因为异或操作是本身的逆。
举个栗子吧
加密中一轮迭代的总结构图
.
.
.
AES-128密钥扩展
密钥扩展算法输入16字节,输出16*11=176字节。
- 输入密钥直接被复制到W0到W3
- 每行最后一个W,如W3,经过g函数,变成W '。
- W4n = W ’ ⊕ W4n-4 , [ n = 1,2,3… …10 ],(每行第一个W)
- Wm = Wm-1 ⊕ Wm-4 ,[ m ≠ 4n ],上方异或左方,(每行后三个W)
- 循环3.4.步骤,直至W43运算完毕。 [ 因为44/4=11组子密钥 ] [ 11=1+9+1 ]
- 输出。
W代表一列的 K(4个字节)
.
.
g函数:
K包含128bit数据,W包含32bit(4个字节)数据。记这4个字节分别为B0,B1,B2,B3
- B 循环左移一位。
- 四个B分别用S盒替换。(同加密第一阶段 字节替换 中的S盒)
- 与轮常量Rcon[ j ] 异或。(消除对称性)
- 输出。
Rcon [ j ] :
Rcon [ j ] = ( Rc [ j ] , 0 , 0 , 0 )
Rc [ 1 ] = 1,Rc [ n ] = 2 * Rc [ n-1 ] 。
【2是(10),左移一位】【乘法定义在GF(2^8)里】
Rc [ n ] 的值(16进制):
n | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Rc | 01 | 02 | 04 | 08 | 10 | 20 | 40 | 80 | 1B | 36 |
密钥扩展总结
- 足够的非线性,以防止轮密钥的差异 完全取决于密钥本身。(S盒,轮常量)
.
雪崩效应
• 当明文改变1位,大约1半密文被改变
• 当密钥改变1位,大约1半密文被改变
目前没有针对Rijndeal的有效攻击
.
补充
- Rijndael允许块长度为128、192或256位。 AES仅允许一个块长度为128位。
.
.
.
.
.
写的太慢了
.
.
.
.
.
.
AES加密算法和原理相关推荐
- AES 加密算法的原理详解
本文转载https://blog.csdn.net/gulang03/article/details/81175854 本教程摘选自 https://blog.csdn.net/qq_28205153 ...
- AES加密算法工作原理
密码学博大精深,这里所说的AES加密算法原理可以理解为AES工作流程,至于为什么这么设计,这么设计为什么是安全的,有待今后的学习与思考. 分组密码设计的两个原则 分组密码设计的两个原则:混淆(conf ...
- 什么是AES加密?详解AES加密算法原理流程
在密码学中,加密算法分为双向加密和单向加密.单向加密包括MD5.SHA等摘要算法,它们是不可逆的.双向加密包括对称加密和非对称加密,对称加密包括AES加密.DES加密等.双向加密是可逆的,存在密文的密 ...
- JS 与 JAVA 跨语言实现 RSA 和 AES加密算法
简介: 开发中为了数据的安全性使用加密算法对数据进行加密是一种很常见的情况,但就一种语言来说,直接使用提供的相应的库进行少许封装是一件很容易的事.但是在一些情况下我们可能需要跨语言来实现,比如前后端分 ...
- AES加密算法原理及java android实现
AES当今最流行的对称加密算法之一,是DES的替代者. 密钥是AES算法实现加密和解密的根本.对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥. AES支持三种长度的密钥: ...
- AES加密算法原理及python实现
AES加密算法原理及python实现 AES对称加密算法 1.Rijndael的设计思想 2.AES的基本结构 3.加密解密的详细结构 4.四种轮操作 1.字节代换(SubBytes) 2.行移位操作 ...
- AES加密算法原理分析
明文:任何人见字符(文)知意:暗文:没有密钥解码则见字符(文)不知意. AES(Advanced Encryption Standard)高级加密标准为常见的对称型加密算法(微信小程序加密传输是用AE ...
- AES加密算法原理解析
转自: https://blog.csdn.net/qq_28205153/article/details/55798628 AES简介 高级加密标准(AES,Advanced Encryption ...
- (4)AES分组加密算法(原理详解)
说明:本内容参考B站UP主"可厉害的土豆"的视频讲解,强烈推荐一下该宝藏UP主 [AES加密算法]| AES加密过程详解| 对称加密| Rijndael-128| 密码学| 信息安 ...
最新文章
- 【转】sql if else 语句
- 1034 有理数四则运算 (20 分)(c语言)(测试点三)
- Initializer provides no value for this binding element and the binding element has no default value
- python解密_python在加密解密中的例子(尽可能去深挖)
- 第一篇:对Adaboost和GBDT的学习
- jieba库分词词频统计
- apollo修改配置刷新bean_携程开源的分布式apollo技术整合springboot集成实现动态刷新配置
- 小王,在 Java 中如何利用 redis 实现一个分布式锁服务呢???
- 江苏专转本计算机考试模拟试卷,江苏专转本计算机模拟试题 11
- Mysql主键和外键
- 差分进化算法求解函数最优解matlab实现
- 第九部分 项目沟通管理
- 支付清算体系介绍(下)
- 电气器件系列二十四:电子式压力传感器PPG-D(1)
- 法新社:谷歌Android成为CES展会明星 微软Windows遭冷落
- OpenGL 版本升级
- 2.8 其他快速入门必要知识
- 聊天机器人—简介(一)
- Namesilo域名注册购买教程
- 关于音频情感分类的随笔(2)
热门文章
- c语言1GB转成B,2018职称计算机考试WPS_Office精选习题9
- 苹果付费app共享公众号_【苹果iOS付费游戏应用帐号分享】新增一款25元iOS游戏应用共享帐号...
- excel两个表格内容合并
- python黑科技:让你无所遁形,附源码!
- kubernetes apiserver源码分析二之路由
- filebeat报错error pipeline/output.go:100 failed to connect to backoff(async(tcp://xx.xx.xx.xx:))...
- 正雅齿科运用新数字技术为正畸行业开辟新空间
- 玩家交互体验—剑网3聊天系统
- win7系统如何搜索计算机,win7怎样搜索文件?win7系统准确搜索文件的方法
- python中s和t是两个集合、对s|t描述正确的是_S和T是两个集合,对ST的描述正确的是...