高级加密标准 (AES)

我的博客

原书:《Understanding Cryptography: A Text book for Students and Practitioners》

AES: Advanced Encryption Standard 是今天使用最广的对称加密运算。尽管 AES 中的标准是美国政府应用的标准,AES 块运算加密算法依旧在很多工业标准以及商务系统中使用。包括 AES 安全商务安全标准的有网络安全标准 IPsecTLSWi-Fi 加密标准 IEEE 802.11iSSHSkype 以及数不清的安全产品。迄今为止,破解 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\) 的两个元素组合,具有如下特性:

  1. 群操作 \(\circ\) 是闭合的,既对于所有的 \(a,b\in G\) 满足 \(a \circ b = c \in G\)
  2. 群操作满足结合律,既 \(a\circ (b\circ c) = (a\circ b)\circ c,a,b,c \in G\)
  3. 具有零元素 \(1 \in G\),满足 \(a\circ 1 = 1 \circ a = a,a \in G\)
  4. 对于 \(a\in G\) 存在 \(a^{-1}\in G\) 称作逆,满足 \(a\circ a^{-1} = a^{-1} \circ a = 1\)
  5. 如果 \(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

加法逆

\[-0 = 0 \\
-1 = 4 \\
-2 = 3 \\
-3 = 2 \\
-4 = 1
\]

乘法逆

\[1^{-1} = 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)\) 可以表示为:

\[A(x) = a_7 x^7 + ... + a_1 x + a_0,a_i \in GF(2) = {0,1}
\]

这样会有 \(256 = 2^8\) 个多项式,每一个多项式可以表示为如下的向量:

\[A = (a_7,a_6,a_5,a_4,a_3,a_2,a_1,a_0)
\]

4.3.4 \(GF(2^m)\) 中的加法与减法

现在我们就可以进行这个域中的加法与乘法了。AES 的密钥加法层使用加法运算。操作是直白的,只需要进行标准多项式的加法与减法:我们只需要进行系数的加法与减法操作。

定义 4.3.3 扩展域加法与减法

令 \(A(x),B(x) \in GF(2^m)\),两个元素的和可通过下式计算:

\[C(x) = A(x) + B(x) = \sum_{i = 0}^{m - 1}c_i x^i,c_i \equiv a_i + b_i \quad mod \quad 2
\]

差通过下式计算:

\[C(x) = A(x) - B(x) = \sum_{i = 0}^{m - 1}c_ix^i,c_i \equiv a_i - b_i \equiv a_i + b_i \quad mod \quad 2
\]

注意到我们对系数进行模 2 加法/减法操作。在第二章中我们知道,模 2 的加法与减法是相同的操作。模 2 加法等效于按位异或。

例 4.5 \(C(x) = A(x) + B(x)\) 是 \(GF(2^8)\) 中的两个元素

\[A(x) = x^7 + x^6 + x^4 + 1 \\
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 转换的核心,第一步,两个元素使用标准多项式乘法规则计算:

\[A(x)\cdot B(x) = (a_{m-1}x^{m-1} + ... + a_0)\cdot (b_{m-1}x^{m-1}+...+b_0) \\
C'(x) = c'_{2m-2}x^{2m-2} + ... + c'_0
\]

其中:

\[c'_0 = a_0b_0 \quad mod \quad 2\\
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)\) 且

\[P(x) = \sum_{i=0}^{m}p_ix^i,p_i \in GF(2)
\]

是一个不可约的多项式。对两个元素 \(A(x),B(x)\) 的乘法为:

\[C(x) \equiv A(x)\cdot B(x) \quad mod \quad P(x)
\]

这样每一个 \(GF(2^m)\) 多项式需要一个系数为 \(GF(2)\) 的 m 阶不可约多项式 \(P(x)\)。注意到,不是所有的多项式都是不可约的,比如,\(x^4 + x^3+x+1\) 就是可约的:

\[x^4+x^3+x+1 = (x^2+x+1)(x^2+1)
\]

例 4.6 我们想要乘 \(GF(2^4)\) 中的两个多项式 \(A(x) = x^3+x^2+1\) 与 \(B(x) = x^2 +x\),不可约的多项式为:

