高级加密标准 (AES)
高级加密标准 (AES) 是美国国家标准与技术研究院 (NIST) 在 2001 年制定的电子数据加密规范。如今,AES 被广泛使用,因为它比 DES 和三重 DES 更强大,尽管更难来实施。
要记住的要点
- AES 是一种分组密码。
- 密钥大小可以是 128/192/256 位。
- 以每个 128 位的块加密数据。
这意味着它需要 128 位作为输入,并输出 128 位的加密密文作为输出。 AES 依赖于替换置换网络原理,这意味着它是使用一系列链接操作来执行的,这些操作涉及输入数据的替换和改组。
密码的工作:
AES 对数据字节而不是位执行操作。由于块大小为 128 位,因此密码一次处理 128 位(或 16 个字节)的输入数据。
轮数取决于密钥长度,如下所示:
- 128 位密钥 – 10 轮
- 192 位密钥 – 12 轮
- 256 位密钥 – 14 轮
创建圆键:
密钥调度算法用于从密钥计算所有轮密钥。因此,初始密钥用于创建许多不同的轮密钥,这些密钥将用于相应的加密轮次。
加密:
AES 将每个块视为列主要排列中的 16 字节(4 字节 x 4 字节 = 128)网格。
[ b0 | b4 | b8 | b12 |
| b1 | b5 | b9 | b13 |
| b2 | b6 | b10| b14 |
| b3 | b7 | b11| b15 ]
每轮包括4个步骤:
- 子字节
- 移位行
- 混合列
- 添加圆键
最后一轮没有 MixColumns 轮。
SubBytes 执行替换,而 ShiftRows 和 MixColumns 执行算法中的置换。
子字节:
这一步实现了替换。
在此步骤中,每个字节都被另一个字节替换。它使用查找表执行,也称为 S-box。这种替换的方式是,一个字节永远不会被它自己替换,也不会被另一个字节替换,另一个字节是当前字节的补充。这一步的结果是一个 16 字节 (4 x 4 ) 的矩阵,就像以前一样。
接下来的两个步骤实现了排列。
移位行:
这一步就像听起来一样。每行移动特定次数。
- 第一行不移位
- 第二行向左移动一次。
- 第三行向左移动两次。
- 第四行向左移动三次。
(执行左循环移位。)
[ b0 | b1 | b2 | b3 ] [ b0 | b1 | b2 | b3 ]
| b4 | b5 | b6 | b7 | -> | b5 | b6 | b7 | b4 |
| b8 | b9 | b10 | b11 | | b10 | b11 | b8 | b9 |
[ b12 | b13 | b14 | b15 ] [ b15 | b12 | b13 | b14 ]
混合列:
这一步基本上是一个矩阵乘法。每一列都与一个特定的矩阵相乘,因此列中每个字节的位置都会改变。
最后一轮跳过此步骤。
[ c0 ] [ 2 3 1 1 ] [ b0 ]
| c1 | = | 1 2 3 1 | | b1 |
| c2 | | 1 1 2 3 | | b2 |
[ c3 ] [ 3 1 1 2 ] [ b3 ]
添加圆形键:
现在,前一阶段的结果输出与相应的轮密钥进行异或运算。在这里,这 16 个字节不被视为一个网格,而只是 128 位数据。
在所有这些回合之后,128 位加密数据作为输出返回。重复这个过程,直到所有要加密的数据都经过这个过程。
解密:
回合中的阶段可以轻松撤消,因为这些阶段与它相反,执行时会恢复更改。根据密钥大小,每 128 个块会经历 10、12 或 14 轮。
每一轮解密的阶段如下:
- 添加圆键
- 反向混合列
- 移位行
- 反向子字节
解密过程是反向完成的加密过程,因此我将解释具有显着差异的步骤。
反向混合列:
此步骤类似于加密中的 MixColumns 步骤,但用于执行操作的矩阵不同。
[ b0 ] [ 14 11 13 9 ] [ c0 ]
| b1 | = | 9 14 11 13 | | c1 |
| b2 | | 13 9 14 11 | | c2 |
[ b3 ] [ 11 13 9 14 ] [ c3 ]
反向子字节:
逆 S-box 用作查找表,并在解密期间使用它替换字节。
概括 :
AES 指令集现已集成到 CPU 中(提供数 GB/s 的吞吐量),以提高使用 AES 进行加密和解密的应用程序的速度和安全性。尽管自它推出以来已经 20 年,但我们未能打破 AES 算法,因为即使使用当前技术也是不可行的。迄今为止,唯一的漏洞仍然存在于算法的实现中。