注:以下内容参考《新编密码学》范九伦 张雪锋 侯红霞 编著
4.3 高级数据加密标准------AES
随着DES被成功破解,美国国家标准技术研究所(NIST)于1997年发起征集DES替代算法------高级加密标准(AES)的活动。征集要求如下:
-
对称分组加密,可变密钥长度(128、192或256位),分组长度128位。
-
比三重DES更快,至少与三重DES一样安全。
-
可公开且全球免费使用。
-
至少30年内安全。
1998年,NIST从15个候选算法中选出5个:MARS、RC6、Rijndael、Serpent、Twofish。2000年10月2日,Rijndael(读作"rain-doll")胜出,成为AES。该算法由比利时密码学家Daemen和Rijmen提出。
AES可用ASIC或FPGA硬件实现,后者更灵活。
4.3.1 AES数学基础
AES将1字节视为有限域GF(2⁸)中的元素,对应的多项式为:
b₇x⁷+b₆x⁶+b₅x⁵+b₄x⁴+b₃x³+b₂x²+b₁x+b₀
-
多项式加法 :对应系数模2加(即异或)。
例4.3 :23⊕64=47。
-
多项式乘法 :模不可约多项式m(x)=x⁸+x⁴+x³+x+1。
例4.4:23×64的计算过程。

- x乘法:定义为x⋅B(x),若b₇=0则左移一位;若b₇=1则左移一位后再异或00011011。记02⋅B(x)=xtime(B(x))。

- 系数在GF(2⁸)上的多项式:4字节向量表示为a(x)=a₃x³+a₂x²+a₁x+a₀。乘法模M(x)=x⁴+1,结果可表示为矩阵乘法。

4.3.2 AES的描述
AES是迭代分组密码,分组长度和密钥长度均可独立指定为128、192或256位,对应轮数为10、12、14。AES不使用Feistel结构,而是采用"替换---列混合---密钥加"的轮结构。

AES-128加密流程(分组128位,10轮):
-
初始密钥加(AddRoundkey)。
-
前9轮:字节代换(ByteSubs)→ 行移位(ShiftRows)→ 列混合(MixColumns)→ 密钥加。
-
第10轮:字节代换 → 行移位 → 密钥加(无列混合)。
-
输出密文。
内部函数:
- ByteSubs(S-盒):对State每个字节进行非线性替换,定义为y=Ax^(−1)+b,等价于查表4-9。该变换可逆。

等价于下图给出的AES算法中"S-盒"对x进行代换的结果


一个简单的验证如下:

- ShiftRows:State矩阵第0行不变,第1行左移1字节,第2行左移2字节,第3行左移3字节。可逆。

-
MixColumns:对State的每一列左乘固定矩阵C(模x⁴+1):

可逆,因为C(x)与x⁴+1互素。
-
AddRoundkey:State与轮密钥逐字节异或。
加密示例(十六进制输入):


经过S-盒、行移位、列混合、密钥加等操作,第一轮后128位中有76位发生改变,充分体现了雪崩效应。
4.3.3 AES的密钥生成
以128位种子密钥为例,给出产生11个轮密钥的方法。初始密钥 key 按照字节划分为 key[0]、key[1]、...、key[15],因为密钥编排算法是以字为基础的(每个字包含32位),所以每一个轮密钥由4个字组成,11个轮密钥共包含 44 个字,表示为 w[0],w[1],......w[43],轮密钥生成过程中,首先将密钥按矩阵的列进行分组,然后添加40个新列来进行扩充。如果前4个列(即由密钥给定的那些列)为 w[0]、x[1]、w[2]、w[3],那么新列以递归的方式产生。具体算法步骤如下:。
步骤:
1、初始化函数RCon[i](i=1,...,10):

2、对于i=0到3:

对于i=4到43:

其中:
-
RotWord:循环左移1字节
-
SubWord:对每个字节应用S-盒
-
RCon[i]:轮常数(如RCon[1]=01000000, RCon[2]=02000000, ...)

示例:

4.3.4 AES的安全性分析
-
AES无弱密钥,能抵御差分分析、线性分析、相关密钥攻击等已知攻击。
-
目前最有效的攻击仍是穷举搜索。
-
已有攻击方法(如不可能差分、平方攻击、冲突攻击)可破解6-7轮AES-128/192,但无法破解完整10轮AES-128。
4.4 IDEA算法
国际数据加密标准(IDEA)由来学嘉博士和James Massey于1990年提出,1992年完善。IDEA内置于PGP中。
参数:
-
分组长度:64位
-
密钥长度:128位
-
轮数:8轮
特点:
-
不使用Feistel结构。
-
使用三种不兼容的运算:异或⊕、模2¹⁶加法+、模2¹⁶+1乘法⊙。
-
MA盒(乘加结构)提供扩散,可抵抗差分分析和线性分析。
加密流程(图4-19):

-
64位明文分为4个16位子分组X₁,X₂,X₃,X₄。
-
每轮使用6个16位子密钥,执行一系列⊕、+、⊙运算。
-
每轮结束时交换中间两个子分组(最后一轮除外)。
-
8轮后,进行最终输出变换(4个子密钥),得到密文。
子密钥生成:
-
128位初始密钥分成8个16位子密钥,作为第1轮的Z₁(1)至Z₆(1)和第2轮的Z₁(2),Z₂(2)。
-
循环左移25位后继续生成后续子密钥,共需52个子密钥。
4.5 RC5算法
RC5由Ron Rivest提出,是一种参数可变的分组密码。
参数(表4-11):

-
w:字长(16/32/64),分组长度为2w
-
r:轮数(0~255)
-
b:密钥字节数(0~255)
记为RC5-w/r/b,如RC5-32/12/16。
基本运算:异或⊕、模2^w加法+、循环移位(移位位数依赖于数据)。
子密钥生成:
-
生成t=2r+2个子密钥,存入数组S。
-
初始化常数Pw,Qw(表4-12),然后与密钥L混合生成最终S。

加密(两个w位寄存器A、B):
A=A+S[0],B=B+S[i]
for i = 1 to r:
A=((A⊕B)≪B)+S[2i],B=((B⊕A)≪A)+S[2i+1]
解密为逆过程。
特点:
-
算法简单,适合软硬件实现。
-
移位位数依赖于数据,增强非线性。
-
能抵抗线性和差分密码分析。
注:以上内容的理解和计算,如果有任何错误,希望各位读者和大佬指出改正,非常感谢!!!