4 - 高级加密标准 (AES)
高级加密标准 (AES)
原书:《Understanding Cryptography: A Text book for Students and Practitioners》
AES: Advanced Encryption Standard
是今天使用最广的对称加密运算。尽管 AES 中的标准是美国政府应用的标准,AES 块运算加密算法依旧在很多工业标准以及商务系统中使用。包括 AES 安全商务安全标准的有网络安全标准 IPsec
、TLS
、Wi-Fi
加密标准 IEEE 802.11i
、SSH
、Skype
以及数不清的安全产品。迄今为止,破解 AES 的最好方法还是暴力破解。
4.1 介绍
在 1999 年美国 NIST: National Institute of Standards and Technology
指示 DES 只能用在落后的系统中,其他系统应该使用 3DES。虽然破解 3DES 的最好方法还是暴力破解,它也有很多问题。首先,软件实现这一算法是低效的;其次,加密块大小只有 64 字节,这显然在今天的很多应用中还是落后的;最后,量子计算机在可预见的未来几十年是可能存在的,因此我们需要 256 位长的密钥长度。所有这些因素,促使了 NIST 寻找一种新的块加密算法来替代 3DES。
候补 AES 块运算加密算法需要满足下面的条件:
- 块运算使用 128 位
- 支持 128/192/256 位密钥长度
- 对比其他竞争对手更安全
- 能够高效通过软件/硬件实现
AES 算法的发展过程如下:
- 1997 年 1 月 2 日,由 NIST 发布新的块加密算法需求
- 1997 年 9 月 12 日,AES 宣布了这一算法的正式名称
- 1998 年 8 月 20 日,多个国家的研究者提交了共计 15 种候选算法
- 1999 年 8 月 9 日,5 种算法进入决赛圈
- IBM 的 Mars
- RSA 的 RC6
- Joan Daemen 与 Vincent Rijmen 的 Rijndael
- Ross Anderson、Eli Biham 与 Lars Knudsen 的 Serpent
- Bruce Schneier、John Kelsey、Doug Whiting、David Wagner、Chris Hall 与 Niels Ferguson 的 Twofish
- 2000 年 10 月 2 日,NIST 宣布选择 Rijndael 算法做为 AES
- 2001 年 11 月 26 日,AES 正式成为美国联邦加密标准
4.2 AES 算法总览
AES 块运算加密算法与 Rijndael 算法基本一致,只是Rijndael 算法支持 128/192/256 位的块运算,而 AES 只支持 128 位的块运算。后面我们只讨论块长度 128 字节的 Rijndael 算法。
不同的密钥长度,进行的计算轮数不同:
密钥长度 | 轮数 |
---|---|
128 位 | 10 |
192 位 | 12 |
256 位 | 14 |
AES 中不像 DES 那样具有 Feistel 网络。Feistel 网络不会在每次迭代中加密所有的信息块,在 DES 中,每次迭代只加密 64/2 = 32 位的数据块。而 AES 则会在每次迭代加密所有的 128 位数据,这也是为什么它的运算轮数相对较少。
AES 由称作层的结构组成。每一层操作所有的 128 位的数据。只有三种不同类型的层。除了第一轮,每一轮都由所有三层组成。
密钥加法层
128 位密钥或子密钥,通过密钥策略从主密钥中计算得到,进行异或操作
字节替换层(S 盒)
每一个状态的元素通过查表进行非线性转换,这一过程为数据引入混乱
扩散层
为所有状态位提过扩散,它由两个子层组成,二者都进行线性操作:
- ShiftRows 层在字节层面进行数据置换
- MixColumn 层是矩阵操作组合四字节块
4.3 一些数学内容:伽罗瓦域简单介绍
在 AES 中,大部分层使用了伽罗瓦域算法,尤其在 S 盒与 MixColumn 层中。
4.3.1 有限域存在性
一个有限域(伽罗瓦域),是具有有限成员的集合。在这个域中,我们可以进行加/减/乘/逆运算。
我们先介绍一个简单的代数结构,群。
定义4.3.1 群 群是一簇元素 \(G\) 并具有操作 \(\circ\) 对 \(G\) 的两个元素组合,具有如下特性:
- 群操作 \(\circ\) 是闭合的,既对于所有的 \(a,b\in G\) 满足 \(a \circ b = c \in G\)
- 群操作满足结合律,既 \(a\circ (b\circ c) = (a\circ b)\circ c,a,b,c \in G\)
- 具有零元素 \(1 \in G\),满足 \(a\circ 1 = 1 \circ a = a,a \in G\)
- 对于 \(a\in G\) 存在 \(a^{-1}\in G\) 称作逆,满足 \(a\circ a^{-1} = a^{-1} \circ a = 1\)
- 如果 \(a\circ b = b\circ a,a,b\in G\) 那么这个群是阿贝尔群
简而言之,群就是具有一个操作与对应逆操作的集合。如果一个操作称作加,那么对应的逆操作就是减;如果一个操作是乘,那么对应的逆操作就是除。
例4.1 对于集合 \(Z_m = {0,1,...,m - 1}\) 与取模运算,组成具有零元素 0 的群。每一个元素 a,具有逆 -a,满足 a + (-a) = 0 mod m,注意到,这个集合对乘法运算并不组成群,因为大部分元素并不具备逆元素,满足 \(aa^{-1} = 1 \quad mod \quad m\)
为了在一个结构中包含所有四种基本代数运算(加减乘除),我们需要包含加法与乘法的群,我们称之为域。
定义4.3.2 域 域 F 是元素的集合,满足如下特性:
- F 的所有元素通过加法操作组成加法群,其零元素为 0
- F 的所有元素通过乘法操作组成乘法群,其零元素为 1
- 当两个群的操作混合,满足分配律,既\(a(b+c) = (ab) + (ac),a,b,c\in F\)
例4.2 实数集是一个域,对于加法操作是具有零元素为 0 的群,对于乘法操作是零元素为 1 的群。每一个实数 a 具有一个加法逆 -a,具有一个乘法逆 1/a。
在密码学中,我们总是对具有有限数字的域感兴趣,这样的域称作有限域或伽罗瓦域。在域中的元素数称作它的阶/势。
定理4.3.1 对于正整数 n 与质数 p,只有在 \(m = p^n\) 时,具有 m 阶的域才存在,p 称作有限域的特征
4.3.2 质数域
有限域的最直观的例子是质数阶,n = 1 的域。这样的质数域 GF(p) 可以由整数 0,1,...,p - 1 组成。这个域支持模加运算与模乘运算。
定理 4.3.2 p 为质数,整数环 \(Z_p\) 表示为 GF(p) 是一个质数域。所有 GF(p) 的非零元素都具有逆,所有 GF(p) 的算术都是模 p 的
这意味着如果我们考虑整数环 \(Z_m\),具有模加与模乘运算,m 为质数,那么 \(Z_m\) 不仅是一个环,它还是一个有限域。
为了在质数域中进行运算,我们必须遵从整数环的规则:加法与乘法操作都要模 p,任何元素有 \(a + (-a) = 0\quad mod \quad p\),\(a\dot a^{-1} = 1\)。
例 4.3 考虑有限域 GF(5) = {0,1,2,3,4},下表展示了加法与乘法操作:
+ | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | 0 | 1 | 2 | 3 | 4 |
1 | 1 | 2 | 3 | 4 | 0 |
2 | 2 | 3 | 4 | 0 | 1 |
3 | 3 | 4 | 0 | 1 | 2 |
4 | 4 | 0 | 1 | 2 | 3 |
\(\times\) | 0 | 1 | 2 | 3 | 4 |
---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 1 | 2 | 3 | 4 |
2 | 0 | 2 | 4 | 1 | 3 |
3 | 0 | 3 | 1 | 4 | 2 |
4 | 0 | 4 | 3 | 2 | 1 |
加法逆
-1 = 4 \\
-2 = 3 \\
-3 = 2 \\
-4 = 1
\]
乘法逆
2^{-1} = 3 \\
3^{-1} = 2 \\
4^{-1} = 4
\]
一个重要的质数域是 GF(2),它是最小的有限域。在 GF(2) = {0,1} 中,有:
+ | 0 | 1 |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
\(\times\) | 0 | 1 |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
4.3.3 扩展域 \(GF(2^m)\)
在 AES 算法中,有限域包含 256 个元素,表示为 \(GF(2^8)\)。选择这个域,是因为每一个域元素可以表示为单字节。对于 S 盒与 MixColumn 转换,AES 数据中的每一个字节视作域 \(GF(2^8)\) 中的元素,并在这个有限域中对数据进行计算。
如果有限域的阶不是质数,显然 \(2^8\) 不是质数,加法与乘法操作不能被整数的加法与乘法模 \(2^8\) 表示。这样的 $m > 1 $ 的域称作扩展域。为了处理扩展域,我们需要不同的域元素标识,元素进行算术运算的不同规则。下面我们会看到扩展域可以表示为多项式,并通过对多项式运算进行扩展域的计算。
在扩展域 \(GF(2^8)\) 中的元素不是以整数的形式表示的,而是以系数在 \(GF(2)\) 中的多项式表示的。多项式具有最大 m - 1 阶,这样对于每一个元素最多有 m 个系数。在域 \(GF(2^8)\) 中,每一个元素 \(A \in GF(2^8)\) 可以表示为:
\]
这样会有 \(256 = 2^8\) 个多项式,每一个多项式可以表示为如下的向量:
\]
4.3.4 \(GF(2^m)\) 中的加法与减法
现在我们就可以进行这个域中的加法与乘法了。AES 的密钥加法层使用加法运算。操作是直白的,只需要进行标准多项式的加法与减法:我们只需要进行系数的加法与减法操作。
定义 4.3.3 扩展域加法与减法
令 \(A(x),B(x) \in GF(2^m)\),两个元素的和可通过下式计算:
\]
差通过下式计算:
\]
注意到我们对系数进行模 2 加法/减法操作。在第二章中我们知道,模 2 的加法与减法是相同的操作。模 2 加法等效于按位异或。
例 4.5 \(C(x) = A(x) + B(x)\) 是 \(GF(2^8)\) 中的两个元素
B(x) = x^4 + x^2 + 1 \\
C(x) = x^7 + x^6 + x^2
\]
如果我们进行减法操作,将会得到相同的结果。
4.3.5 \(GF(2^m)\) 中的乘法
在 \(GF(2^8)\) 中的乘法是 AES MixColumn 转换的核心,第一步,两个元素使用标准多项式乘法规则计算:
C'(x) = c'_{2m-2}x^{2m-2} + ... + c'_0
\]
其中:
c'_1 = a_0b_1 + a_1b_0 \quad mod \quad 2 \\
... \\
c'_{2m-2} = a_{m-1}b_{m-1} \quad mod \quad 2
\]
系数都是 \(GF(2)\) 中的元素。多项式 \(C(x)\) 的阶高于 \(m - 1\),因此必须要降阶。基本思想与质数域中的乘法类似,在 \(GF(p)\),我们乘两个整数,除一个质数,并只考虑余数。下面是我们对扩展域做的操作:乘法的积除以指定的多项式,只考虑余数。我们需要不可约的多项式来进行降阶。
定义 4.3.4 扩展域乘法
令 \(A(x),B(x) \in GF(2^m)\) 且
\]
是一个不可约的多项式。对两个元素 \(A(x),B(x)\) 的乘法为:
\]
这样每一个 \(GF(2^m)\) 多项式需要一个系数为 \(GF(2)\) 的 m 阶不可约多项式 \(P(x)\)。注意到,不是所有的多项式都是不可约的,比如,\(x^4 + x^3+x+1\) 就是可约的:
\]
例 4.6 我们想要乘 \(GF(2^4)\) 中的两个多项式 \(A(x) = x^3+x^2+1\) 与 \(B(x) = x^2 +x\),不可约的多项式为:
\]
原多项式的乘法可以计算得:
\]
我们可以像下面这样计算:
x^4 \equiv x+1 \quad \mod \quad P(x) \\
x^5 \equiv x^2 + x \quad mod \quad P(x)
\]
现在,我们只需将降阶后的表达式代入原方程 \(C'(x)\):
C(x) \equiv (x^2 + x) + (x^3 + x^2 + x) = x^3 \\
A(x)\cdot B(x) \equiv x^3
\]
如果我们查看前面的例子,可以以下面的比特操作表示:
(x^3+x^2+1)\cdot(x^2+x) = x^3 \\
(1 1 0 1)\cdot(0 1 1 0) = (1 0 0 0)
\]
注意到,这个计算与整数乘法不同。
4.3.6\(GF(2^m)\) 中的逆
\(GF(2^8)\) 的逆是字节替换转换的核心,它组成了 AES 的 S 盒。对于给定的有限域 \(GF(2^m)\) 以及相关的不可约降阶多项式 \(P(x)\),非零元素 \(A\in GF(2^m)\) 的逆 \(A^{-1}\) 有:
\]
对于小的域,在实践中,通常意味着具有 \(2^{16}\) 或更少的元素,通常可以使用预先计算好的域的逆表,进行查表。下表展示了 AES S 盒使用的值。表格包含所有 \(GF(2^8)\) 模 \(P(x) = x^8+x^4+x^3+x+1\) 的逆的十六进制表示形式。一个特殊的形式是域元素 0,它的逆并不存在。不过,对于 AES S 盒需要对每一个输入都给到一个输出,因此 S 盒的设计者给到 0 的输出映射为 0。
x\y | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 00 | 01 | 8d | f6 | cb | 52 | 7b | d1 | e8 | 4f | 29 | c0 | b0 | e1 | e5 | c7 |
1 | 74 | b4 | aa | 4b | 99 | 2b | 60 | 5f | 58 | 3f | fd | cc | ff | 40 | ee | b2 |
2 | 3a | 6e | 5a | f1 | 55 | 4d | a8 | c9 | c1 | 0a | 98 | 15 | 30 | 44 | a2 | c2 |
3 | 2c | 45 | 92 | 6c | f3 | 39 | 66 | 42 | f2 | 35 | 20 | 6f | 77 | bb | 59 | 19 |
4 | 1d | fe | 37 | 67 | 2d | 31 | f5 | 69 | a7 | 64 | ab | 13 | 54 | 25 | e9 | 09 |
5 | ed | 5c | 05 | ca | 4c | 24 | 87 | bf | 18 | 3e | 22 | f0 | 51 | ec | 61 | 17 |
6 | 16 | 5e | af | d3 | 49 | a6 | 36 | 43 | f4 | 47 | 91 | df | 33 | 93 | 21 | 3b |
7 | 79 | b7 | 97 | 85 | 10 | b5 | ba | 3c | b6 | 70 | d0 | 06 | a1 | fa | 81 | 82 |
8 | 83 | 7e | 7f | 80 | 96 | 73 | be | 56 | 9b | 9e | 95 | d9 | f7 | 02 | b9 | a4 |
9 | de | 6a | 32 | 6d | d8 | 8a | 84 | 72 | 2a | 14 | 9f | 88 | f9 | dc | 89 | 9a |
A | fb | 7c | 2e | c3 | 8f | b8 | 65 | 48 | 26 | c8 | 12 | 4a | ce | e7 | d2 | 62 |
B | 0c | e0 | 1f | ef | 11 | 75 | 78 | 71 | a5 | 8e | 76 | 3d | bd | bc | 86 | 57 |
C | 0b | 28 | 2f | a3 | da | d4 | e4 | 0f | a9 | 27 | 53 | 04 | 1b | fc | ac | e6 |
D | 7a | 07 | ae | 63 | c5 | db | e2 | ea | 94 | 8b | c4 | d5 | 9d | f8 | 90 | 6b |
E | b1 | 0d | d6 | eb | c6 | 0e | cf | ad | 08 | 4e | d7 | e3 | 5d | 50 | 1e | b3 |
F | 5b | 23 | 38 | 34 | 68 | 46 | 03 | 8c | dd | 9c | 7d | a0 | cd | 1a | 41 | 1c |
例 4.7 从上表中有下面的式子
\]
可以确定到 C 行 2 列,查表得到它的多项式逆为:
\]
这可以通过如下乘法验证:
\]
注意到,上面的表格中并不包含 S 盒本身。
4.4 AES 的内部结构
下面我们会讨论 AES 的内部构造。在 AES 的单轮中,16 字节的输入 \(A_0,...,A_{15}\) 按字节给到 S 盒,S 盒的 16 字节的输出 \(B_0,...,B_{15}\) 在 ShiftRows 层按字节置换,并给到 MixColumn 层进行混合转换 \(c(x)\),最后,128 位子密钥 \(k_i\) 域中间结果进行异或。AES 是面向字节的块运算。
这与 DES 不同,DES 进行的是按位置换,是面向位的结构。
我们首先想象一个状态 A,由 16 字节的 \(A_0,A_1,...,A_{15}\) 组成,并以 \(4\times 4\) 矩阵准备:
\(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}\) |
AES 对元素当前状态据帧的行列进行操作。相似的,密钥字节以 \(4\times 4\) 矩阵(128 位密钥),6 列矩阵(192 位密钥),8 列矩阵(256 位密钥)。下面是 192 位密钥的表示:
\(k_0\) | \(k_4\) | \(k_8\) | \(k_{12}\) | \(k_{16}\) | \(k_{20}\) |
---|---|---|---|---|---|
\(k_1\) | \(k_5\) | \(k_9\) | \(k_{13}\) | \(k_{17}\) | \(k_{21}\) |
\(k_2\) | \(k_6\) | \(k_{10}\) | \(k_{14}\) | \(k_{18}\) | \(k_{22}\) |
\(k_3\) | \(k_7\) | \(k_{11}\) | \(k_{15}\) | \(k_{19}\) | \(k_{23}\) |
4.4.1 字节替换层
每一轮的第一层都是字节替换层。字节替换层,可以看作是 16 行的平行 S 盒,具有 8 个输入与输出位。注意到,16 个 S 盒都是相同的。在这一层,每一个状态 \(A_i\) 都被 \(B_i\) 替换:
\]
S 盒是 AES 中唯一的非线性元素,既 \(字节替换(A) + 字节替换(B) \ne 字节替换(A+B)\)。S 盒替换是双向映射,既对于 \(2^8 = 256\) 可能的输入,有一一映射的输出元素。在软件中 S 盒可以通过查表实现。
x\y | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 63 | 7c | 77 | 7b | f2 | 6b | 6f | c5 | 30 | 01 | 67 | 2b | fe | d7 | ab | 76 |
1 | ca | 82 | c9 | 7d | fa | 59 | 47 | f0 | ad | d4 | a2 | af | 9c | a4 | 72 | c0 |
2 | b7 | fd | 93 | 26 | 36 | 3f | f7 | cc | 34 | a5 | e5 | f1 | 71 | d8 | 31 | 15 |
3 | 04 | c7 | 23 | c3 | 18 | 96 | 05 | 9a | 07 | 12 | 80 | e2 | eb | 27 | b2 | 75 |
4 | 09 | 83 | 2c | 1a | 1b | 6e | 5a | a0 | 52 | 3b | d6 | b3 | 29 | e3 | 2f | 84 |
5 | 53 | d1 | 00 | ed | 20 | fc | b1 | 5b | 6a | cb | be | 39 | 4a | 4c | 58 | cf |
6 | d0 | ef | aa | fb | 43 | 4d | 33 | 85 | 45 | f9 | 02 | 7f | 50 | 3c | 9f | a8 |
7 | 51 | a3 | 40 | 8f | 92 | 9d | 38 | f5 | bc | b6 | da | 21 | 10 | ff | f3 | d2 |
8 | cd | 0c | 13 | ec | 5f | 97 | 44 | 17 | c4 | a7 | 7e | 3d | 64 | 5d | 19 | 73 |
9 | 60 | 81 | 4f | dc | 22 | 2a | 90 | 88 | 46 | ee | b8 | 14 | de | 5e | 0b | db |
A | e0 | 32 | 3a | 0a | 49 | 06 | 24 | 5c | c2 | d3 | ac | 62 | 91 | 95 | e4 | 79 |
B | e7 | c8 | 37 | 6d | 8d | d5 | 4e | a9 | 6c | 56 | f4 | ea | 65 | 7a | ae | 08 |
C | ba | 78 | 25 | 2e | 1c | a6 | b4 | c6 | e8 | dd | 74 | 1f | 4b | bd | 8b | 8a |
D | 70 | 3e | b5 | 66 | 48 | 03 | f6 | 0e | 61 | 35 | 57 | b9 | 86 | c1 | 1d | 9e |
E | e1 | f8 | 98 | 11 | 69 | d9 | 8e | 94 | 9b | 1e | 87 | e9 | ce | 55 | 28 | df |
F | 8c | a1 | 89 | 0d | bf | e6 | 42 | 68 | 41 | 99 | 2d | 0f | b0 | 54 | bb | 16 |
例 4.8 我们假设 S 盒输入为 \(A_i = (C2)_{hex}\),那么它的替换值是:
\]
在比特层级,替换可以描述为:
\]
虽然 S 盒是双向的,它并没有任何固定的点,既不存在输入 \(A_i\) 从而有 \(S(A_i) = A_i\),即便输入 0 也不是不变的:
\]
例 4.9 让我们假设字节替换的输入为:
\]
一十六进制表示,输出状态是:
\]
S盒的数学描述
略
4.4.2 扩散层
在 AES 算法中,扩散由两个子层组成,ShiftRows 转换与 MixColumn 转换。不像 S 盒,扩散层进行的操作是线性的,有:
\]
ShiftRows 层
ShiftRows 转换进行下面的移位:第一行不变,第二行循环左移一位,第二行循环左移两位,第三行循环三位。
\(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}\) |
输出新状态如下:
\(B_0\) | \(B_4\) | \(B_8\) | \(B_{12}\) |
---|---|---|---|
\(B_5\) | \(B_9\) | \(B_{13}\) | \(B_1\) |
\(B_{10}\) | \(B_{14}\) | \(B_2\) | \(B_6\) |
\(B_{15}\) | \(B_3\) | \(B_7\) | \(B_{11}\) |
MixColumn 层
MixColumn 步是线性转换,会混合每一个状态矩阵的列。因为每一个输入会影响四个输出字节,MixColumn 操作是 AES 中主要带来扩散的组件。ShiftRows 以及 MixColumn 二者组合仅需要三轮,状态矩阵的每一个字节将与所有 16 字节的原文有关。
我们将 16 字节的输入表示为 B,输出表示为 C:
\]
这里 B 为 ShiftRows 的输出。
现在每四个字节列考虑为一个向量,乘一个 \(4\times 4\) 矩阵,其中乘法与加法的系数属于 \(GF(2^8)\)。比如,如下例:
\begin{pmatrix}
C_0 \\
C_1 \\
C_2 \\
C_3
\end{pmatrix}
=
\begin{pmatrix}
02 & 03 & 01 & 01 \\
01 & 02 & 03 & 01 \\
01 & 01 & 02 & 03 \\
03 & 01 & 01 & 02
\end{pmatrix}
\begin{pmatrix}
B_0 \\
B_5 \\
B_{10} \\
B_{15}
\end{pmatrix}
\end{equation}
\]
对应的,第二列输出 \((C_4,C_5,C_6,C_7)^T\) 是由 \((B_4,B_9,B_{14},B_3)\) 使用相同的常矩阵计算得到,以此类推。
每一个状态字节 \(C_i\) 以及 \(B_i\) 是 8 位值,表示为 \(GF(2^8)\) 中的元素。所有计算都是在伽罗瓦域中进行的。比如矩阵中的常量是以十六进制表示的 01,实际上是 \(GF(2^8)\) 多项式系数 (0000 0001),既在伽罗瓦域中的 1;02,是多项式系数 (0000 0010),既伽罗瓦域中的 x;03 是多项式系数 (0000 0011),既伽罗瓦域 x+1。
在向量矩阵乘法中的加法是 \(GF(2^8)\) 中的加法。我们选择 01,02,03 做为矩阵常量,是因为它十分高效。都可以通过查表快速得到。
例 4.11 假设输入给 MixColumn 层的状态是:
\]
只需要进行 02,03 乘法计算:
= x^6 + x^3 + x
\]
=(x^6+x^3+x)+(x^5+x^2+1) \\
=x^6+x^5+x^3+x^2+x+1
\]
因为中间产物的阶都低于 8,因此不需要通过 \(P(x)\) 进行降阶计算。输出为:
\]
因此输出为:
\]
4.4.3 密钥加法层
输入给密钥加法层的两个输入是当前 16 字节的状态矩阵以及 16 字节的子密钥。两个输入通过按位异或操作结合。注意到异或操作与伽罗瓦域 \(GF(2)\) 的加法等效。子密钥通过密钥策略计算得到。
4.4.4 密钥策略
密钥策略使用原始输入密钥(128/192/256位)计算得到子密钥。子密钥的异或加法在 AES 的输入与输出都会用到。这个过程有时称作密钥漂白。子密钥数量等于轮数加一。对于密钥长度为 128 位,轮数是 10,因此共有 11 个子密钥,每一个子密钥为 128 位。192 位密钥长度有 13 个 128 位子密钥。256 位密钥长度有 15个 128 位子密钥。AES 子密钥递归计算,既计算 \(k_i\) 需要知道 \(k_{i-1}\)。
AES 密钥策略是基于字的(在这里说的字为32位)。对于不同的初始密钥长度,AES 具有不同的密钥策略,不过它们的策略是相似的。
128 位长 AES 密钥策略
11 个子密钥存储在密钥扩展数组 \(W[0],...,W[43]\)。
第一个子密钥 \(k_0\) 就是 AES 的原始密钥。既 \(W[0] - W[3]\),剩下的密钥最左侧的字通过下面的步骤计算:
\]
其中 \(g()\) 为非线性函数。
剩下的子密钥三个字通过下面的方式计算:
\]
\(g()\) 函数旋转它的四个输入字节,执行按位的 S 盒替换,并添加轮系数 RC。轮系数是伽罗瓦域 \(GF(2^8)\) 中的元素,既一个 8 位的值,只会添加到最左侧的字节。轮系数每一轮都不同:
RC[2] = x^1 = (0000 0010)_2 \\
RC[3] = x^2 = (0000 0011)_2 \\
... \\
RC[10] = x^9 = (00110110)_2
\]
函数 \(g()\) 为密钥策略添加非线性属性,并消除了 AES 中的对称性。
192 位长 AES 密钥策略
略
256 位长 AES 密钥策略
略
4.5 解密
因为 AES 不是基于 Feistel 网络,所有的层必须做反转,既字节替换层变成逆字节替换层,ShiftRows 层编程逆 ShiftRows 层,MixColumn 层变成逆 MixColumn 层。不过,我们可以看到,各层的逆操作与用于加密的层是相似的。子密钥的顺序也是逆转的,既,我们需要逆转密钥策略。
因为最后一个加密轮不会进行 MixColum 操作,第一个解密层不会包含对应的逆转层。所有其他的解密层,包含全部的 AES 层。
MixColumn 逆层
为了得到 MixColumn 的逆操作,需要使用 MixColumn 中使用矩阵的逆,计算是遵循 \(GF(2^8)\) 的:
\begin{pmatrix}
B_0 \\
B_1 \\
B_2 \\
B_3
\end{pmatrix}
=
\begin{pmatrix}
0E & 0B & 0D & 09 \\
09 & 0E & 0B & 0D \\
0D & 09 & 0E & 0B \\
0B & 0D & 09 & 0E
\end{pmatrix}
\begin{pmatrix}
C_0 \\
C_1 \\
C_2 \\
C_3
\end{pmatrix}
\end{equation}
\]
ShiftRows 逆层
为了逆转 ShiftRows 操作,我们必须按照相反的方向移位,比如下面的子层:
\(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}\) |
那么它的逆转就是:
\(B_0\) | \(B_4\) | \(B_8\) | \(B_{12}\) |
---|---|---|---|
\(B_{13}\) | \(B_1\) | \(B_5\) | \(B_9\) |
\(B_{10}\) | \(B_{14}\) | \(B_2\) | \(B_6\) |
\(B_7\) | \(B_{11}\) | \(B_{15}\) | \(B_3\) |
字节替换逆层
因为 AES 的 S 盒是一一映射的关系,因此可以获得 S 盒的逆:
\]
其中 \(A_i\) 以及 \(B_i\) 是状态矩阵的元素。逆 S 盒如下表:
x/y | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 52 | 09 | 6a | d5 | 30 | 36 | a5 | 38 | bf | 40 | a3 | 9e | 81 | f3 | d7 | fb |
1 | 7c | e3 | 39 | 82 | 9b | 2f | ff | 87 | 34 | 8e | 43 | 44 | c4 | de | e9 | cb |
2 | 54 | 7b | 94 | 32 | a6 | c2 | 23 | 3d | ee | 4c | 95 | 0b | 42 | fa | c3 | 4e |
3 | 08 | 2e | a1 | 66 | 28 | d9 | 24 | b2 | 76 | 5b | a2 | 49 | 6d | 8b | d1 | 25 |
4 | 72 | f8 | f6 | 64 | 86 | 68 | 98 | 16 | d4 | a4 | 5c | cc | 5d | 65 | b6 | 92 |
5 | 6c | 70 | 48 | 50 | fd | ed | b9 | da | 5e | 15 | 46 | 57 | a7 | 8d | 9d | 84 |
6 | 90 | d8 | ab | 00 | 8c | bc | d3 | 0a | f7 | e4 | 58 | 05 | b8 | b3 | 45 | 06 |
7 | d0 | 2c | 1e | 8f | ca | 3f | 0f | 02 | c1 | af | bd | 03 | 01 | 13 | 8a | 6b |
8 | 3a | 91 | 11 | 41 | 4f | 67 | dc | ea | 97 | f2 | cf | ce | f0 | b4 | e6 | 73 |
9 | 96 | ac | 74 | 22 | e7 | ad | 35 | 85 | e2 | f9 | 37 | e8 | 1c | 75 | df | 6e |
A | 47 | f1 | 1a | 71 | 1d | 29 | c5 | 89 | 6f | b7 | 62 | 0e | aa | 18 | be | 1b |
B | fc | 56 | 3e | 4b | c6 | d2 | 79 | 20 | 9a | db | c0 | fe | 78 | cd | 5a | f4 |
C | 1f | dd | a8 | 33 | 88 | 07 | c7 | 31 | b1 | 12 | 10 | 59 | 27 | 80 | ec | 5f |
D | 60 | 51 | 7f | a9 | 19 | b5 | 4a | 0d | 2d | e5 | 7a | 9f | 93 | c9 | 9c | ef |
E | a0 | e0 | 3b | 4d | ae | 2a | f5 | b0 | c8 | eb | bb | 3c | 83 | 53 | 99 | 61 |
F | 17 | 2b | 04 | 7e | ba | 77 | d6 | 26 | e1 | 69 | 14 | 63 | 55 | 21 | 0c | 7d |
解密密钥策略
解密时我们需要反方向顺序的子密钥。
4.6 软件与硬件实现
软件
不像 DES,AES 设计通过软件高效实现是可行的。核心的思想是将所有轮通过软件查表实现,只需要四个表格,每一个表格由 256 条目组成,每一个条目是 32 位宽。这些表称为 T 盒。在 1.2 GHz 的英特尔处理器上,可以达到 400Mbps。理论上在 64 位 Athlon CPU 上带宽可达 1.6Gbps。
硬件
实现 AES 相较于 DES 算法需要更多的硬件资源。不过在现今的集成电路上,这都不成问题,AES 可以在现代 ASIC 或 FPGA 技术上实现非常高的带宽。商用 AES ASICs 可以超过 10Gbps。使用并行技术,速度可以更快。
4 - 高级加密标准 (AES)的更多相关文章
- AES高级加密标准简析
1 AES高级加密标准简介 1.1 概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区 ...
- 高级加密标准(英语:Advanced Encryption Standard,缩写:AES)
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.
- 对称加密之AES加密详解
最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- 【Android工具】DES终结者加密时报——AES加密演算法
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...
- Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密
本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1. 摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...
- 【java编程】加密算法-对称加密及AES加密算法
转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...
- 信息安全-加密:AES 加密
ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...
- iOS加密之AES
心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...
- AES--高级数据加密标准
AES--高级数据加密标准 对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上 ...
随机推荐
- 删除resource中的图片后编译报错
同僚的一篇文章是:https://www.cnblogs.com/jljxxf/archive/2012/08/19/2646937.html, 详细介绍了C#的Resources,其中关于删除资源这 ...
- Unreal 各种指针类型是怎么回事
引言 读完本篇文章,你会了解为何UE中C++作为其开发语言,使用的指针,为何各式各样. 你需要对UE有所了解,如果不了解也没关系,也可以看下这篇文章,就当了解一下最复杂的应用的系统指针设计是如何. 可 ...
- 01Python变量的使用
Python变量 变量的定义 变量:在程序运行过程中,值会发生变化的量 把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做"变量". 变量的作用 我 ...
- vue3.0+echart可视化
vue3.0 + echart可视化 案例1: 案例代码 <template> <div ref="test" style="width:800px;h ...
- Ansible-playbook 快速入门到放弃
Ansible-playbook 快速入门到放弃 隔岸红尘忙似火,当轩青嶂冷如冰. 1-简介 playbook 相当于可以把模块命令都写入到配置文件里面,这样就可以直接执行配置文件了,类似脚本. 2- ...
- Win下依据端口排查步骤
Win下依据端口排查步骤 目录 Win下依据端口排查步骤 1 排查步骤 2 参考 今天突然发现自己电脑出现7680端口的内网连接,决定看看这个端口是做什么用的 1 排查步骤 确认7680端口连接情况与 ...
- GPIO 和轮询控制 LED 的状态
GPIO 概念 I/O 是输入(Input)和输出(Output)的意思,GPIO(General Purpose I/O)是基本输入输出,是 I/O 的最基本形式.STM32F103ZET6 大概有 ...
- Solon2 与 Spring Boot 的区别
1.与 Springboot 的常用注解比较 Solon 2.2.0 Springboot 2.7.8 说明 @Inject * @Autowired 注入Bean(by type) @Inject( ...
- WPF标题栏自定义
1.废话不多说直接上代码 <Window.Resources> <Style x:Key="btnTitleMaxMin" TargetType="Bu ...
- python启动robotframework-ride失败,解决方案
python启动robotframework-ride提示str(os.path.dirname(rf_file), 'utf-8'))).publish() UnicodeDecodeErro的解决 ...