AES分组密码(摸鱼更新版)

一、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. 以下代码用到的两个变量:

1)CipherKey 表示用户的密钥,它是一个有Nk个密钥字的一维数组。eg:Nk=6时,
在这里插入图片描述

2)W是存储扩展密钥的一维数组,与CipherKey 同理。

  1. 扩展为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;
    }
}

例子:
在这里插入图片描述

  1. i < Nk(i < 4)时直接照搬用户密钥
  2. 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]

  1. 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]组成。
教材这里貌似又有问题在这里插入图片描述
在这里插入图片描述

2.2.1 S盒变换ByteSub

2.2.2 行移位变换 ShiftRow

2.2.3 列混合变换 MixColumn

2.2.4 圈密钥加变换 AddRoundKey

  • 10
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值