赞
踩
由于DES加密算法被破解了,3DES加密算法虽然没有被破解,但是3DES算法的加解密效率低,所有现在都使用AES算法。
AES加密算法是密码学中的高级加密标准,AES为分组加密法,把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文,在AES标准规范中,分组长度只能是128位,AES是按照字节进行加密的,也就是说每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。这导致密钥长度不同,推荐加密的轮数也不同。
AES算法思想:
1)设计简单;
2)在多个平台上速度快,编码紧凑;
3)抵抗所有已知攻击;
4)没有采用Feistel结构,轮函数由3个不同的可逆均匀变换构成:非线性层、线性混合层和密钥加层。
明文P需要分组,称为状态,状态用以字节为元素的矩阵阵列表示,如图所示:
16字节明文按照此顺序放入矩阵,规则为:从上到下,从左到右,依次进行。
同样的,密钥K也需要分组,原理与明文P相同,下图为128位密钥矩阵:
下图为AES加密流程:
加密过程:C=E(K,P),其中C为加密后的密文,K为密钥,P为明文,E为加密函数。
解密过程:P=D(K,P),其中D为解密函数,解密过程为加密过程的逆运算。
AES的具体加密流程如下图所示:
AES加密过程通过四个步骤实现:字节替换、行移位、列混淆和轮密钥加。
注意: 根据密钥长度不同,加密的轮数也不同,在第一轮之前要进行轮密钥加,最后一轮没有进行列混淆操作。
我们来解释一下这四个步骤的具体含义:
字节替换: 属于非线性替换,具体原理就是通过一个替换表(S盒)对每个字节进行替换,实际上就是一个查表操作,并且此过程可逆,将每一个字节的前4位作为行值,后4位作为列值,去S盒查找,进行输出。
下图为S盒(x表示行,y表示列),例如字节为0x14,那么前四位的16进制为1,后四位的16进制为4,去查找s盒中的第1行第4列的值,可以看出为0xfa,就把原先的字节0x14替换为0xfa。
解密过程与此相同,唯一就是采用的是逆S盒。
接下来是行位移操作
对于4*4的矩阵,操作为:
第0行:保持不动;
第1行:循环左移1个字节;
第2行:循环左移2个字节;
第3行:循环左移3个字节。
解密过程变为循环右移,每行移动字节数与加密过程相同,下图为列位移示意图。
接下来是列混淆操作
实际上为44的矩阵与另一个44矩阵异或相乘(注意为右乘操作),重新得到一个4*4的矩阵,如下图所示。
解密过程为重新与此矩阵异或,因为两次异或得到的值为原数据本身。
最后为轮密钥加操作
轮密钥与状态矩阵进行逐比特异或操作。
这个轮密钥是由种子密钥通过密钥编排算法得到的,并且轮密钥长度与分组长度相同。
解密过程与之相同,两次异或得到原始数据。
密钥编排算法基本原则
1)轮密钥的比特数等于分组长度乘以轮数加1;
例如:将128位比特明文进行加密,总共需要(10+1)*128=1408比特密钥。
2)种子密钥扩展为扩展密钥;
3)轮密钥从扩展密钥中取,第一轮取扩展密钥的第0~3列,依次类推。
过程为:
定义:w[0]~w[3]为初始密钥
如果i=4的倍数,即i为每组的第一列,则执行以下3个步骤
1)将w[i-1]循环左移一个字节:
w[0] | w[1] | w[2] | w[3] | w[4] |
---|---|---|---|---|
2b | 28 | ab | 09 | cf |
7e | ae | f7 | cf | 4f |
15 | d2 | 15 | 4f | 3c |
16 | a6 | 88 | 3c | 09 |
w’[i]=w[i-1]左移一个字节得到。
w’[4]=w[3]左移一个字节得到={09,cf,4f,3c}左移一个字节={cf,4f,3c,09}
2)分别对w’[i]的每个字节进行S盒替换,本质上就是查表,再替换为另一个字节。
即查表后为w’‘[i]。
例如,w’[4]查表后的w’'[4]={8a,84,eb,01},需s盒的自行查看。
3)将前两步的结果同轮常量Rcon[j]进行异或,j表示轮数,Rcon[j]如下图所示
j | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
Rcon[j] | 01 00 00 00 | 02 00 00 00 | 04 00 00 00 | 08 00 00 00 | 10 00 00 00 |
j | 6 | 7 | 8 | 9 | 10 |
Rcon[j] | 20 00 00 00 | 40 00 00 00 | 80 00 00 00 | 1B 00 00 00 | 36 00 00 00 |
那么w[i]=w[i-4]⊕w’[i]⊕Rcon[j],此时j=1,因为为第一轮。
即w[4]=w[0]⊕w’‘[4]⊕Rcon[1],
那么w[8]=w[4]⊕w’'[8]⊕Rcon[2],……
如果i≠4的倍数,即i为每组的第二、三、四列,则执行以下一个步骤
即w[i]=w[i-4]⊕w[i-1]
例如w[5]=w[1]⊕w[4],w[6]=w[2]⊕[5],……
最终的到一个扩展密钥:{w[4],w[5],w[6],w[7]},之后的每一轮密钥都是在前一轮基础上形成的。
可能说的不是很明白,后续将会补充。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。