\[P(x) = x^4 + x + 1
\]

原多项式的乘法可以计算得:

\[C'(x) = A(x)\cdot B(x) = x^5+x^3+x^2+x
\]

我们可以像下面这样计算:

\[x^4 = 1\cdot P(x) + (x+1) \\
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^5 + x^3 + x^2 +x \quad mod \quad P(x) \\
C(x) \equiv (x^2 + x) + (x^3 + x^2 + x) = x^3 \\
A(x)\cdot B(x) \equiv x^3
\]

如果我们查看前面的例子,可以以下面的比特操作表示:

\[A \cdot B = C \\
(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}\) 有:

\[A^{-1}\cdot A(x) = 1 \quad mod \quad P(x)
\]

对于小的域,在实践中,通常意味着具有 \(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 从上表中有下面的式子

\[x^7 + x^6 + x = (1100 0010)_2 = (C2)_{hex} = (xy)
\]

可以确定到 C 行 2 列,查表得到它的多项式逆为:

\[(2F)_{hex} = (00101111)_2 = x^5+x^3+x^2+x+1
\]

这可以通过如下乘法验证:

\[(x^7+x^6+x)\cdot(x^5+x^3+x^2+x+1) \equiv 1 \quad mod \quad P(x)
\]

注意到,上面的表格中并不包含 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(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((C2)_{hex}) = (25)_{hex}
\]

在比特层级,替换可以描述为:

\[S(11000010) = (00100101)
\]

虽然 S 盒是双向的,它并没有任何固定的点,既不存在输入 \(A_i\) 从而有 \(S(A_i) = A_i\),即便输入 0 也不是不变的:

\[(00000000) = (01100011)
\]

例 4.9 让我们假设字节替换的输入为:

\[(C2,C2,...,C2)
\]

一十六进制表示,输出状态是:

\[(25,25,...,25)
\]

S盒的数学描述

4.4.2 扩散层

在 AES 算法中,扩散由两个子层组成,ShiftRows 转换与 MixColumn 转换。不像 S 盒,扩散层进行的操作是线性的,有:

\[DIFF(A) + DIFF(B) = DIFF(A+B)
\]

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:

\[MixColumn(B) = C
\]

这里 B 为 ShiftRows 的输出。

现在每四个字节列考虑为一个向量,乘一个 \(4\times 4\) 矩阵,其中乘法与加法的系数属于 \(GF(2^8)\)。比如,如下例:

\[\begin{equation}
\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 层的状态是:

\[B = (25,25,...,25)
\]

只需要进行 02,03 乘法计算:

\[02\cdot 25 = x\cdot(x^5 + x^2 + 1)\\
= x^6 + x^3 + x
\]
\[03\cdot 25 = (x+1)(x^5+x^2+1)\\
=(x^6+x^3+x)+(x^5+x^2+1) \\
=x^6+x^5+x^3+x^2+x+1
\]

因为中间产物的阶都低于 8,因此不需要通过 \(P(x)\) 进行降阶计算。输出为:

\[C_i = (x^5+x^2+1)+(x^5+x^2+1)+(x^6+x^3+x)+(x^6+x^5+x^3+x^2+x+1) = (x^5+x^2+1) = 25
\]

因此输出为:

\[C = (25,25,...,25)
\]

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]\),剩下的密钥最左侧的字通过下面的步骤计算:

\[W[4i] = W[4(i-1)] + g(W[4i-1]) \quad i = 1,...,10
\]

其中 \(g()\) 为非线性函数。

剩下的子密钥三个字通过下面的方式计算:

\[W[4i+j] = W[4i+j-1]+W[4(i-1)+j] \quad i= 1,...,10,j=1,2,3
\]

\(g()\) 函数旋转它的四个输入字节,执行按位的 S 盒替换,并添加轮系数 RC。轮系数是伽罗瓦域 \(GF(2^8)\) 中的元素,既一个 8 位的值,只会添加到最左侧的字节。轮系数每一轮都不同:

\[RC[1] = x^0 = (0000 0001)_2 \\
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{equation}
\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 = S^{-1}(B_i) = S^{-1}(S(A_i))
\]

