信息安全密码学高级加密标准AES


AES

简介

数据加密标准(DES)的密钥长度是56比特,算法的理论安全强度是256,随着计算机的发展,DES变得不够安全,1997年1月,美国国家标准技术研究所(NIST)宣布征集高级加密标准(AES),用于取代DES。最终Rijndael、Serpent、Twofist、RC6、MARS五种算法进入最后一轮,经过安全性分析、软硬件性能评估等步骤,Rijndael获胜。该算法是一个分组密码算法族,分组长度包括128bit、160bit、192bit、224bit、256bit五种,密钥长度也包括这五种长度,但是最终AES选择了分组长度为128bit,密钥长度分为128bit、192bit、256bit三种版本。三种版本的思路基本一样,密钥扩展算法的过程略有不同,加解密的轮数适当增加,但是操作是一致的。AES算法是一个分组密码,属于对称密码范畴。


算法流程

AES加密算法包含4个操作:字节替代(SubBytes)、位移位(ShiftRows)、列混淆(MixColumns)和轮密钥加。解密算法的每一步对应加密算法的逆操作;加解密所有操作的顺序正好相反。加解密中每轮的的密钥分别由种子密钥经过密钥扩展算法得到。算法中的16字节的明文、密文和轮子密钥都用一个4*4的矩阵表示。
AES算法加解密流程图

操作1:字节替代

字节替代主要是通过S盒完成一个字节到另外一个字节的映射。下面的两张图分别为S盒和S-1(S盒的逆)。S盒用于提供密码算法的混淆性。
S盒
S盒的逆
S盒和S盒的逆都是16*16的矩阵,完成8bit输入到8bit输出的映射,输入的高4bit对应的值为行标,低4bit的值为列标,假定输入字节的值为a=a7a6a5a4a3a2a1a0,则输出的值为S[a7a6a5a4][a3a2a1a0],S-1的变换也同理。

S盒的构造方法
  1. 按字节值的升序逐行初始化S盒。第一行是{00},{01},{02},…,{0F};第二行是{10},{11},{12},…,{1F}…直至第16行。因此在第y+1行第x+1列的字节值为{yx}。
  2. 把S盒中每个字节映射为它在有限域GF(28)中的逆,如{00}被映射为{00}。
  3. 把S盒中每个字节的8个构成位分别记为(b1,b2,b3,b4,b5,b6,b7,b8)。对每个字节的每个构成位做如下操作: b i ′ = b i ⨁ b ( i + 4 ) m o d 8 ⨁ b ( i + 5 ) m o d 8 ⨁ b ( i + 6 ) m o d 8 ⨁ b ( i + 7 ) m o d 8 ⨁ c i b_{i}^{'}=b_i \bigoplus b_{(i+4) mod 8} \bigoplus b_{(i+5) mod 8} \bigoplus b_{(i+6) mod 8} \bigoplus b_{(i+7) mod 8} \bigoplus c_i bi=bib(i+4)mod8b(i+5)mod8b(i+6)mod8b(i+7)mod8ci其中ci是指值为{63}的字节c的第i位。符号(’)表示变量的值要被等式右边的值更新。

操作2:行移位

行移位是一个4*4的矩阵内部字节之间的置换,用于提供算法的扩散性。

正向行移位

正向行移位用于加密,其原理图如下。
正向行移位原理
其中第一行保持不变,第二行循环左移8bit,第三行循环左移16bit,第四行循环左移24bit。
假定矩阵为s,用公式表示如下: s [ i ] [ j ] = s [ i ] [ ( i + j ) s[i][j] = s[i][(i+j) % 4] s[i][j]=s[i][(i+j),其中i、j均属于[0, 3]。

逆向行移位

逆向行移位是正向行移位的相反的操作,即:第一行保持不变,第二行循环右移8bit,第三行循环右移16bit,第四行循环右移24bit。

操作3:列混淆

利用GF(28)域算数特性的一个代替,同样用于提供算法的扩散性。

正向列混淆

正向列混淆原理图如下。
正向列混淆原理图
根据矩阵的乘法可知,在列混淆过程中,每个字节对应的值只与该列的4个值有关。此处的乘法和加法都是定义在GF(28)域上的,需要注意如下几点:

  1. 将某个字节所对应的值乘以2,其结果就是该值的二进制位左移一位,如果原始值的最高位为1.则还需要将移位后的结果异或;
  2. 乘法对加法满足分配率;
  3. 此处的矩阵乘法与传统意义上的乘法有所不同,各个值在相加时使用的是模28加法(异或运算)。
逆向列混淆

是正向列混淆的逆变换,经过一次逆向列混淆后即可恢复原文。

操作4:轮密钥加

原理是“任何数和自身的异或结果为0”。加密过程中,每轮的输入与轮子密钥异或一次,因此解密时,再异或该轮子密钥即可恢复。

密钥扩展算法

密钥扩展算法原理图

  1. 将种子密钥按图a的格式排列,其中k0、k1、…、k15依次表示种子密钥的一个字节;排列后用4个32bit的字表示,分别记为w[0]、w[1]、w[2]、w[3];
  2. 按照如下方式,依次求解w[j,其中j是整数并且属于[4, 43];
  3. 若j%4=0,则 w [ j ] = w [ j − 4 ] ⨁ g ( w [ j − 1 ] ) w[j] = w[j-4]\bigoplus g(w[j-1]) w[j]=w[j4]g(w[j1]),否则 w [ j ] = w [ j − 4 ] ⨁ w [ j − 1 w[j] = w[j-4]\bigoplus w[j-1 w[j]=w[j4]w[j1,其中函数g的流程如下:将w循环左移8bit;分别对每个字节做S盒置换;与32bit的常量进行异或。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值