56、密码学中的数学之美与高级加密标准AES

密码学中的数学之美与高级加密标准AES

1. 数学家的多面人生

在密码学和数学的世界里,有许多有趣的故事和人物。Koblitz在询问妻子迦勒底人是谁后,做出了一个有趣的举动:制作了带有椭圆曲线和“我爱迦勒底诗歌”文字的衬衫。这些衬衫很受学生欢迎,除了那些希望到RSA实习的学生。

数学家Victor Miller也是一个多才多艺的人。他不仅在数学领域有所建树,还在艺术方面展现出了天赋。他曾作为演员/歌手参与了17部社区戏剧制作,还在许多合唱团中演唱,并在2003年成为威斯敏斯特音乐学院声乐比赛的获胜者之一。此外,他多年来一直饲养和展示纯种猫,曾担任一个全国性品种俱乐部的主席,并在1997年培育出了美国全国最佳品种的重点色短毛猫。

Miller还是少数拥有培根数的数学家之一。他曾在电影《美丽心灵》中担任临时演员,通过与埃德·哈里斯和凯文·贝肯的关联,他的培根数为2。同时,数学家们长期以来一直在玩一个连接游戏,试图找到与保罗·埃尔德什的最短路径,米勒的埃尔德什数也是2。不过,他在职业生涯中也曾遭遇过不公平的拒绝,他关于“韦伊配对”高效计算的论文在1986年的FOCS会议上被拒,就像之前勒内·舒夫关于有限域上椭圆曲线点数计数的论文被拒一样。亨德里克·伦斯特拉曾评论说,这也许是一种荣誉的象征。

2. 高级加密标准AES的诞生

数据加密一直是信息安全领域的重要课题。早期的DES加密算法因密钥过短而受到批评,随着计算速度的快速提升,这个问题变得愈发严重。为了解决这一问题,1997年1月,美国国家标准与技术研究院(NIST)发起了一场竞赛,旨在选出新的高级加密标准(AES)。

与以往不同,这次有一个庞大的全球数学家和计算机科学家社区公开进行密码学研究。他们负责分析提交系统的安全性,密码分析人员可以将研究结果提交到NIST的AES网站或在AES会议上展示。

1998年5月15日,提交截止,共有15份提交作品被接受,并在1998年8月20 - 22日于加利福尼亚州文图拉举行的第一届高级加密标准候选会议上展示。1999年3月22 - 23日,第二届会议在意大利罗马举行,由于各种安全问题,有5个候选方案在此次会议(或之前)被淘汰。

1999年8月,NIST宣布了10个候选方案中的5个入围决赛的方案:
1. RSA的RC6(里维斯特密码6)
2. IBM的MARS
3. Counterpane的Twofish(布鲁斯·施奈尔、约翰·凯尔西、道格·怀廷、大卫·瓦格纳、克里斯·霍尔和尼尔·弗格森)
4. 罗斯·安德森、伊莱·比哈姆和拉斯·克努森(一个英国/以色列/丹麦团队)的Serpent
5. 文森特·里杰门和琼·戴蒙(一个比利时团队)的Rijndael

NIST在一份出版物中说明了他们的选择理由,由于这次选择与第二届AES会议结束时的投票结果一致,所以没有引起争议。成本和运行速度是淘汰部分候选方案的因素。

2000年4月13 - 14日,第三届AES会议在纽约市举行,对决赛方案的攻击速度仅比暴力破解略快。与会者再次投票选出他们的最爱。2000年10月2日,NIST宣布Rijndael获胜,这一结果与与会者的投票结果相符,避免了争议。Rijndael这个名字是由参与设计的比利时人文森特·里杰门和琼·戴蒙的姓氏组合而成,有多种发音,很多美国人读作“Rhine - Doll”。该算法是免版税的,这是NIST对所有提交方案的要求。由于NIST的认可和全球密码学家社区的支持,有人认为Rijndael很快将成为世界上使用最广泛的密码系统。

3. AES的特点和基本组成

