AES与DES一样都是迭代型分组密码算法,也是对称密码体制。事实上,AES的产生就是为了取代DES的。
事 实 上 , A E S 是 高 级 加 密 标 准 , 用 到 了 R i j n d a e l 密 码 算 法 \color{skyblue}事实上,AES是高级加密标准,用到了Rijndael密码算法 事实上,AES是高级加密标准,用到了Rijndael密码算法
分
组
长
度
:
128
b
i
t
(
16
b
y
t
e
)
、
192
b
i
t
(
24
b
y
t
e
)
、
256
b
i
t
(
32
b
y
t
e
)
分组长度:128bit(16byte)、192bit(24byte)、256bit(32byte)
分组长度:128bit(16byte)、192bit(24byte)、256bit(32byte)
密
钥
长
度
:
128
b
i
t
、
192
b
i
t
、
256
b
i
t
密钥长度:128bit、192bit、256bit
密钥长度:128bit、192bit、256bit
迭
代
圈
数
:
根
据
分
组
长
度
和
密
钥
长
度
的
不
同
组
合
,
圈
数
也
会
有
所
不
同
迭代圈数:根据分组长度和密钥长度的不同组合,圈数也会有所不同
迭代圈数:根据分组长度和密钥长度的不同组合,圈数也会有所不同
迭 代 圈 数 迭代圈数 迭代圈数 | N b = 128 b i t N_b=128bit Nb=128bit | N b = 192 b i t N_b=192bit Nb=192bit | N b = 256 b i t N_b=256bit Nb=256bit |
---|---|---|---|
N k = 128 b i t N_k=128bit Nk=128bit | 10 圈 \color{blue}10圈 10圈 | 12 圈 \color{blue}12圈 12圈 | 14 圈 \color{blue}14圈 14圈 |
N k = 192 b i t N_k=192bit Nk=192bit | 12 圈 \color{blue}12圈 12圈 | 12 圈 \color{blue}12圈 12圈 | 14 圈 \color{blue}14圈 14圈 |
N k = 256 b i t N_k=256bit Nk=256bit | 14 圈 \color{blue}14圈 14圈 | 14 圈 \color{blue}14圈 14圈 | 14 圈 \color{blue}14圈 14圈 |
N b : 表 示 分 组 长 度 N k : 表 示 密 钥 长 度 \color{gray}N_b:表示分组长度\\N_k:表示密钥长度 Nb:表示分组长度Nk:表示密钥长度
A E S 的 核 心 主 要 围 绕 着 以 下 三 个 方 面 进 行 设 计 的 : \color{gray}AES的核心主要围绕着以下三个方面进行设计的: AES的核心主要围绕着以下三个方面进行设计的:
- 加密算法
- 密钥生成算法
- 脱密算法
加 密 框 图 : ( 圈 数 由 分 组 长 度 和 密 钥 长 度 决 定 ) \color{gray}加密框图:(圈数由分组长度和密钥长度决定) 加密框图:(圈数由分组长度和密钥长度决定)
加密算法(圈函数)
R r 表 示 圈 函 数 , 除 了 最 后 一 圈 , 其 余 各 圈 都 包 含 : R_r表示圈函数,除了最后一圈,其余各圈都包含: Rr表示圈函数,除了最后一圈,其余各圈都包含:
- 字节代替 (唯一的非线性变换,非线性层)
- 位移位 (线性混合层)
- 列混合 (线性混合层)
- ⨁ K i \bigoplus K_i ⨁Ki (与密钥进行模二加(异或)运算)
字 节 代 替 变 换 ( S 盒 ) \color{red}字节代替变换(S盒) 字节代替变换(S盒)
表 达 式 为 : B y t e S u b ( S t a t e ) 其 中 s t a t e 表 示 一 个 矩 阵 \color{blue}表达式为:ByteSub(State)\ \ \ \ \color{gray}其中state表示一个矩阵\\\; 表达式为:ByteSub(State) 其中state表示一个矩阵
128 b i t 为 16 个 字 节 ( 用 a 1 、 a 2 、 . . . 、 a 16 表 示 ) , 对 每 个 字 节 进 行 S 盒 变 换 128bit为16个字节(用a_1、a_2、...、a_{16}表示),对每个字节进行S盒变换 128bit为16个字节(用a1、a2、...、a16表示),对每个字节进行S盒变换
以 矩 阵 [ a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 a 11 a 12 a 13 a 14 a 15 a 16 ] 排 列 , 按 照 一 定 规 律 进 行 变 换 以矩阵\begin{bmatrix} a_1 & a_2 & a_3 & a_4 \\ a_5 & a_6 & a_7 & a_8 \\ a_9 & a_{10} & a_{11} & a_{12} \\ a_{13} & a_{14} & a_{15} & a_{16} \\ \end{bmatrix}排列,按照一定规律进行变换 以矩阵⎣⎢⎢⎡a1a5a9a13a2a6a10a14a3a7a11a15a4a8a12a16⎦⎥⎥⎤排列,按照一定规律进行变换
[ a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 a 11 a 12 a 13 a 14 a 15 a 16 ] ⟹ S 盒 变 换 ⟹ [ a 1 ′ a 2 ′ a 3 ′ a 4 ′ a 5 ′ a 6 ′ a 7 ′ a 8 ′ a 9 ′ a 10 ′ a 11 ′ a 12 ′ a 13 ′ a 14 ′ a 15 ′ a 16 ′ ] \begin{bmatrix} a_1 & a_2 & a_3 & a_4 \\ a_5 & a_6 & a_7 & a_8 \\ a_9 & a_{10} & a_{11} & a_{12} \\ a_{13} & a_{14} & a_{15} & a_{16} \\ \end{bmatrix}\implies {\color{blue}S盒变换}\implies \begin{bmatrix} {a_1}^{'} & {a_2}^{'} & {a_3}^{'}& {a_4}^{'}\\ {a_5}^{'}& {a_6}^{'}& {a_7}^{'}& {a_8}^{'} \\ {a_9}^{'}& {a_{10}}^{'} & {a_{11}}^{'} & {a_{12}}^{'} \\ {a_{13}}^{'} & {a_{14}}^{'} & {a_{15}}^{'} & {a_{16}}^{'} \\ \end{bmatrix}\\\; ⎣⎢⎢⎡a1a5a9a13a2a6a10a14a3a7a11a15a4a8a12a16⎦⎥⎥⎤⟹S盒变换⟹⎣⎢⎢⎡a1′a5′a9′a13′a2′a6′a10′a14′a3′a7′a11′a15′a4′a8′a12′a16′⎦⎥⎥⎤
位 置 并 没 有 发 生 改 变 \color{red}位置并没有发生改变 位置并没有发生改变
S盒变换的底层细节(怎样由一个字节经过数学运算后得到变换后的字节)【一般可以通过查表找到对应的值】
S 盒 变 换 就 是 由 一 个 b y t e 的 数 据 ( 8 位 ) 转 换 为 另 一 个 b y t e 的 数 据 ( 8 位 ) \color{olive}S盒变换就是由一个byte的数据(8位)转换为另一个byte的数据(8位) S盒变换就是由一个byte的数据(8位)转换为另一个byte的数据(8位)
这 里 提 供 一 个 算 法 , 用 来 表 示 字 节 变 换 的 过 程 , 平 时 也 可 以 直 接 通 过 以 查 表 的 方 式 找 到 变 换 后 的 字 节 。 这里提供一个算法,用来表示字节变换的过程,\\平时也可以直接通过以查表的方式找到变换后的字节。 这里提供一个算法,用来表示字节变换的过程,平时也可以直接通过以查表的方式找到变换后的字节。
所 以 对 这 个 变 换 过 程 没 有 太 大 兴 趣 的 话 , 可 以 直 接 跳 过 这 一 个 片 段 , 也 不 会 影 响 对 后 面 内 容 的 理 解 \color{gray}所以对这个变换过程没有太大兴趣的话,可以直接跳过这一个片段,也不会影响对后面内容的理解 所以对这个变换过程没有太大兴趣的话,可以直接跳过这一个片段,也不会影响对后面内容的理解
S 盒 变 换 由 两 个 变 换 复 合 而 成 : \color{black}S盒变换由两个变换复合而成: S盒变换由两个变换复合而成:
- 每一个字节的变换为它在 有 限 域 G F ( 2 8 ) \color{blue}有限域GF(2^8) 有限域GF(28) 中的乘法逆元,规定“0”变换到其本身( 可 逆 \color{red}可逆 可逆)
- 将以上得到的结果,经过二元域的一个仿射变换
有 限 域 ( G F ( 2 8 ) ) : \color{red}有限域(GF(2^8)):\\\; 有限域(GF(28)):
如 0110 1001 表 示 为 : 0 × x 7 + 1 × x 6 + 1 × x 5 + 0 × x 4 + 1 × x 3 + 0 × x 2 + 0 × x 1 + 1 × x 0 \color{gray}如0110\;1001表示为:\\\;\;\;0×x^7+1×x^6+1×x^5+0×x^4+1×x^3+0×x^2+0×x^1+1×x^0 如01101001表示为:0×x7+1×x6+1×x5+0×x4+1×x3+0×x2+0×x1+1×x0
加 法 : \color{blue}加法: 加法:
例 子 : 0101 0111 ⨁ 1000 0011 = 1101 0100 \;\;\;例子:0101\;0111\bigoplus 1000\;0011=1101\;0100 例子:01010111⨁10000011=11010100
乘 法 : \color{blue}乘法: 乘法:
两 个 字 节 相 乘 模 二 元 域 G F ( 2 8 ) 上 的 8 次 不 可 约 多 项 式 m ( x ) , 模 m ( x ) 的 目 的 是 确 保 其 最 终 得 到 的 值 还 是 一 个 低 于 8 次 的 多 项 式 一 般 地 , 将 m ( x ) 规 定 为 固 定 的 值 : m ( x ) = x 8 ⨁ x 4 ⨁ x 3 ⨁ x ⨁ 1 \color{brown}两个字节相乘模二元域GF(2^8)上的8次不可约多项式m(x),模m(x)的目的是确保其最终得到的值还是一个低于8次的多项式\\一般地,将m(x)规定为固定的值:m(x)=x^8\bigoplus x^4\bigoplus x^3\bigoplus x\bigoplus 1 两个字节相乘模二元域GF(28)上的8次不可约多项式m(x),模m(x)的目的是确保其最终得到的值还是一个低于8次的多项式一般地,将m(x)规定为固定的值:m(x)=x8⨁x4⨁x3⨁x⨁1
例 子 : 0101 0111 × 1000 0011 = ( x 6 ⨁ x 4 ⨁ x 2 ⨁ x ⨁ 1 ) × ( x 7 ⨁ x ⨁ 1 ) m o d m ( x ) = ( x 13 ⨁ x 11 ⨁ x 9 ⨁ x 8 ⨁ x 5 ⨁ x 4 ⨁ x 3 ⨁ 1 ) m o d m ( x ) = x 7 ⨁ x 6 ⨁ 1 = 1100 0001 \;\;\;例子:\\\;0101\;0111×1000\;0011\\=(x^6\bigoplus x^4\bigoplus x^2\bigoplus x\bigoplus 1)×(x^7\bigoplus x\bigoplus 1)\;mod\;m(x)\\=(x^{13}\bigoplus x^{11}\bigoplus x^9 \bigoplus x^8\bigoplus x^5\bigoplus x^4\bigoplus x^3\bigoplus1)\;mod\;m(x)\\=x^7\bigoplus x^6\bigoplus1\\=1100\;0001 例子:01010111×10000011=(x6⨁x4⨁x2⨁x⨁1)×(x7⨁x⨁1)modm(x)=(x13⨁x11⨁x9⨁x8⨁x5⨁x4⨁x3⨁1)modm(x)=x7⨁x6⨁1=11000001
求 1001 1101 的 字 节 代 替 变 换 : \color{blue}求1001\;1101的字节代替变换: 求10011101的字节代替变换:
- 求乘法逆元
- 作仿射变换
解 : \color{red}解: 解:
1001 1101 → x 7 ⨁ x 3 ⨁ x 2 ⨁ 1 \color{blue}1001\;1101\to x^7\bigoplus x^3\bigoplus x^2\bigoplus 1 10011101→x7⨁x3⨁x2⨁1
求 乘 法 逆 元 : 利 用 欧 几 里 德 算 法 , 得 到 {\color{red}求乘法逆元:}\color{gray}利用欧几里德算法,得到 求乘法逆元:利用欧几里德算法,得到
( x 7 ⨁ x 3 ⨁ x 2 ⨁ 1 ) − 1 = x 即 ( 1001 1101 ) − 1 = 0000 0010 \color{blue}(x^7\bigoplus x^3\bigoplus x^2\bigoplus 1)^{-1}=x\\即(1001\;1101)^{-1}={\color{brown}0000\;0010} (x7⨁x3⨁x2⨁1)−1=x即(10011101)−1=00000010
求 仿 射 变 换 : \color{red}求仿射变换: 求仿射变换:
[ 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 0 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 1 1 1 1 1 0 0 0 1 ] × [ 0 1 0 0 0 0 0 0 ] ⨁ [ 0 1 1 0 0 0 1 1 ] = [ 1 0 1 1 1 0 1 0 ] = 0101 1101 = 5 D \begin{bmatrix} 1 & 1 & 1 & 1 & 1 & 0 & 0 & 0 \\ 0 & 1 & 1 & 1 & 1 & 1 & 0 & 0 \\ 0 & 0 & 1 & 1 & 1 & 1 & 1 & 0 \\ 0 & 0 & 0 & 1 & 1 & 1 & 1 & 1 \\ 1 & 0 & 0 & 0 & 1 & 1 & 1 & 1 \\ 1 & 1 & 0 & 0 & 0 & 1 & 1 & 1 \\ 1 & 1 & 1 & 0 & 0 & 0 & 1 & 1 \\ 1 & 1 & 1 & 1 & 0 & 0 & 0 & 1 \\ \end{bmatrix}× {\color{red}\begin{bmatrix} 0 \\ 1 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \\ 0 \end{bmatrix}}\bigoplus \begin{bmatrix} 0 \\ 1 \\ 1 \\ 0 \\ 0 \\ 0 \\ 1 \\ 1 \end{bmatrix}={\color{blue} \begin{bmatrix} 1 \\ 0 \\ 1 \\ 1 \\ 1 \\ 0 \\ 1 \\ 0 \end{bmatrix}=0101\;1101=5D}\\\; ⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡1000111111000111111000111111000111111000011111000011111000011111⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤×⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡01000000⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⨁⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡01100011⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡10111010⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=01011101=5D
该 等 式 中 , 红 色 的 是 上 一 步 得 到 的 乘 法 逆 元 , 灰 色 的 矩 阵 为 固 定 的 , 蓝 色 的 是 最 终 要 求 的 字 节 变 换 \\该等式中,{\color{red}红色的是上一步得到的乘法逆元},灰色的矩阵为固定的,{\color{blue}蓝色的是最终要求的字节变换} 该等式中,红色的是上一步得到的乘法逆元,灰色的矩阵为固定的,蓝色的是最终要求的字节变换
亦 或 通 过 查 表 得 到 结 果 : 亦或通过查表得到结果: 亦或通过查表得到结果:
因 为 二 级 制 1001 1101 为 16 进 制 的 8 D , 即 , x 轴 为 8 , y 轴 为 D 。 对 应 的 数 字 正 好 为 16 进 制 的 5 D \color{red}因为二级制1001\;1101为16进制的8D,即,x轴为8,y轴为D。对应的数字正好为16进制的5D 因为二级制10011101为16进制的8D,即,x轴为8,y轴为D。对应的数字正好为16进制的5D
行 移 位 变 换 \color{red}行移位变换 行移位变换
表 达 式 : S h i t e R o w ( S t a t e ) , S t a t e 也 是 一 个 矩 阵 \color{blue}表达式:ShiteRow(State),State 也是一个矩阵\\\; 表达式:ShiteRow(State),State也是一个矩阵
将 一 个 字 节 矩 阵 自 上 向 下 称 0 , 1 , 2 , 3 行 将一个字节矩阵自上向下称0,1,2,3行 将一个字节矩阵自上向下称0,1,2,3行
无 论 分 组 长 度 是 多 少 128 b i t , 192 b i t , 还 是 256 b i t 都 分 为 了 4 行 , 只 是 三 者 每 一 行 的 元 素 不 同 , 如 128 b i t 每 一 行 有 4 个 元 素 。 而 192 b i t 每 一 行 有 6 个 元 素 。 256 b i t 每 一 行 有 8 个 元 素 。 无论分组长度是多少128bit,192bit,还是256bit都分为了4行,只是三者每一行的元素不同,\\如128bit每一行有4个元素。\\而192bit每一行有6个元素。\\256bit每一行有8个元素。 无论分组长度是多少128bit,192bit,还是256bit都分为了4行,只是三者每一行的元素不同,如128bit每一行有4个元素。而192bit每一行有6个元素。256bit每一行有8个元素。
每 一 个 元 素 是 1 个 字 节 。 拿 128 b i t 的 举 例 , 4 行 4 列 是 16 个 元 素 , 16 × 8 b i t 正 好 是 128 b i t \color{red}每一个元素是1个字节。\\{\color{blue}拿128bit的举例,4行4列是16个元素,16×8bit正好是128bit} 每一个元素是1个字节。拿128bit的举例,4行4列是16个元素,16×8bit正好是128bit
每 一 种 的 的 分 组 长 度 对 应 着 属 于 他 们 自 己 偏 移 量 。 每一种的的分组长度对应着属于他们自己偏移量。 每一种的的分组长度对应着属于他们自己偏移量。
位移量 | 0行 | 1行 | 2行 | 3行 |
---|---|---|---|---|
128bit | 0 | 1 | 2 | 3 |
192bit | 0 | 1 | 2 | 3 |
256bit | 0 | 1 | 3 | 4 |
如
,
拿
128
b
i
t
的
分
组
长
度
进
行
举
例
。
(
其
规
律
是
将
第
i
行
左
移
i
个
字
节
)
如,拿128bit的分组长度进行举例。(其规律是将第i行左移i个字节)\\\;
如,拿128bit的分组长度进行举例。(其规律是将第i行左移i个字节)
[
a
0
a
4
a
8
a
12
a
1
a
5
a
9
a
13
a
2
a
6
a
10
a
14
a
3
a
7
a
11
a
15
]
⟹
[
a
0
a
4
a
8
a
12
a
5
a
9
a
13
a
1
a
10
a
14
a
2
a
6
a
15
a
3
a
7
a
11
]
\begin{bmatrix} a_0 & a_4 & a_8 & a_{12} \\a_1 & a_5 & a_9 & a_{13} \\a_2 & a_6 & a_{10} & a_{14} \\a_3 & a_7 & a_{11} & a_{15} \\ \end{bmatrix}\implies\begin{bmatrix} a_0 & a_4 & a_8 & a_{12} \\a_5 & a_9 & a_{13} & a_{1} \\a_{10} & a_{14} & a_{2} & a_{6} \\a_{15} & a_3 & a_{7} & a_{11} \\ \end{bmatrix}\\\;
⎣⎢⎢⎡a0a1a2a3a4a5a6a7a8a9a10a11a12a13a14a15⎦⎥⎥⎤⟹⎣⎢⎢⎡a0a5a10a15a4a9a14a3a8a13a2a7a12a1a6a11⎦⎥⎥⎤
变
换
的
目
的
是
使
得
原
来
同
一
列
中
的
4
个
元
组
分
散
到
不
同
列
中
变换的目的是使得原来同一列中的4个元组分散到不同列中
变换的目的是使得原来同一列中的4个元组分散到不同列中
列 混 合 变 换 \color{red}列混合变换 列混合变换
表 达 式 : M i x C o l u m n ( S t a t e ) , S t a t e 是 一 个 矩 阵 \color{blue}表达式:MixColumn(State),State 是一个矩阵\\\; 表达式:MixColumn(State),State是一个矩阵
将 矩 阵 [ a 0 a 4 a 8 a 12 a 1 a 5 a 9 a 13 a 2 a 6 a 10 a 14 a 3 a 7 a 11 a 15 ] 的 每 一 列 依 次 同 矩 阵 C ( X ) = [ 2 3 1 1 1 2 3 1 1 1 2 3 3 1 1 2 ] 相 乘 得 到 的 另 一 个 矩 阵 [ b 0 b 4 b 8 b 12 b 1 b 5 b 9 b 13 b 2 b 6 b 10 b 14 b 3 b 7 b 11 b 15 ] 。 将矩阵\begin{bmatrix} a_0 & a_4 & a_8 & a_{12} \\a_1 & a_5 & a_9 & a_{13} \\a_2 & a_6 & a_{10} & a_{14} \\a_3 & a_7 & a_{11} & a_{15} \\ \end{bmatrix}的每一列依次同矩阵C(X)=\begin{bmatrix} 2 & 3 & 1 & 1 \\ 1 & 2 & 3 & 1 \\ 1 & 1 & 2 & 3 \\ 3 & 1 & 1 & 2 \\ \end{bmatrix}相乘得到的另一个矩阵\begin{bmatrix} b_0 & b_4 & b_8 & b_{12} \\b_1 & b_5 & b_9 & b_{13} \\b_2 & b_6 & b_{10} & b_{14} \\b_3 & b_7 & b_{11} & b_{15} \\ \end{bmatrix}。\\\; 将矩阵⎣⎢⎢⎡a0a1a2a3a4a5a6a7a8a9a10a11a12a13a14a15⎦⎥⎥⎤的每一列依次同矩阵C(X)=⎣⎢⎢⎡2113321113211132⎦⎥⎥⎤相乘得到的另一个矩阵⎣⎢⎢⎡b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15⎦⎥⎥⎤。
即 [ b 0 b 1 b 2 b 3 ] = [ 2 3 1 1 1 2 3 1 1 1 2 3 3 1 1 2 ] × [ a 0 a 1 a 2 a 3 ] \begin{bmatrix}b_0\\b_1\\b_2\\b_3\end{bmatrix}=\begin{bmatrix} 2 & 3 & 1 & 1 \\ 1 & 2 & 3 & 1 \\ 1 & 1 & 2 & 3 \\ 3 & 1 & 1 & 2 \\ \end{bmatrix}×\begin{bmatrix}a_0\\a_1\\a_2\\a_3\end{bmatrix}\\\; ⎣⎢⎢⎡b0b1b2b3⎦⎥⎥⎤=⎣⎢⎢⎡2113321113211132⎦⎥⎥⎤×⎣⎢⎢⎡a0a1a2a3⎦⎥⎥⎤
b 0 = 2 × a 0 ⨁ 3 × a 1 ⨁ 1 × a 2 ⨁ 1 × a 3 b_0=2×a_0\bigoplus 3×a_1\bigoplus 1×a_2\bigoplus 1×a_3 b0=2×a0⨁3×a1⨁1×a2⨁1×a3 ( 注 意 参 与 计 算 的 数 都 是 19 进 制 的 数 , 并 进 行 异 或 操 作 ) \color{red}\;(注意参与计算的数都是19进制的数,并进行异或操作) (注意参与计算的数都是19进制的数,并进行异或操作)
其 中 矩 阵 中 的 各 个 元 素 都 是 16 进 制 数 \color{red}其中矩阵中的各个元素都是16进制数 其中矩阵中的各个元素都是16进制数
圈 密 钥 加 \color{red}圈密钥加 圈密钥加
表 达 式 : A d d R o u n d K e y ( S t a t e , R o u n d K e y ) , S t a t e 和 R o u n d 都 是 一 个 矩 阵 \color{blue}表达式:AddRoundKey(State,RoundKey),State和Round都是一个矩阵\\\; 表达式:AddRoundKey(State,RoundKey),State和Round都是一个矩阵
R o u n d k e y 是 圈 密 钥 , S t a t e 是 进 行 了 之 前 运 算 后 得 到 的 矩 阵 。 圈 密 钥 长 度 等 于 分 组 长 度 Roundkey是圈密钥,State是进行了之前运算后得到的矩阵。\\\;圈密钥长度等于分组长度 Roundkey是圈密钥,State是进行了之前运算后得到的矩阵。圈密钥长度等于分组长度
密 钥 字 节 矩 阵 与 当 前 状 态 字 节 矩 阵 的 对 应 字 节 进 行 亦 或 运 算 “ ⨁ ” 密钥字节矩阵与当前状态字节矩阵的对应字节进行\;亦或运算“\bigoplus”\\\; 密钥字节矩阵与当前状态字节矩阵的对应字节进行亦或运算“⨁”
[ a 0 a 4 a 8 a 12 a 1 a 5 a 9 a 13 a 2 a 6 a 10 a 14 a 3 a 7 a 11 a 15 ] ⨁ [ k 0 k 4 k 8 k 12 k 1 k 5 k 9 k 13 k 2 k 6 k 10 k 14 k 3 k 7 k 11 k 15 ] = [ b 0 b 4 b 8 b 12 b 1 b 5 b 9 b 13 b 2 b 6 b 10 b 14 b 3 b 7 b 11 b 15 ] k 是 密 钥 。 \begin{bmatrix} a_0 & a_4 & a_8 & a_{12} \\a_1 & a_5 & a_9 & a_{13} \\a_2 & a_6 & a_{10} & a_{14} \\a_3 & a_7 & a_{11} & a_{15} \\ \end{bmatrix}\bigoplus \begin{bmatrix} k_0 & k_4 & k_8 & k_{12} \\k_1 & k_5 & k_9 & k_{13} \\k_2 & k_6 & k_{10} & k_{14} \\k_3 & k_7 & k_{11} & k_{15} \\ \end{bmatrix}=\begin{bmatrix} b_0 & b_4 & b_8 & b_{12} \\b_1 & b_5 & b_9 & b_{13} \\b_2 & b_6 & b_{10} & b_{14} \\b_3 & b_7 & b_{11} & b_{15} \\ \end{bmatrix}\\\;\\\;k是密钥。 ⎣⎢⎢⎡a0a1a2a3a4a5a6a7a8a9a10a11a12a13a14a15⎦⎥⎥⎤⨁⎣⎢⎢⎡k0k1k2k3k4k5k6k7k8k9k10k11k12k13k14k15⎦⎥⎥⎤=⎣⎢⎢⎡b0b1b2b3b4b5b6b7b8b9b10b11b12b13b14b15⎦⎥⎥⎤k是密钥。
密钥生成算法
初始密钥长度分为128bit,192bit,256bit
密钥长度等于分组长度
共 需 密 钥 总 数 = 初 始 密 钥 长 度 × ( 圈 数 + 1 ) \color{red}共需密钥总数=初始密钥长度×(圈数+1) 共需密钥总数=初始密钥长度×(圈数+1)
如 , 对 于 128 b i t , 对 应 着 10 圈 ( 通 过 查 找 之 前 的 表 格 得 到 ) : 需 要 的 总 密 钥 = 128 b i t × ( 10 + 1 ) = 1408 b i t 。 \color{blue}如,对于128bit,对应着10圈(通过查找之前的表格得到):\\需要的总密钥=128bit×(10+1)=1408bit。 如,对于128bit,对应着10圈(通过查找之前的表格得到):需要的总密钥=128bit×(10+1)=1408bit。
所 以 对 于 需 要 进 行 10 圈 加 密 需 要 将 128 b i t 的 初 始 密 钥 扩 展 为 1408 b i t 的 密 钥 , 为 每 一 圈 提 供 不 同 的 圈 密 钥 \color{gray}所以对于需要进行10圈加密需要将128bit的初始密钥扩展为1408bit的密钥,为每一圈提供不同的圈密钥 所以对于需要进行10圈加密需要将128bit的初始密钥扩展为1408bit的密钥,为每一圈提供不同的圈密钥
用 128 b i t 密 钥 进 行 举 例 : \color{red}用128bit密钥进行举例: 用128bit密钥进行举例:
A E S − 128 , 初 始 密 钥 为 4 个 32 位 字 节 , 圈 数 为 10 。 则 共 需 要 4 × ( 10 + 1 ) = 44 个 32 位 字 的 扩 展 密 钥 。 因 此 我 们 需 要 将 4 个 32 b i t 的 初 始 密 钥 扩 展 为 44 个 32 b i t 的 扩 展 密 钥 N k = 初 始 密 钥 比 特 数 / 32 , 是 原 始 密 钥 可 产 生 的 32 位 的 个 数 。 AES-128,初始密钥为4个32位字节,圈数为10。则共需要4×(10+1)=44个32位字的扩展密钥。{\color{blue}因此我们需要将4个32bit的初始密钥\;扩展为\;44个32bit的扩展密钥}\\N_k=初始密钥比特数/32,是原始密钥可产生的32位的个数。 AES−128,初始密钥为4个32位字节,圈数为10。则共需要4×(10+1)=44个32位字的扩展密钥。因此我们需要将4个32bit的初始密钥扩展为44个32bit的扩展密钥Nk=初始密钥比特数/32,是原始密钥可产生的32位的个数。
初始密钥长度 | 128bit | 192bit | 256bit |
---|---|---|---|
N k N_k Nk | 4 | 6 | 8 |
表
格
中
的
4
,
6
,
8
。
单
位
是
32
b
i
t
,
如
4
个
32
b
i
t
,
6
个
32
b
i
t
,
8
个
32
b
i
t
\color{gray}表格中的4,6,8。单位是32bit,如4个32bit,6个32bit,8个32bit
表格中的4,6,8。单位是32bit,如4个32bit,6个32bit,8个32bit
密
钥
生
成
有
两
个
情
况
,
一
个
(
N
k
=
4
或
者
N
k
=
6
)
;
一
个
N
k
=
8
。
密钥生成有两个情况,一个(N_k=4或者N_k=6);一个N_k=8。\\\\\;
密钥生成有两个情况,一个(Nk=4或者Nk=6);一个Nk=8。
第 一 种 : N k = 4 或 者 6 : ( 128 b i t , 192 b i t ) 第一种:\color{blue}N_k=4或者6:(128bit,192bit) 第一种:Nk=4或者6:(128bit,192bit)
现 在 要 将 4 个 32 b i t 扩 展 为 44 个 32 b i t 现在要将4个32bit扩展为44个32bit 现在要将4个32bit扩展为44个32bit
128 b i t : N 0 , N 1 , N 2 , N 3 → W 0 , W 1 , W 2 , W 3 , W 4 , … … , W 42 , W 43 {\color{blue}128bit:\;}N_0,N_1,N_2,N_3\to W_0,W_1,W_2,W_3,W_4,……,W_{42},W_{43}\\\; 128bit:N0,N1,N2,N3→W0,W1,W2,W3,W4,……,W42,W43
192 b i t : N 0 , N 1 , N 2 , N 3 , N 4 , N 5 → W 0 , W 1 , W 2 , W 3 , W 4 , … … , W 42 , W 43 {\color{blue}192bit:\;}N_0,N_1,N_2,N_3,N_4,N_5\to W_0,W_1,W_2,W_3,W_4,……,W_{42},W_{43}\\\; 192bit:N0,N1,N2,N3,N4,N5→W0,W1,W2,W3,W4,……,W42,W43
其 中 前 N k 个 直 接 取 自 初 始 密 钥 , 即 , N k = W k − 1 ; 后 面 的 都 取 自 于 前 一 个 递 归 生 成 。 其中前N_k个直接取自初始密钥,即,N_k=W_{k-1};后面的都取自于前一个递归生成。\\\;\\\; 其中前Nk个直接取自初始密钥,即,Nk=Wk−1;后面的都取自于前一个递归生成。
对 于 W i − 1 , 观 察 i 能 否 整 除 N k ( N k 的 值 要 么 为 4 要 么 为 6 ) 如 果 不 能 , 则 将 W i − 1 与 W i − N k 进 行 模 二 加 运 算 , 得 到 W i 。 ( 其 中 W i − N k 要 么 是 W i − 4 要 么 是 W i − 6 ) 如 果 能 , 先 进 行 循 环 左 移 一 个 字 节 ( 8 个 b i t ) , 然 后 再 进 行 字 节 代 替 , 将 得 到 的 结 果 一 个 结 果 设 为 X R c o n [ i / N k ] ⨁ W i − N k 的 结 果 设 为 Y , 计 算 X ⨁ Y , 得 到 W i 。 对于W_{i-1},观察 i 能否整除N_k(N_k的值要么为4要么为6)\\如果不能,则将W_{i-1}与W_{i-N_k}进行模二加运算,{\color{red}得到W_i}。(其中W_{i-N_k}要么是W_{i-4}要么是W_{i-6})\\如果能,先进行循环左移一个字节(8个bit),然后再进行字节代替,将得到的结果一个结果设为X\\Rcon[i/N_k]\bigoplus W_{i-N_k}的结果设为Y,\\计算X\bigoplus Y,{\color{red}得到W_i}。\\\; 对于Wi−1,观察i能否整除Nk(Nk的值要么为4要么为6)如果不能,则将Wi−1与Wi−Nk进行模二加运算,得到Wi。(其中Wi−Nk要么是Wi−4要么是Wi−6)如果能,先进行循环左移一个字节(8个bit),然后再进行字节代替,将得到的结果一个结果设为XRcon[i/Nk]⨁Wi−Nk的结果设为Y,计算X⨁Y,得到Wi。
其 中 就 产 生 了 一 个 疑 点 : R c o n [ i / N k ] 是 什 么 ? 其中就产生了一个疑点:Rcon[i/N_k]是什么? 其中就产生了一个疑点:Rcon[i/Nk]是什么?
1. R c o n [ i / N k ] 是 什 么 ? 1.Rcon[i/N_k]是什么? 1.Rcon[i/Nk]是什么?
分析以下这个式子, R c o n [ i / N k ] 既 然 已 经 走 了 这 个 分 支 , 说 明 i / N k 肯 定 是 个 整 数 , 而 且 其 值 肯 定 是 在 1 — 10 之 间 Rcon[i/N_k]\;既然已经走了这个分支,说明i/N_k肯定是个整数,而且其值肯定是在1—10之间 Rcon[i/Nk]既然已经走了这个分支,说明i/Nk肯定是个整数,而且其值肯定是在1—10之间
一 般 地 , R c o n [ i / N k ] 别 设 定 为 32 b i t 的 常 数 , R c o n [ i / N k ] = 【 R C [ J ] , 00 , 00 , 00 】 ( 是 16 进 制 数 ) 一般地,Rcon[i/N_k]别设定为32bit的常数,Rcon[i/N_k]=【RC[J],00,00,00】(是16进制数) 一般地,Rcon[i/Nk]别设定为32bit的常数,Rcon[i/Nk]=【RC[J],00,00,00】(是16进制数)
J \color{blue}J J | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
R C [ J ] \color{blue}RC[J] RC[J] | 01 | 02 | 03 | 04 | 08 | 20 | 40 | 80 | 1B | 36 |
第 二 种 : N k = 8 : ( 256 b i t ) 第二种:\color{blue}N_k=8:(256bit) 第二种:Nk=8:(256bit)
前 N k 个 ( 8 个 ) W 0 , W 1 , W 2 , W 3 , … … , W 7 , W 8 直 接 取 自 初 始 密 钥 , 同 第 一 种 ( N k = 4 或 6 是 的 情 况 相 似 ) 前N_k个(8个)W_0,W_1,W_2,W_3,……,W_7,W_8直接取自初始密钥,同第一种(N_k=4或6是的情况相似) 前Nk个(8个)W0,W1,W2,W3,……,W7,W8直接取自初始密钥,同第一种(Nk=4或6是的情况相似)
- 如图所示
脱密算法
加 、 脱 密 的 过 程 具 有 等 价 结 构 , 通 过 将 加 密 过 程 中 的 变 换 用 相 应 的 逆 变 换 代 替 , 以 及 在 密 钥 调 度 中 作 适 当 变 化 , 即 成 为 脱 密 过 程 。 过 程 如 图 所 示 。 加、脱密的过程具有等价结构,通过将加密过程中的变换用相应的逆变换代替,\\以及在密钥调度中作适当变化,即成为脱密过程。过程如图所示。 加、脱密的过程具有等价结构,通过将加密过程中的变换用相应的逆变换代替,以及在密钥调度中作适当变化,即成为脱密过程。过程如图所示。
其中 C − 1 ( K 9 ) C^{-1}(K_9) C−1(K9)是对 K9 进行列混合变换的逆变换,K9 到K1都需要进行这一逆变换。
逆 字 节 代 替 变 换 ( 逆 S 盒 ) 逆字节代替变换(逆S盒) 逆字节代替变换(逆S盒)
- 先用GF(2)上的仿射变换
- 再取GF(28上的乘法逆)
亦或通过查表得出:
逆 行 移 位 变 换 : 参 照 行 移 位 变 换 的 规 则 , 只 是 将 向 左 移 位 , 变 为 向 右 移 位 逆行移位变换:\color{blue}参照行移位变换的规则,只是将向左移位,变为向{\color{red}右}移位\\\; 逆行移位变换:参照行移位变换的规则,只是将向左移位,变为向右移位
逆 列 混 合 变 换 : 同 列 混 合 一 样 乘 一 个 固 定 的 矩 阵 ( 1 也 是 6 进 制 ) 。 逆列混合变换:\color{blue}同列混合一样乘一个固定的矩阵(1也是6进制)。 逆列混合变换:同列混合一样乘一个固定的矩阵(1也是6进制)。
∣ 0 e 0 b 0 d 09 09 0 e 0 b 0 d 0 d 09 0 e 0 b 0 b 0 d 09 0 e ∣ \begin{vmatrix} 0e & 0b & 0d & 09 \\ 09 & 0e & 0b & 0d \\ 0d & 09 & 0e & 0b \\ 0b & 0d & 09 & 0e \\ \end{vmatrix}\\\; ∣∣∣∣∣∣∣∣0e090d0b0b0e090d0d0b0e09090d0b0e∣∣∣∣∣∣∣∣
圈
密
钥
加
:
异
或
运
算
圈密钥加:异或运算\\\;
圈密钥加:异或运算
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
−
-------------------------------------------
−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
加密与解密的一些其他性质
加密也解密进行比较:
对比这两张图发现,加密和解密圈函数内的3个函数步骤尽然相同,
这是由于以下两个特性决定的。
- 字节代替和行移位可交换(先进行什么运算对结果没有影响)
- 逆列混合变换和圈密钥加广义可交换
以 上 即 为 A E S 的 全 部 内 容 。 谢 谢 大 家 ! 也 请 大 家 批 评 指 正 。 以上即为AES的全部内容。谢谢大家!也请大家批评指正。 以上即为AES的全部内容。谢谢大家!也请大家批评指正。