加密方案
在挂载VeraCrypt卷时(假设没有缓存的密码/密钥文件)或执行预启动认证时,会执行以下步骤:
- 将卷的前512字节(即标准卷头)读入内存,其中前64字节是盐值(请参阅
VeraCrypt卷格式规范)。对于系统加密(请参阅
系统加密章节),将第一个逻辑驱动器磁道的最后512字节读入内存(VeraCrypt引导加载程序存储在系统驱动器的第一个磁道和/或VeraCrypt救援磁盘上)。
- 将卷的第65536 - 66047字节读入内存(请参阅
VeraCrypt卷格式规范部分)。对于系统加密,将活动分区后面的第一个分区的第65536 - 66047字节读入内存(请参阅
隐藏操作系统部分)。如果此卷(或引导分区后面的分区)内有隐藏卷,此时我们已经读取了其卷头;否则,我们只是读取了随机数据(是否存在隐藏卷必须通过尝试解密此数据来确定;更多信息请参阅
隐藏卷部分)。
- 现在VeraCrypt尝试解密在步骤(1)中读取的标准卷头。解密过程中使用和生成的所有数据都保存在内存中(VeraCrypt从不将它们保存到磁盘)。以下参数是未知的†,必须通过试错过程(即测试以下所有可能的组合)来确定:
- 头密钥派生函数使用的伪随机函数(PRF,如PKCS #5 v2.0中所指定;请参阅
头密钥派生、盐值和迭代次数部分),可以是以下之一:
HMAC - SHA - 512、HMAC - SHA - 256、HMAC - BLAKE2S - 256、HMAC - Whirlpool。如果用户明确指定了PRF,则将直接使用它,而不尝试其他可能性。
用户输入的密码(可能已应用了一个或多个密钥文件 - 请参阅
密钥文件部分)、PIM值(如果指定)和在步骤(1)中读取的盐值将传递给头密钥派生函数,该函数会生成一系列值(请参阅
头密钥派生、盐值和迭代次数部分),从中形成头加密密钥和辅助头密钥(XTS模式)。(这些密钥用于解密卷头。)
- 加密算法:AES - 256、Serpent、Twofish、AES - Serpent、AES - Twofish - Serpent等。
- 操作模式:仅支持XTS模式
- 密钥大小
- 如果解密数据的前4个字节包含ASCII字符串“VERA”,并且解密数据(卷头)的最后256字节的CRC - 32校验和与解密数据的第8字节处的值匹配,则认为解密成功(该值对手是未知的,因为它是加密的 - 请参阅
VeraCrypt卷格式规范部分)。如果不满足这些条件,过程将从步骤(3)重新开始,但这次使用在步骤(2)中读取的数据(即可能的隐藏卷头)。如果仍然不满足条件,则挂载终止(密码错误、卷损坏或不是VeraCrypt卷)。
- 现在我们知道(或极有可能假设)我们拥有正确的密码、正确的加密算法、模式、密钥大小和正确的头密钥派生算法。如果我们成功解密了在步骤(2)中读取的数据,我们还知道我们正在挂载一个隐藏卷,并且其大小可以从在步骤(3)中解密的步骤(2)读取的数据中获取。
- 使用主主密钥**和辅助主密钥(XTS模式 - 请参阅
操作模式部分)重新初始化加密例程,这些密钥从解密的卷头中获取(请参阅
VeraCrypt卷格式规范部分)。这些密钥可用于解密卷的任何扇区,但卷头区域(或系统加密的密钥数据区域)除外,该区域使用头密钥进行加密。卷被挂载。
另请参阅
操作模式部分、
头密钥派生、盐值和迭代次数部分以及
安全模型章节。
* 如果活动分区的大小小于256 MB,则从活动分区后面的第二个分区读取数据(Windows 7及更高版本默认不从安装它们的分区启动)。
† 保留这些参数的秘密并不是为了增加攻击的复杂性,主要是为了使VeraCrypt卷无法识别(与随机数据无法区分),如果这些参数未加密存储在卷头中,这将很难实现。另请注意,在传统MBR引导模式下,如果系统加密使用非级联加密算法,则该算法是已知的(可以通过分析存储在第一个逻辑驱动器磁道或VeraCrypt救援磁盘上的未加密VeraCrypt引导加载程序的内容来确定)。
** 主密钥是在卷创建期间生成的,之后无法更改。更改卷密码是通过使用新的头密钥(从新密码派生)重新加密卷头来实现的。
下一部分 >>