speaker新!iShredder™ iOS 和 Android 商业版现已面向企业用户开放。了解更多
Extended AES

Protectstar 扩展 AES

分组大小:512 位(64 字节)
密钥长度:128、256 和 512 位(16、32 和 64 字节)(默认 256 位)
工作模式:ECB、CBC、CFB、OFB 和 CTR(默认 CTR)
总轮数:24

摘要

本文档解释了我们扩展版 AES 加密算法的详细信息,该算法使用固定长度 512 位分组长度,以及 128、256 或 512 位三种可能的密钥长度。

1. 动机
标准 AES 使用 128 位消息分组长度(即 16 字节)和 128 位密钥长度。AES 也支持 192 位和 256 位密钥长度。对于 128/128(分组/密钥)的组合,AES 消息分组和密钥可以表示为 4×4 矩阵。每个矩阵单元表示一个字节,16(4×4)个单元即 16 字节,等于 128 位。

类似地,对于扩展 AES,我们使用 4×16 矩阵(4:行数,16:列数)来表示消息分组和轮密钥。扩展 AES 完全沿用原始 AES 的一些特性和函数(如轮密钥添加、列混合等),同时也有一些特性和函数是扩展 AES 特有的(如总轮数、行移位等)。

在以下章节中,将详细解释原始 AES 和扩展 AES 所使用的相关特性和函数。

2. 工作模式
扩展 AES 实现了原始 AES 所支持的所有工作模式(即电子密码本(ECB)、密文分组链接(CBC)、密文反馈(CFB)、输出反馈(OFB)和计数器(CTR))。

3. 总轮数
对于加密和解密单个分组,原始 AES 算法总共进行 10 轮操作。这个数字 10 按以下公式计算:
轮数 = (密钥长度或分组长度的字数) + 6

常数 6 是 AES 设计者根据已知的密码攻击指定和固定的。如果密钥长度为 256 位,则需要 14 轮(8+6)。

对于扩展 AES,分组长度固定为 512 位,这意味着有 16 个字,因为每个字为 4 字节。根据上述公式,总轮数为 22。实际上,由于行移位操作(详见后续章节),我们还需要额外 2 轮。因此,扩展 AES 在加密和解密单个分组时总共执行 24 轮。

4. 填充
填充操作在分组密码中用于填充消息分组和密钥分组非常常见。对于扩展 AES,我们需要对消息和密钥都进行填充。

4.1. 消息填充
在扩展 AES 中,输入消息的长度应为 512 的倍数。填充操作遵循 RFC 1321 中描述的填充机制。在该方法中,在原始最后一个消息位之后插入一个“1”位,然后追加“0”位,直到最后一个消息分组长度为 512。如果没有多余空间容纳额外的“0”位,则在消息末尾添加一个新的 512 位分组。

4.2. 密钥填充
扩展 AES 支持 16、32 和 64 字节的密钥长度。初始化密钥分组时使用用户提供的密码。如果密码字符数不足以填满密钥分组,则剩余字节用零填充。对于原始 AES,这种简单的填充就足够了,但对扩展 AES 不行。以 64 字节密钥为例,假设密码只占前 10 字节,剩下的 54 字节全为零。该初始密钥分组用于生成轮密钥,在这种情况下,会产生很多值为零的轮密钥。为了避免生成大量零轮密钥,我们会用一个固定密钥在 CBC 模式下对零填充的密钥分组执行一次原始 AES 加密。加密结果作为生成轮密钥的填充密钥,从而避免大量零值的问题。

5. 轮密钥生成
轮密钥由前述“密钥填充”部分所解释的填充密钥分组生成。扩展 AES 在原始轮密钥生成过程(见 Rijndael 分组密码规范,第 15 页)的基础上稍作修改,并采用以下算法生成轮密钥:

6. 函数
原始 AES 基本使用 4 个主要函数:消息分组与轮密钥的异或加(AddRoundKey)、S 盒查找(SboxSubstitution)、行移位(ShiftRow)和列混合(MixColumn)。

1.1.1. AddRoundKey
在轮密钥添加过程中,原始 AES 与扩展 AES 没有区别。

1.1.2. SboxSubstitution
S 盒查找过程在原始 AES 和扩展 AES 中也是相同的。

1.1.3. ShiftRow
行移位过程在原始 AES 和扩展 AES 中是不同的。原始 AES 使用 {0,1,2,3} 偏移进行行移位,即第一行不移位,第二行左移 1 字节(加密时),第三行左移 2 字节,最后一行左移 3 字节。原始 AES 在每轮中应用一次行移位,经过两轮后,行移位和列混合的组合可以在矩阵中实现完全扩散,即两轮后每个矩阵单元都会影响其他所有单元的值。

但如果在扩展 AES 中仍使用 {0,1,2,3} 偏移,完全扩散需要 5 轮而不是 2 轮。因此,我们需要找到能在更少轮数内实现完全扩散的移位偏移。为此,我们编写了一个程序(见分发源码 com.crypt.test.OptimumShiftRow.java),计算了最优的移位偏移。结果表明,扩展 AES 只能在 4 轮后实现完全扩散。候选方案有多个,我们选择了 {0,1,4,5} 作为扩展 AES 的偏移。

1.1.4. MixColumn 原始 AES 和扩展 AES 使用相同的列混合操作。原始 AES 只有 4 列,而扩展 AES 有 16 列。

参考文献: