高级加密标准(Advanced Encryption Standard)

AES算法概述:

·分组加密算法:明文(128/256比特)和密文分组(128/192/256比特)可变长度。

·SPN结构:轮函数包含代换层一置换层一密钥混合层。

·密钥长度:128比特(AES的密钥空间:2^{128})。

·128比特:10轮。

 

AES算法的整体结构

AES算法的原型是square算法

AES是典型的SPN结构

  密钥长度(Nk) 块大小(Nb) 轮数(Nr)
AES-128 4 4 10
AES-192 6 4 12
AES-256 8 4 14

 

 

 

 

AES算法的轮函数(128bit输入->128bit输出)

 

由4个变换组成,依次为:     (两头  中间 变换不一样)

1)字节代换( SubByte)

  字节代换是非线形变换,独立地对状态的每个字节进行,代换表(即S-盒)是可逆的8比特输入,到8比特输出。

 

                  S盒

上述S-盒由以下两个变换的合成得到:

首先,将字节看作GF(28)(约化多项式m(x)=x8+x4+x3+x+1)上的元素:

S7S6S5S4S3S2S1S0->|S(x)

S(x)=S7x7+S6x6+S5x5+S4x4+S3x3+S2x2+S1x+S0

然后,映射到自己的乘法逆元,'00'映射到'00'。

s(x)|→>s(x)-1

最后,对字节做如下的(GF(2)上的,可逆的)仿射变换:

2)行移位( ShiftRow)

行移位是将状态阵列的各行进行循环移位,不同状态行的位移量不同:

第0行不移动,第1行循环左移C1个字节,第2行循环左移C2个字节,第3行循环左移C3个字节。

位移量C1、C2、C3的取值与N有关,由下表给出:

当Nb=4时(128bit),C1=1,C2=2,C3=3。

3)列混合( MixColumn)

列混合变换中,将状态阵列的每列视为(GF(28)4)上的多项式,再与ー个固定的多项式c(x)进行模x4+1乘法

Rijndael的设计者给出的c(x)为(系数用十六进制数表示):

c(x)='03'x3+'01'x2+'01'x+'02'

 

设b(x)=c(x)ⓧa(x),则:

 

 

4)密钥加( AddRoundkey)

密钥加是将轮密钥简单地与状态进行逐比特异或.轮密钥由种子密钥通过密钥编排算法得到

 

AES算法的密钥编排算法

 密钥编排指从种子密钥得到轮密钥的过程,AES的密钥编排由密钥扩展轮密钥选取两部分组成,其基本原则如下:

1)轮密钥的总比特数等于轮数加1再乘以分组长度;如128比特的明文经过10轮的加密,则总共需要(10+1)*128=1408比特的密钥(128bit的种子密钥->1408bit的轮密钥)

2)种子密钥被扩展成为扩展密钥

3)轮密钥从扩展密钥中取,其中第1轮轮密钥取扩展密钥的前N个字,第2轮轮密钥取接下来的N字,依次类推

 

密钥扩展

扩展密钥是以4字节字为元素的一维阵列,表示为W[Nb*(Nr+1)],其中前N个字取为种子密钥,以后每个字按递归方式定义.扩展算法根据Nk≤6和Nk>6有所不同。

轮密钥选取

轮密钥i(即第i个轮密钥)由轮密钥缓冲字W[Nb*i]到W[Nb*(i+1)]给出

AES的解密变换

AES解密运算是加密运算的逆运算,其中轮函数的逆为:

1) Bytesub的逆变换由代换表的逆表做字节代换,也可通过如下两步实现:首先进行仿射变换的逆变换,再求每一字节在GF(28)上逆元

2)行移位运算的逆变换是循环右移,位移量与左移时相同.

3)列混合运算的逆运算是类似的,即每列都用一个特定的多项式d(x)相乘,d(x)满足(03x3+01x2+01x+02) d(x)=01

由此可得d(x)=0BX3+0DX2+09X+OE

4)密钥加运算的逆运算是其自身

posted @ 2020-04-26 11:55  SjYu  阅读(938)  评论(0编辑  收藏  举报