AES内部加密原理

时间:2024-03-27 19:04:24

0x01 AES概述

高级加密标准Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦*采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称**加密中最流行的算法之一。

在这里需要指出的一点就是秘钥长度为128bit的Rijndael加密法被称为标准AES,说起AES,我们一般认为它的的秘钥长度为128bit。

AES要加密的明文数据必须为128bit,不足的会填充。秘钥长度为128bit、192bit、256bit。AES加密包含很多轮的操作,每轮又包含四层(最后一轮只有三层)。

AES输入输出参数

AES内部加密原理

Key length (秘钥长度) Number of rounds (轮数) Number of key(子秘钥个数)
128bit 10 11
192bit 12 13
256bit 14 15

0x02内部结构

AES内部加密原理

  • Byte Substitution layer (字节替换层)
  • Diffusion layer (混淆层)
    • ShiftRows Sublayer (行移位子层)
    • MixColumn Sublayer (列混合子层)
  • Key Addition layer (子秘钥相加层)

为了理解数据在AES中是如何移动的,我们假设这样一个state(状态矩阵):
AES内部加密原理

将128bit的明文数据想象为一个4*4的矩阵,矩阵中A0~A15是16个字节。

Byte Substitution layer (字节替换层)

该层包含有一个S-Boxes ,它有三个特点:

  1. 唯一且非线性
  2. 双射的(唯一可逆)
  3. 任何输入值都不等于输出值

这层软硬件实现都很简单,查表替换即可。

例如:输入值Ai=(C2)hex经过S-Box字节替换得到输出值(25)hex

S((C2)hex)=(25)hex

Diffusion layer (扩散层)

不像S-Box,混淆层表现一种线性操作,

DIFF(A) + DIFF(B) = DIFF(A + B)

该层包含两个子层:

  • ShiftRows Sublayer (行移位子层):在一个字节层上置换数据
  • MixColumn Sublayer (列混合子层):结合(混合)四个字节块的矩阵操作
ShiftRows Sublayer (行移位子层)

查找替换表
AES内部加密原理
输入矩阵:
AES内部加密原理

输出矩阵:
AES内部加密原理

注意:这里的shift是循环左移。

MixColumn Sublayer (列混合子层)
  • 混合状态矩阵(state)每一列的线性操作

  • 主扩散元素

  • 每4字节一列乘以一个4*4混合矩阵,如:
    AES内部加密原理
    这里01、02、03是十六进制表示法。

  • 所有的运算都是在GF(2^8)上进行。

系数在GF(2^8)上的多项式

•在AES的列混合操作中,将4个字节构成的向量看成系数在GF(28)上的次数小于4的多项式 。

  • 多项式的加法:

    就是对应系数相加;换句话说,多项式的加法就是4字节向量的逐比特异或

  • 多项式的乘法 :

    必须要取模m(x)=x4x^4+1,这样使得次数小于4的多项式的乘积仍然是一个次数小于4的多项式

将多项式的模m(x)=x4x^4+1乘运算记为⊗,设

a(x)= a3x3a_3x^3+a2x2a_2x^2+a1xa_1x+a0a_0

b(x)= b3x3b_3x^3+b2x2b_2x^2+b1xb_1x+b0b_0

c(x)= a(x)⊗b(x)=c3x3c_3x^3+c2x2c_2x^2+c1xc_1x+c0c_0(modx4x^4 +1)

由于xjx^j mod (x4x^4+1)=xjmod4x^{j mod 4}(j > 4),所以
AES内部加密原理

即:

c0c_0=a0b0a_0b_0a3b1a_3b_1a2b2a_2b_2a1b3a_1b_3

c1c_1= a1b0a_1b_0a0b1a_0b_1a3b2a_3b_2a2b3a_2b_3

c2c_2= a2b0a_2b_0a1b1a_1b_1a0b2a_0b_2a3b3a_3b_3

c3c_3= a3b0a_3b_0a2b1a_2b_1a1b2a_1b_2a0b3a_0b_3

列混合的数学本质

将状态矩阵的每列视为系数在GF(282^8)上的一元三次多项式,再与一个固定的系数在GF(282^8)上的一元三次多项式a(x)进行模x4x^4+1乘法

​ a(x) = 03x303x^3+01x201x^2+01x01x+02

a(x)是模x4x^4+1可逆的多项式(即a(x)是与x4x^4+1互素的),否则列混合变换就是不可逆的。

举例:

B=(25,25,…,25)

在GF(282^8)上只需要计算02•25和03•25,

25hex25_{hex}化为多项式为x5x^5+x2x^2+1

所以:

02•25=x•(x5x^5+x2x^2+1)=x6x^6+x3x^3+x1x^1

03•25=(x+1)•(x5x^5+x2x^2+1)=x6x^6+x5x^5+x3x^3+x2x^2+x1x^1+1

01•25 = x5x^5+ x2x^2 +1

01•25 = x5x^5+ x2x^2 +1

02•25 =x6x^6+ x3x^3 +x1x^1

03•25 =x6x^6+x5x^5 +x3x^3+x2x^2+x1x^1+1

CiC_i = x5x^5 +x2x^2 +1

所以输出的tate是C=(25,25,…,25)

xtime()运算

xtime()运算用于快速计算在GF(282^8)的乘法运算。

例如:0x57 • 0x13

0x57=(01010111)2{(01010111)}_2=x6x^6+x4x^4+x2x^2+x+1

0x13=(00010011)2{(00010011)}_2=x4x^4+x+1

使用xtime()运算求上式:

xtime(0x57):01010111 (最高位为0,直接左移,低位补0) 得到x•0x57=1010 1110

10101110 (最高位为1,左移后与0x1B异或) 得到x2x^2•0x57=0100 0111

01000111 (最高位为0,直接左移,低位补0) 得到x3x^3•0x57=1000 1110

10001110 (最高位为1,左移后与0x1B异或) 得到x4x^4•0x57=0000 0111

所以:

0x57•0x13=0x57•(x4x^4+x+1)
=(00000111)2{(0000 0111)}_2+(10101110)2{(1010 1110)}_2+(01010111)2{(01010111)}_2
=(11110110)2{(1111 0110)}_2
=x7x^7+x6x^6+x5x^5+x4x^4+x2x^2+x