分组密码AES和DES

DES

DES是一种典型的Feistel结构密码体制,它使用长度为56比特的密钥加密(解密)长度为64比特的明文(密文),获得长度为64比特的密文(明文)。其加密流程如下:

1.传入64比特的明文,进行IP置换

2.通过密钥扩展算法获得轮密钥,扩展算法为:将初始密钥进行PC-1置换后得到$C_0,D_0$两部分,再进行本轮的循环移位后进入PC-2置换(从56比特选取48比特)得到轮密钥。下一轮的轮密钥和上一轮的轮密钥关系为:

3.初始置换后的明文分为左右两部分,进入轮密钥控制的16次F函数(轮函数)迭代(Feistel结构),前十五次的迭代方式为:$Li=R{i-1},Ri=L{i-1}+F(R_{i-1},K_i)$,最后一次的迭代方式稍稍不一样,为:

这里的”+”代表异或,最后一次不同的原因是为了保证加解密的一致性——若加密采用的轮密钥为$(K1,K_2,…,K{16})$,则解密采用轮密钥为$(K{16},K{15},…,K_1)$,并且加解密流程采用完全相同的结构和轮函数

4.进行初始逆置换$IP^{-1}$,得到密文

核心轮函数F

1.将输入的32比特通过扩展函数E变为48比特

2.将得到的48比特与子密钥异或后进入S盒,作为S盒的输入

3.S盒是一个非线性变换,它将输入通过8个并置的6进4出(比特位)的S盒压缩成32比特。每个S盒都有一张替换表,替换表都有4行16列,对应前十六个整数(长度为4的比特串)的二进制整数全排列。设S盒的输入为$a_1a_2a_3a_4a_5a_6$,则$S(a_1a_2a_3a_4a_5a_6)$就是S盒表中第$a_1a_6$行和第$a_2a_3a_4a_5$列交叉的那个数,这里的$a_1a_6 $和$a_2a_3a_4a_5 $都是二进制整数

4.将S盒得到的32位比特输出作为输入进行P置换,P置换的结果就是轮函数的输出

AES

AES即美国国家高级加密标准($Advanced\ Encryption\ Standard$),其算法为$Rijndael$算法,分组长度通常为128比特,密钥长度通常也为128比特,加密轮数为10轮

加密步骤

首先将输入的明文分组为16个字节$a{00}a{10}a{20}a{30}a{01}a{11}a{21}a{31}a{02}a{12}a{22}a{32}a{03}a{13}a{23}a{33}$,并+按照顺序映射为状态字节矩阵,加密操作结束时,密文按同样顺序从状态抽取,映射顺序为:

1.由密钥拓展算法将128比特的种子密钥拓展成11个128比特的轮密钥,每一个轮密钥同样被表示成与明文状态矩阵大小相同的矩阵

2.进行初始白化:将明文状态矩阵与第0轮的轮密钥进行加法运算

3.进行完全相同的9轮变换,每一轮变换都是以上一轮的输出作为输入,依次执行字节替换、行移位、列混合和轮密钥加四种运算

4.最后一轮的迭代变换稍有不同,这一轮变换依次执行字节替换、行移位和轮密钥加,没有列混合

5.将最后一轮输出的结果按照顺序从状态中抽取出来就是密文

行移位

状态矩阵每一行按照不同的移位值进行循环左移

列混合(列混淆)

将状态矩阵每一列看作$GF(2^8)$域上的次数不超过3的多项式,与下列矩阵作乘法运算

轮密钥加

此处的加法应理解为域上的加法运算(与异或等价)

密钥扩展方案

待补充


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!