AES提供了三种密钥大小的选择:128位、192位或256位,但始终对128位(16个字符)的块进行操作。轮数取决于密钥大小,通常分别表示为AES - 128(10轮)、AES - 192(12轮)或AES - 256(14轮)。与DES类似,AES源自早期系统,但它有更大的安全余量,对于128位版本,创作者发现的比暴力破解更好的攻击方法仅适用于6轮或更少轮数。

为了直观感受2的128次方的大小,将其写出来是:340,282,366,920,938,463,463,374,607,431,768,211,456。

AES主要由四个简单而快速的操作组成,这些操作作用于一个4×4的字节数组,称为“状态”。以下是这四个操作的详细介绍:

3.1 SubBytes

这个操作如其名,使用下面的表格对字节进行替换。它可以像DES的S盒一样进行说明,也被称为Rijndael S盒,但只有一个(及其逆),并且有其他表示方式。下面是Rijndael的S盒:

  99 124 119 123 242 107 111 197  48   1 103  43 254 215 171 118
 202 130 201 125 250  89  71 240 173 212 162 175 156 164 114 192
 183 253 147  38  54  63 247 204  52 165 229 241 113 216  49  21
   4 199  35 195  24 150   5 154   7  18 128 226 235  39 178 117
   9 131  44  26  27 110  90 160  82  59 214 179  41 227  47 132
  83 209   0 237  32 252 177  91 106 203 190  57  74  76  88 207
 208 239 170 251  67  77  51 133  69 249   2 127  80  60 159 168
  81 163  64 143 146 157  56 245 188 182 218  33  16 255 243 210
 205  12  19 236  95 151  68  23 196 167 126  61 100  93  25 115
  96 129  79 220  34  42 144 136  70 238 184  29 222  94  11 219
 224  50  58  10  73   6  36  92 194 211 172  98 145 149 228 121
 231 200  55 109 141 213  78 169 108  86 244 234 101 122 174   8
 186 120  37  46  28 166 180 198 232 221 116  31  75 189 139 138
 112  62 181 102  72   3 246  14  97  53  87 185 134 193  29 158
 225 248 152  17 105 217 142 148 155  30 135 233 206  85  40 223
 140 161 137  13 191 230  66 104  65 153  45  15 176  84 187  22

该表格从左到右、从上到下读取。在十进制中,0对应99,1对应124,以此类推,255对应22。这些数字以十进制表示只是为了方便,在二进制中,每个数字是一个字节,这8位可以看作是一个最高次数为7的多项式的系数。从这个角度看,该表格有更简洁的表示方式:将每个多项式映射到其模$x^8 + x^4 + x^3 + x + 1$的逆,然后进行仿射变换。

例如,Rijndael S盒将53映射到150。我们可以验证:将53转换为二进制是00110101,其多项式表示为$x^5 + x^4 + x^2 + 1$。它模$x^8 + x^4 + x^3 + x + 1$的逆是$x^5 + x^4 + x^3 + 1$,即二进制的00111001。这个逆可以使用扩展欧几里得算法计算。

多项式长除法可得:
$(x^8 + x^4 + x^3 + x + 1) = (x^3 + x^2 + 1)(x^5 + x^4 + x^2 + 1) + (x^3 + x^2 + 1)$
$(x^5 + x^4 + x^2 + 1) = (x^2)(x^3 + x^2 + 1) + 1$

最终余数为1,表明这两个多项式互质,这是一个多项式在模另一个多项式下存在逆的必要条件。通过一系列计算和代换,可验证逆的正确性。将二进制向量00111001代入仿射变换矩阵方程:
$\begin{pmatrix}
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{pmatrix}
\begin{pmatrix}
0 \
0 \
1 \
1 \
1 \
0 \
0 \
1
\end{pmatrix}
\oplus
\begin{pmatrix}
0 \
1 \
1 \
0 \
0 \
0 \
1 \
1
\end{pmatrix}
=
\begin{pmatrix}
1 \
0 \
0 \
1 \
0 \
1 \
1 \
0
\end{pmatrix}$
将输出的二进制10010110转换为十进制得到150,与表格结果一致。

若要反转仿射变换,需先进行异或操作,然后乘以上述8×8矩阵的逆。

