首页 > 其他分享 >4 - 高级加密标准 (AES)

4 - 高级加密标准 (AES)

时间:2023-03-01 22:55:05浏览次数:57  
标签:AES 加密 字节 高级 GF 密钥 加法 quad

高级加密标准 (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。使用并行技术,速度可以更快。

标签:AES,加密,字节,高级,GF,密钥,加法,quad
From: https://www.cnblogs.com/arvin-blog/p/17170218.html

相关文章

  • Jmeter(五十一) - 从入门到精通高级篇 - jmeter之运动战(详解教程)
    ------------------------------------------------------------------- 转载自:北京-宏哥https://www.cnblogs.com/du-hong/p/13667219.html -------------------------......
  • java AES加密、解密(兼容windows和linux)
     1.准备工作2018年10月24日10点46分importjava.security.SecureRandom;importjavax.crypto.Cipher;importjavax.crypto.KeyGenerator;importjavax.crypto.SecretKe......
  • Jmeter(五十) - 从入门到精通高级篇 - jmeter 之模拟弱网进行测试(详解教程)
    ------------------------------------------------------------------- 转载自:北京-宏哥https://www.cnblogs.com/du-hong/p/13667219.html -------------------------......
  • 加密锁远程升级功能
    加密锁远程升级功能是指通过网络远程更新加密锁设备的固件和授权信息,以保持加密锁的安全性和可用性。这种功能通常是由加密锁厂商提供的服务,通过远程升级,可以及时修复加密......
  • 软件开发商共享加密锁方案
    多个软件开发商共享加密锁方案通常是指采用一种名为“加密锁共享方案”的技术。这种技术是指多个软件开发商使用同一款加密锁设备,将各自的软件产品与该加密锁设备绑定,从而......
  • MD5加密
    //MD5的用途?//1防篡改://发个文档,事先给别人一个MD5,是文档的摘要,//源代码管理器svn--即使电脑断网了,文件有任何改动都能被发现--本地存了一个文件的MD5--文件有更新,就再......
  • RSA加密解密
    相比较于Des对称可逆加密性能要差加密解密速度不快安全性好公开加密key,保证数据的安全传递公开解密key,保证数据的不可抵赖公钥就是公开的key私钥就是不公开的keyC#......
  • RSA加密解密及RSA加签验签
    https://www.cnblogs.com/loveyou/p/7299524.html RSA加密解密及RSA加签验签 RSA安全性应用场景说明在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念......
  • 【加密与解密】第七章①
    应用层进程通过系统调用进入内核,由系统底层完成相应地功能,这个时候内核执行出在该进程的上下文空间中。内核一指系统内核本身,二指第三方软件以内核模块方式加载的驱动文件......
  • 面试官:怎么设计大文件、大数据场景下的传输加密方案?
    某年某月某一天,冷冽寒风中,姚小毛走进了某家公司,开始了新一轮的面试。一阵寒暄后。面试官:“你好,看你的项目经验中有做过数据加密的工作,你是使用什么加密算法加解密的?”......