文档 技术细节 加密方案

# 加密方案

在挂载VeraCrypt卷时（假设没有缓存的密码/密钥文件）或执行预启动认证时，会执行以下步骤：

1. 将卷的前512字节（即标准卷头）读入内存，其中前64字节是盐值（请参阅 VeraCrypt卷格式规范）。对于系统加密（请参阅 系统加密章节），将第一个逻辑驱动器磁道的最后512字节读入内存（VeraCrypt引导加载程序存储在系统驱动器的第一个磁道和/或VeraCrypt救援磁盘上）。
2. 将卷的第65536 - 66047字节读入内存（请参阅 VeraCrypt卷格式规范部分）。对于系统加密，将活动分区后面的第一个分区的第65536 - 66047字节读入内存（请参阅 隐藏操作系统部分）。如果此卷（或引导分区后面的分区）内有隐藏卷，此时我们已经读取了其卷头；否则，我们只是读取了随机数据（是否存在隐藏卷必须通过尝试解密此数据来确定；更多信息请参阅 隐藏卷部分）。
3. 现在VeraCrypt尝试解密在步骤(1)中读取的标准卷头。解密过程中使用和生成的所有数据都保存在内存中（VeraCrypt从不将它们保存到磁盘）。以下参数是未知的†，必须通过试错过程（即测试以下所有可能的组合）来确定：
   1. 密钥推导函数（KDF）及其相关参数：
      - PBKDF2-HMAC：头密钥派生函数使用的伪随机函数（PRF，如PKCS #5 v2.0中所指定；请参阅 头密钥派生、盐值和迭代次数部分），可以是以下之一：HMAC-SHA-512、HMAC-SHA-256、HMAC-BLAKE2s-256、HMAC-Whirlpool、HMAC-Streebog。
      - Argon2id：用于非系统卷的内存困难型密钥推导函数，内部使用BLAKE2b-512哈希函数。

      如果用户明确指定了卷头密钥推导算法（或对于 PBKDF2-HMAC 明确指定了 PRF 哈希），VeraCrypt 将直接使用它，而不尝试其他可能性。

      用户输入的密码（可能已应用了一个或多个密钥文件 - 请参阅 密钥文件部分）、PIM值（如果指定）和在步骤(1)中读取的盐值将传递给头密钥派生函数，该函数会生成一系列值（请参阅 头密钥派生、盐值和迭代次数部分），从中形成头加密密钥和辅助头密钥（XTS模式）。（这些密钥用于解密卷头。）

   2. 加密算法：AES-256、Serpent、Twofish、AES-Serpent、AES-Twofish-Serpent等。
   3. 操作模式：仅支持XTS模式
   4. 密钥大小
4. 如果解密数据的前4个字节包含ASCII字符串“VERA”，并且解密数据（卷头）的最后256字节的CRC - 32校验和与解密数据的第8字节处的值匹配，则认为解密成功（该值对手是未知的，因为它是加密的 - 请参阅 VeraCrypt卷格式规范部分）。如果不满足这些条件，过程将从步骤(3)重新开始，但这次使用在步骤(2)中读取的数据（即可能的隐藏卷头）。如果仍然不满足条件，则挂载终止（密码错误、卷损坏或不是VeraCrypt卷）。
5. 现在我们知道（或极有可能假设）我们拥有正确的密码、正确的加密算法、模式、密钥大小和正确的头密钥派生算法。如果我们成功解密了在步骤(2)中读取的数据，我们还知道我们正在挂载一个隐藏卷，并且其大小可以从在步骤(3)中解密的步骤(2)读取的数据中获取。
6. 使用主主密钥**和辅助主密钥（XTS模式 - 请参阅 操作模式部分）重新初始化加密例程，这些密钥从解密的卷头中获取（请参阅 VeraCrypt卷格式规范部分）。这些密钥可用于解密卷的任何扇区，但卷头区域（或系统加密的密钥数据区域）除外，该区域使用头密钥进行加密。卷被挂载。

另请参阅 操作模式部分、 头密钥派生、盐值和迭代次数部分以及 安全模型章节。

* 如果活动分区的大小小于256 MB，则从活动分区后面的第二个分区读取数据（Windows 7及更高版本默认不从安装它们的分区启动）。

† 保留这些参数的秘密并不是为了增加攻击的复杂性，主要是为了使VeraCrypt卷无法识别（与随机数据无法区分），如果这些参数未加密存储在卷头中，这将很难实现。另请注意，在传统MBR引导模式下，如果系统加密使用非级联加密算法，则该算法是已知的（可以通过分析存储在第一个逻辑驱动器磁道或VeraCrypt救援磁盘上的未加密VeraCrypt引导加载程序的内容来确定）。

** 主密钥是在卷创建期间生成的，之后无法更改。更改卷密码是通过使用新的头密钥（从新密码派生）重新加密卷头来实现的。

下一部分 >>