Rijmen和Daemen选择多项式$x^8 + x^4 + x^3 + x + 1$是有原因的。它是[LiNi86]中列出的8次不可约多项式列表中的第一个。选择这个多项式是为了消除密码学家的疑虑,避免让人怀疑这个特定多项式有特殊之处,可能存在后门,使设计过程更加透明。

3.2 ShiftRows

在这一步中,第一行保持不变,第二、三、四行的字节分别向左循环移动1、2、3个字节。用$a_{i,j}$表示字节($0 \leq i, j \leq 3$),ShiftRows操作的结果如下表所示:
| 操作前 | 操作后 | 变化 |
| — | — | — |
| $a_{0,0} a_{0,1} a_{0,2} a_{0,3}$ | $a_{0,0} a_{0,1} a_{0,2} a_{0,3}$ | 无变化 |
| $a_{1,0} a_{1,1} a_{1,2} a_{1,3}$ | $a_{1,1} a_{1,2} a_{1,3} a_{1,0}$ | 左移1个字节 |
| $a_{2,0} a_{2,1} a_{2,2} a_{2,3}$ | $a_{2,2} a_{2,3} a_{2,0} a_{2,1}$ | 左移2个字节 |
| $a_{3,0} a_{3,1} a_{3,2} a_{3,3}$ | $a_{3,3} a_{3,0} a_{3,1} a_{3,2}$ | 左移3个字节 |

该步骤的逆操作是将行向右循环移动相同的字节数。

下面是ShiftRows操作的mermaid流程图:

graph TD;
    A[原始状态] --> B[第一行不变];
    A --> C[第二行左移1字节];
    A --> D[第三行左移2字节];
    A --> E[第四行左移3字节];
    B --> F[新状态];
    C --> F;
    D --> F;
    E --> F;
3.3 MixColumns

在这一步中,状态的每一列被视为一个次数不超过3的多项式。例如,列$\begin{pmatrix} a_0 \ a_1 \ a_2 \ a_3 \end{pmatrix}$被视为多项式$a(x) = a_3x^3 + a_2x^2 + a_1x + a_0$,其中系数$a_3, a_2, a_1, a_0$都是字节,它们本身又可以看作是多项式,可在SubBytes步骤中使用的不可约多项式$x^8 + x^4 + x^3 + x + 1$下进行加法和乘法运算。

在MixColumns步骤中,每一列表示的多项式乘以多项式$c(x) = 3x^3 + x^2 + x + 2$,然后模$x^4 + 1$进行约简,以确保结果仍可表示为一列(即次数不超过3的多项式)。

模$x^4 + 1$运算与模$x^8 + x^4 + x^3 + x + 1$不同。$x^4 + 1$是可约的,所以随机选择的$c(x)$不一定可逆。选择$x^4 + 1$是为了方便约简乘积。模$x^4 + 1$相当于定义$x^4 = -1$,而在模2意义下$-1 = 1$,所以$x^4 = 1$。这使得我们可以很容易地约简$x$的幂,如$x^5 = x$,$x^6 = x^2$,$x^7 = x^3$,$x^8 = x^0 = 1$,一般地,$x^n = x^{n \bmod 4}$。

因此,$c(x)a(x) = (3x^3 + x^2 + x + 2)(a_3x^3 + a_2x^2 + a_1x + a_0)$经过一系列展开和约简后,可表示为矩阵乘法:
$\begin{pmatrix}
2 & 3 & 1 & 1 \
1 & 2 & 3 & 1 \
1 & 1 & 2 & 3 \
3 & 1 & 1 & 2
\end{pmatrix}
\begin{pmatrix}
a_0 \
a_1 \
a_2 \
a_3
\end{pmatrix}$
这个操作需要应用到每一列,字节乘法是在模$x^8 + x^4 + x^3 + x + 1$下进行的。由于矩阵元素仅为1、2、3,分别对应多项式1、$x$和$x + 1$,字节乘法相对简单。乘以1模$x^8 + x^4 + x^3 + x + 1$不改变值,乘以$x$相当于所有位左移,乘以$x + 1$是先进行左移,然后与原始值进行异或。但在左移时要注意,如果最左边的位是1,左移后会移出,此时需要将结果与00011011进行异或,因为$x^7$位左移到了$x^8$,而在模$x^8 + x^4 + x^3 + x + 1$下,$x^8 = x^4 + x^3 + x + 1$。

