AES(Advanced Encryption Standard)算法是一种对称加密算法,由美国国家标准与技术研究院(NIST)在2001年发布,旨在取代早期的数据加密标准(DES),并提供更高的安全性,目前该算法被广泛应用于各种安全需求中,AES算法以其高度的安全性和效率成为目前最流行的对称加密算法之一。
其实网络上有很多前辈已经写了很多关于AES加密算法,模式,填充规则等文章,但是大家的侧重点不同,在系统学习时很难把这些知识串起来,所以才有了本系列对AES不同加密算法,加密模式,加密原理,填充算法及AES-CMAC算法的系统介绍,本文先对AES加密过程及模式进行介绍,本文大纲如下:
AES加密函数为E,则 C = E(K, P),其中P为明文,K为密钥,C为密文。
AES解密函数为D,则 P = D(K, C),其中C为密文,K为密钥,P为明文。
AES根据密钥长度的不同有:AES128,AES192,AES256三种算法,对应的密钥长度分别对应于AES-128、AES-192和AES-256三种变体,区别如下:
在加密前首先需要选择加密模式及当最后一个block需要填充时的填充算法,之后即可开始密钥扩展,对明文分组处理及多轮加密的操作。
根据密钥,通过密钥扩展算法扩展生成每一轮操作所需的子密钥。扩展密钥生成方式:
AES首先将初始密钥输入到一个4*4的状态矩阵中,k0~k15,将每一列的字节组成一个字,如k0~k4,组成W[0],接着将W数组扩充四十个新列,构成44列扩展密钥数组。
1.如果i不是4的倍数,那么第i列由如下等式确定:W[i]=W[i-4]⨁W[i-1];
2.如果i是4的倍数,那么第i列由如下等式确定:W[i]=W[i-4]⨁T(W[i-1]),其中,T是一个函数,由字循环、字节代换和轮常量异或部分组成。
将待加密的明文按照分组长度(128位)进行划分,得到多个分组,对于最后一组需要根据对应的填充规则进行填充。
对每个分组进行多轮的迭代操作,包括字节替代、行移位、列混淆和轮密钥加等步骤,最终得到密文。以AES128加密算法为例,其加密过程为:
1)在第一轮迭代之前,先将明文和原始密钥进行一次异或加密操作;
2)加密的第1轮到第9轮的轮函数一样,包括4个操作:字节代换、行位移、列混合和轮密钥加。
3)最后一轮加密字节代换、行位移和轮密钥加,但不执行列混合。
字节替换: 属于非线性替换,具体为通过一个替换表(S盒)对每个字节进行查表替换,查表时将每一个字节的前4位作为行值,后4位作为列值,去S盒查找,进行输出。
如下为S盒(x表示行,y表示列),例如字节为0x14,那么前四位的16进制为1,后四位的16进制为4,去查找s盒中的第1行第4列的值,可以看出为0xfa,就把原先的字节0x14替换为0xfa。
对于4*4的矩阵,操作为:第n行循环左移n个字节,如第0行保持不动,第1行循环左移1个字节,第2行则循环左移2个字节。解密过程变为循环右移,每行移动字节数与加密过程相同,如下为示意图。
实际上为4*4的矩阵与另一个4*4矩阵异或相乘(右乘操作),重新得到一个4*4的矩阵,如下图所示。
解密过程为重新与此矩阵异或,因为两次异或得到的值为原数据本身。
轮密钥与状态矩阵进行逐比特异或操作。轮密钥由1.2.2章节中种子密钥通过密钥编排算法得到的,并且轮密钥长度与分组长度相同。解密过程与之相同,两次异或得到原始数据。
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
点赞
https://cn-sec.com/archives/3829724.html
复制链接
复制链接
-
左青龙
- 微信扫一扫
-
-
右白虎
- 微信扫一扫
-
评论