其中 \(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)的更多相关文章

  1. AES高级加密标准简析

    1 AES高级加密标准简介 1.1 概述 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区 ...

  2. 高级加密标准(英语:Advanced Encryption Standard,缩写:AES)

    2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一.

  3. 对称加密之AES加密详解

    最近有人问我AES对称加密是啥,我回答了个大概,发现自己不能清晰的讲出来,特此记录,以供学习 一.对称加密 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decrypti ...

  4. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  5. 【Android工具】DES终结者加密时报——AES加密演算法

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 在前面的两篇文章中.我们介绍了DES算法,3DES算法以及他们的Android程序实现,并研究了怎样才干实现 ...

  6. Asp.Net Core 2.0 项目实战(7)MD5加密、AES&DES对称加解密

    本文目录 1. 摘要 2. MD5加密封装 3. AES的加密.解密 4. DES加密/解密 5. 总结 1.  摘要 C#中常用的一些加密和解密方案,如:md5加密.RSA加密与解密和DES加密等, ...

  7. 【java编程】加密算法-对称加密及AES加密算法

    转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...

  8. 信息安全-加密:AES 加密

    ylbtech-信息安全-加密:AES 加密 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一 ...

  9. iOS加密之AES

    心急的童鞋直接看这里Demo 运行之后可以去在线加密网站验证 AES(Advanced Encryption Standard)高级加密标准,又称Rijndael加密法,是美国联邦政府采用的一种区块加 ...

  10. AES--高级数据加密标准

    AES--高级数据加密标准 对称密码体制的发展趋势将以分组密码为重点.分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成.密钥扩展算法将b字节用户主密钥扩展成r个子密钥.加密算法由一个密码学上 ...

随机推荐

  1. 删除resource中的图片后编译报错

    同僚的一篇文章是:https://www.cnblogs.com/jljxxf/archive/2012/08/19/2646937.html, 详细介绍了C#的Resources,其中关于删除资源这 ...

  2. Unreal 各种指针类型是怎么回事

    引言 读完本篇文章,你会了解为何UE中C++作为其开发语言,使用的指针,为何各式各样. 你需要对UE有所了解,如果不了解也没关系,也可以看下这篇文章,就当了解一下最复杂的应用的系统指针设计是如何. 可 ...

  3. 01Python变量的使用

    Python变量 变量的定义 变量:在程序运行过程中,值会发生变化的量 把程序运算的中间结果临时存到内存里,以备后面的代码继续调用,这几个名字的学名就叫做"变量". 变量的作用 我 ...

  4. vue3.0+echart可视化

    vue3.0 + echart可视化 案例1: 案例代码 <template> <div ref="test" style="width:800px;h ...

  5. Ansible-playbook 快速入门到放弃

    Ansible-playbook 快速入门到放弃 隔岸红尘忙似火,当轩青嶂冷如冰. 1-简介 playbook 相当于可以把模块命令都写入到配置文件里面,这样就可以直接执行配置文件了,类似脚本. 2- ...

  6. Win下依据端口排查步骤

    Win下依据端口排查步骤 目录 Win下依据端口排查步骤 1 排查步骤 2 参考 今天突然发现自己电脑出现7680端口的内网连接,决定看看这个端口是做什么用的 1 排查步骤 确认7680端口连接情况与 ...

  7. GPIO 和轮询控制 LED 的状态

    GPIO 概念 I/O 是输入(Input)和输出(Output)的意思,GPIO(General Purpose I/O)是基本输入输出,是 I/O 的最基本形式.STM32F103ZET6 大概有 ...

  8. Solon2 与 Spring Boot 的区别

    1.与 Springboot 的常用注解比较 Solon 2.2.0 Springboot 2.7.8 说明 @Inject * @Autowired 注入Bean(by type) @Inject( ...

  9. WPF标题栏自定义

    1.废话不多说直接上代码 <Window.Resources> <Style x:Key="btnTitleMaxMin" TargetType="Bu ...

  10. python启动robotframework-ride失败,解决方案

    python启动robotframework-ride提示str(os.path.dirname(rf_file), 'utf-8'))).publish() UnicodeDecodeErro的解决 ...