解密时,需要使用$c(x)$模$x^4 + 1$的逆,即$d(x) = x^3 + x^2 + x + 1$。

下面是MixColumns操作的mermaid流程图:

graph TD;
    A[每列多项式] --> B[乘以c(x)];
    B --> C[模x^4 + 1约简];
    C --> D[新列多项式];
3.4 AddRoundKey

最后一步涉及密钥。这只是将状态的每个字节与相应轮次的密钥字节进行异或操作(异或操作是自逆的)。每一轮使用的是从原始密钥派生的不同密钥,具体过程如下:

首先,将原始密钥按32位一组取出,放在“扩展密钥”的开头。扩展密钥最终会被分成等大小的块,依次提供各轮的密钥。对于AES - 128,原始密钥用于初始化扩展密钥块$k_0, k_1, k_2, k_3$;对于AES - 196,此时还会填充$k_4$和$k_5$;对于AES - 256,会填充$k_6$和$k_7$。然后,更多的32位块通过递归定义。三种密钥大小的公式如下,都涉及一个函数$f$,稍后会详细介绍。

  • 128位密钥
  • 当$i \not\equiv 0 \pmod{4}$时,$k_i = k_{i - 4} \oplus k_{i - 1}$
  • 当$i \equiv 0 \pmod{4}$时,$k_i = k_{i - 4} \oplus f(k_{i - 1})$
  • 196位密钥
  • 当$i \not\equiv 0 \pmod{6}$时,$k_i = k_{i - 6} \oplus k_{i - 1}$
  • 当$i \equiv 0 \pmod{6}$时,$k_i = k_{i - 6} \oplus f(k_{i - 1})$
  • 256位密钥
  • 当$i \not\equiv 0 \pmod{8}$且$i \not\equiv 4 \pmod{8}$时,$k_i = k_{i - 8} \oplus k_{i - 1}$
  • 当$i \equiv 0 \pmod{8}$时,$k_i = k_{i - 8} \oplus f(k_{i - 1})$
  • 当$i \equiv 4 \pmod{8}$时,$k_i = k_{i - 8} \oplus f_2(k_{i - 1})$

函数$f$包括将输入循环左移1个字节,然后对每个字节使用Rijndael的S盒进行替换,最后将结果与相应的轮常量$RC$进行异或。函数$f_2$相对简单,只使用S盒,省略了移位和异或操作。

轮常量的定义如下(适用于任何密钥大小):
$RC_1 = x^0$
$RC_2 = x^1$
$RC_i = xRC_{i - 1}$($i > 2$)
随着$i$增大,需要将$RC_i$模$x^8 + x^4 + x^3 + x + 1$进行约简。前几个轮常量以字节表示为:
$RC_1 = 00000001$
$RC_2 = 00000010$
$RC_3 = 00000100$
$RC_4 = 00001000$
$RC_5 = 00010000$

下面是AddRoundKey操作的mermaid流程图:

graph TD;
    A[状态字节] --> B[与轮密钥字节异或];
    B --> C[新状态字节];

综上所述,AES通过这四个简单而高效的操作,在不同密钥大小下提供了强大的加密能力,为数据安全提供了可靠的保障。它的设计充分考虑了安全性和性能,成为了现代密码学中广泛应用的加密标准。

4. AES加密流程总结与分析

AES的加密过程是一个多步骤、系统性的操作,通过SubBytes、ShiftRows、MixColumns和AddRoundKey这四个基本操作的组合,实现了对数据的有效加密。下面我们对整个加密流程进行总结,并分析其安全性和性能特点。

4.1 加密流程总结

AES加密的整体流程可以概括如下:
1. 初始设置 :根据选择的密钥大小(128位、192位或256位),将原始密钥进行处理,生成扩展密钥。扩展密钥将用于后续各轮的加密操作。
2. 初始轮 :对输入的明文数据(以4×4字节数组“状态”表示)与第一轮的轮密钥进行异或操作(AddRoundKey)。
3. 中间轮 :重复进行SubBytes、ShiftRows、MixColumns和AddRoundKey操作,轮数根据密钥大小而定(AES - 128为9轮,AES - 192为11轮,AES - 256为13轮)。
4. 最后一轮 :与中间轮不同,最后一轮省略MixColumns操作,只进行SubBytes、ShiftRows和AddRoundKey操作。

