应用密码学——AES加密过程

AES算法的加密过程:
①明文初始状态矩阵的构建

将明文进行分组,将128bit划分为16byte,在一个4X4矩阵中按照列优先的顺序填充

②字节替代(s盒替换)

将状态中的每一个字节在S盒中映射为另一个字节

映射方法为:输入的前一个字节指定在S盒中的行值,后一个字节指定在S盒中的列值

例如:输入为80,则在S盒中映射为行数8列数0的字节

在S盒中的字节替代实际上是包括两个代数运算:

在有限域GF(2^8)上求乘法逆(2)在GF(2)上进行如下仿射变换:bi’ = bi⊕b[(i+4)mod8] ⊕b[(i+5)mod8] ⊕b[(i+6)mod8] ⊕b[(i+7)mod8] ⊕ci,其中ci是01100011中第i位的值,

步骤(2)也可用矩阵预算来表示

下面我们通过一个实际例子来具体体会一下字节替代(此处略去已知S盒表格,通过查表的方法进行字节替代)

例:输入字符为F5,求它通过字节替代后为多少?

解:

1)在有限域GF2^8)上求乘法逆

① 写出该字节(16进制表示)的对应二进制

F5 = 11110101

 由该二进制写出对应的多项式

F(F5) = x^7 + x^6 + x^5 + x^4 + x^2 + 1,也即11110101从低位依次对应i * x^y中的i,x^y对应该低位的权重

③ 计算该多项式的逆元

x^7 + x^6 + x^5 + x^4 + x^2 + 1* a(x) = 1 mod p(x), p(x)在有限域GF2^8)上固定为x^8 + x^4 + x^3 +x + 1

计算a(x):采用多项式的欧几里得扩展算法,此处不在赘述怎么使用多项式的欧几里得扩展算法,如有不会可以参考:http://t.csdnimg.cn/c4RkS

  得出逆元多项式转为为对应的二进制

通过计算可以知悉:a(x) = x^6 + x^2 + x,其对应的二进制为:1000110,填充为8bit为:01000110,对应16进制数为:46

2)在GF(2)上进行如下仿射变换

写出原始矩阵,再填入对应数据

        原始矩阵如上图所示,b0……b7 = 01100010 (a(x)的填充8bit二进制码的反向)

矩阵相乘计算结果

例如:b’0 = 1 * 0 + 0 * 1 + 0 * 1 + 0 * 0 + 1 * 0 + 1 * 0 + 1 * 1 + 1 * 0 + 1

注意:图中给出矩阵的第一行:10001111,实际上是一个一行八列,只是书籍篇幅有限每个数据之间并没有间隔,但为了理解建议分开写[1 0 0 0 1 1 1 1],再与列相乘

将得出的b’0……b’7转换为16进制数

运算结果为:11100110 = E6

行移位

        行移位进行的操作为:将状态矩阵的每一行以字节为单位进行循环左移,每一行的循环左移的偏移量由行号和列数确定

  •  列混合

列混合进行的操作为:将输入的状态矩阵的每一列与固定多项式a(x)在有限域GF(2^8)上相乘,然后模多项式想x^4 + 1,其中a(x) = {03}x^3 + {01}x^2 +{01}x + {02},计算矩阵为如下所示:

简化运算方法:GF(28)上域元素的乘

GF(28) 上还定义了一个运算,称之为x乘法,设:

例如:

轮密钥加

轮密钥加进行的操作为:将列混合的输出状态矩阵与子密钥状态进行异或运算(子密钥是初始密钥派生而来)

⑤ 密钥扩展

算法的密钥同样以字节为单位进行变换,用一个4行的二维阵列来表示。密钥按照矩阵的列进行分组,密钥长度等于明文分组长度乘以轮数加1,即密钥比特数长度=明文分组长度*(轮数Round+1)

操作流程:
①构造密钥初始状态矩阵

例:现有一个密钥

k0 k1 k2 k3 k4 k5 k6 k7 k8 k9 k10 k11 k12 k13 k14 k15 k16 k17 k18 k19 k20 k21 k22 k23(byte)

它的初始状态矩阵为:

其中密钥列数由:密钥长度(bit)/ 32确定,但每一列均为4个bit

②计算新列Ki

  1. 若i不是4的倍数,则Ki = Ki-4 Ki-1 (为异或符号)
  2. 若i是4的倍数,则Ki = Ki-4 T(Ki-1)
  3. 计算T(Ki-1),方法如下                                                                                                                   ①以字节为单位循环左移一位                                                                                                    ②将循环后的输出进行字节替代(S盒替换)                                                                                ③根据Rcon常量查表得到Rcon[i / Nk], Nk为密钥列数                                                              ④将2与3的结果异或

③得出结果

例子:

  • 11
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值