一、AES明文和密钥位数
RIJNDAEL 算法数据块长度和密钥长度都可独立地选定为大于等于 128 位且小于等于 256 位的 32 位的任意倍数。
而美国颁布 AES 时却规定数据块的长度为 128 位、密钥的长度可分别选择为 128 位, 192 位或 256 位
1.1 状态
(1)矩阵排序顺序
中间结果叫做状态,把状态表示为二维字节数组,矩阵中元素排序从上到下,从左到右
(2)元素、字节和字的概念
字节:即一个元素为八位
字:即一列,也就是四个字节
1.1.1 数据块状态
四行, Nb列。Nb等于数据块长度除以 32 (每个元素8位以16进制表示,以四行矩阵表示) ,数据块长度为128时,Nb=4。数据块长度为192时,Nb=6。数据块长度为 256 时, Nb=8 。(AES时Nb=4)
1.1.2 密钥状态
密钥与数据块相同,表示为Nk列
1.1.3 算法迭代圈数
算法的迭代圈数 Nr 由Nb和Nk共同决定:
二、算法结构
采用代替/置换网络结构 (SP 结构)
注:最后一轮没有列混淆
2.1 圈密钥产生算法
圈密钥根据圈密钥产生算法由用户密钥产生得到.
(1)圈密钥的比特总数为数据块长度与迭代圈数加1的积。例如,对于 128位的分组长度,对应10 圈迭代,圈密钥的总长度为 128(10+1)=1408 位。
(2) 首先将用户密钥扩展为一个扩展密钥。
(3)再从扩展密钥中选出圈密钥:第一个圈密钥由扩展密钥中的前Nb个字组成,第二个圈密钥由接下来的Nb个字组成,以此类推。
2.1.1 密钥扩展
密钥扩展教材应该是有误,可以参考慕课 3:25这段https://www.icourse163.org/learn/XIYOU-1206460819?tid=1472089497#/learn/content?type=detail&id=1257461766&cid=1291053512&contentid=1215040919
- 以下代码用到的两个变量:
1)CipherKey 表示用户的密钥,它是一个有Nk个密钥字的一维数组。eg:Nk=6时,
2)W是存储扩展密钥的一维数组,与CipherKey 同理。
- 扩展为Nb*(Nr+1)位,分为Nk≤6和Nk>6两种情况
(1)Nk ≤ 6:
教材第99页代码片段(是不是有误啊我觉得很奇怪大佬们求带):
按自己理解改了一下是这样:
KeyExpansion(CipherKey, W) {
for (i = 0; i < Nk; i++)
W[i] = CipherKey[i]; //前Nk列跟用户密码一样
for (i = Nk; i < Nb * (Nr + 1); i++) { //Nb * (Nr + 1)有两种结果4*11=44和6*13=78
Temp = W[i - 1];
if (i % Nk == 0) //第i列是否为Nk的整数倍
Temp = SubByte(Rotl(Temp)) ^ Rcon[i / Nk];
W[i] = W[i - Nk] ^ Temp;
}
}
例子:
- i < Nk(i < 4)时直接照搬用户密钥
- i = 4时(i % Nk == 0)
Temp = W[3]=[a4, b4, c4, d5]
第一步: Rotl[Temp]是对一个字里的字节以字节为单位进行循环移位的函数,Rotl(Temp) = [d5, a4, b4, c4]
第二步:SubByte(Rotl(Temp))即SubByte([d5, a4, b4, c4]),S盒输入x=d,y=5,取03
SubByte(Rotl(Temp)) = [03,49,8d,1c]
S盒如下:
第三步:Rcon[i / Nk]
Rcon[4 / 4] = Rcon[1] = [01, 00, 00, 00]
轮常量表如下:
第四步:Temp = SubByte(Rotl(Temp)) ^ Rcon[i / Nk]
SubByte(Rotl(Temp)) = [03,49,8d,1c] 和
Rcon[4 / 4] = Rcon[1] = [01, 00, 00, 00] 相异或
Temp = SubByte(Rotl(Temp)) ^ Rcon[1] = [02,49,8d,1c]
第五步:W[i] = W[i - Nk] ^ Temp
W[4] = W[0] ^ Temp = [a1,b1,c1,d2] ^ [02,49,8d,1c] = [a3, f8, 4c, ce]
- i = 5时(i % Nk != 0)W[i] = W[i - Nk] ^ Temp
Temp = W[4]
W[5] = W[1] ^ W[4] = [a1, b1, c1, d2] ^ [a3, f8, 4c, ce] = [02, 49, 8d, 1c]
2.1.2 圈密钥选择
由W[Nb * I] 到W[Nb * (I+l) - 1]的字组成
设Nb = 4, Nk = 6的情况下,Nr = 12,则要选择12个圈密钥I,I初始值为0。即第一个圈密钥由W[0] ~ W[3],第二个圈密钥由W[4] ~ W[7],…… 最后一个圈密钥由W[40]~W[43]组成。
教材这里貌似又有问题