以下是AES加密流程的mermaid流程图:

graph TD;
    A[明文数据] --> B[初始轮:AddRoundKey];
    B --> C{是否为最后一轮};
    C -- 否 --> D[SubBytes];
    D --> E[ShiftRows];
    E --> F[MixColumns];
    F --> G[AddRoundKey];
    G --> C;
    C -- 是 --> H[SubBytes];
    H --> I[ShiftRows];
    I --> J[AddRoundKey];
    J --> K[密文数据];
4.2 安全性分析

AES的安全性主要体现在以下几个方面:
- 密钥长度选择 :提供了128位、192位和256位三种密钥长度,用户可以根据实际需求选择合适的密钥长度,增加了破解的难度。例如,2的128次方是一个极其巨大的数字(340,282,366,920,938,463,463,374,607,431,768,211,456),暴力破解几乎是不可能的。
- 多轮操作 :通过多轮的SubBytes、ShiftRows、MixColumns和AddRoundKey操作,增加了数据的混淆和扩散程度,使得密文与明文之间的关系变得复杂,难以通过分析密文来推断明文。
- 设计透明 :Rijmen和Daemen在设计过程中,对选择的多项式和操作进行了详细的说明,避免了因设计不透明而引发的安全疑虑,如选择$x^8 + x^4 + x^3 + x + 1$多项式时,从公开的不可约多项式列表中选取第一个,消除了可能存在后门的担忧。

4.3 性能分析

AES的性能优势主要源于其简单而快速的基本操作:
- 操作简单 :SubBytes、ShiftRows、MixColumns和AddRoundKey这四个操作都相对简单,易于实现和优化。例如,SubBytes操作可以通过查找表的方式快速完成,ShiftRows操作只是简单的字节移位,MixColumns操作的矩阵乘法也可以利用多项式运算的特性进行简化。
- 速度快 :由于操作简单,AES在硬件和软件实现上都具有较高的执行速度。在现代计算机系统中,AES可以高效地处理大量数据的加密和解密任务。

5. AES在实际应用中的注意事项

虽然AES是一种强大的加密标准,但在实际应用中仍需要注意以下几个方面:
1. 密钥管理 :密钥的安全性是AES加密的关键。密钥的生成、存储、传输和更新都需要严格的安全措施。例如,使用安全的随机数生成器生成密钥,将密钥存储在安全的位置,使用安全的通道传输密钥等。
2. 加密模式选择 :AES通常需要结合特定的加密模式使用,如电子密码本模式(ECB)、密码块链接模式(CBC)、计数器模式(CTR)等。不同的加密模式具有不同的特点和适用场景,需要根据实际需求选择合适的加密模式。例如,ECB模式简单但存在安全性问题,不适合加密大量数据;CBC模式通过引入初始化向量(IV)增加了安全性,适用于大多数场景。
3. 性能优化 :在实际应用中,可能需要根据具体的硬件和软件环境对AES进行性能优化。例如,使用硬件加速模块(如AES - NI)可以显著提高加密和解密的速度;在软件实现中,可以采用并行计算、缓存优化等技术来提高性能。

6. 总结

AES作为高级加密标准,在密码学领域具有重要的地位。它通过四个简单而高效的操作(SubBytes、ShiftRows、MixColumns和AddRoundKey),结合不同的密钥大小和轮数,提供了强大的加密能力。其设计充分考虑了安全性和性能,具有较高的安全性和执行效率。

在实际应用中,我们需要合理选择密钥大小和加密模式,加强密钥管理,并根据具体情况进行性能优化,以确保AES能够在不同的场景中发挥最佳的加密效果,为数据安全提供可靠的保障。

通过对AES的深入了解,我们不仅可以掌握一种重要的加密技术,还能体会到密码学中数学之美和设计的精妙之处。希望本文能够帮助读者更好地理解和应用AES加密标准。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值