15 encryption disk-encryption luks dm-crypt
我使用的是基于 Ubuntu 的系统,但很难确定我可以使用哪些密码和密码模式。
cryptsetup 手册页说:
“有关可用选项的列表,请参阅 /proc/crypto。您可能需要加载其他内核加密模块才能获得更多选项。”
我的 /proc/crypto 里面的内容很少。如何找出可供我加载的额外内核加密模块?
not*_*erg 13
有许多文档和手册页需要阅读,但您可能特别感兴趣的一个文档是LUKS 磁盘格式规范(PDF)。
附录 B(很自然,接近尾声)说,
密码和哈希规范注册表
即使cipher-name和cipher-mode字符串不被任何 LUKS 操作解释,它们也必须对所有实现具有相同的含义,以实现不同基于 LUKS 的实现之间的兼容性。LUKS 必须确保底层密码系统可以使用密码名称和密码模式字符串,并且由于这些字符串可能并不总是密码系统的本地字符串,LUKS 可能需要将它们映射到适当的内容。
表 1 中列出了有效的密码名称。
表 2 中列出了有效的密码模式。根据约定,使用 IV 和调整的密码模式必须从全零的 IV?/?tweak 开始。这适用于对 encrypt?/?decrypt 原语的所有调用,尤其是在处理密钥材料时。此外,这些IVs?/?tweaks 密码模式通常通过在扇区边界重新播种tweaks?/?IVs 来将密码流切割成独立的块。第一个加密的?/?解密块的全零 IV?/?tweak 要求等效于将第一个块定义为位于扇区 0 的要求。
表 3 列出了hash-spec字段的有效哈希规范。合规实现不必支持所有密码、密码模式或散列规范。
表 1:有效的密码名称
- aes - 高级加密标准 - FIPS PUB 197
- twofish - Twofish:128 位块密码 - http://www.schneier.com/paper-twofish-paper.html???? (见下文)
- 蛇 - http://www.cl.cam.ac.uk/~rja14/serpent.html
- cast5 - RFC 2144
- cast6 - RFC 2612
表 2:有效的密码模式
- ecb - 密码输出直接使用
- cbc-plain - 密码在 CBC 模式下运行。CBC 链在每个扇区都被剪切,并以扇区号作为初始向量重新初始化(转换为 32 位和小端)。此模式在 [Fru05b] 第 4 章中指定。
- cbc-essiv: hash - 密码在 ESSIV 模式下运行,使用哈希为原始密钥生成 IV 密钥。例如,当使用 sha256 作为哈希时,密码模式规范是“cbcessiv:sha256”。ESSIV 在 [Fru05b] 第 4 章中指定。
- XTS-plain64 - http://grouper.ieee.org/groups/1619/email/pdf00086.pdf,plain64平原初始向量的是64位版本的
表 3:有效的哈希规范
- sha1 - RFC 3174 - 美国安全哈希算法 1 (SHA1)
- sha256 - 根据 FIPS 180-2 的 SHA 变体
- sha512 - 根据 FIPS 180-2 的 SHA 变体
- ripemd160 - http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html ?? (见下文)
编者注:以上内容复制自规范。在撰写之后,这些文档的 URL 发生了变化:
小智 5
5.1 内核,在我写这篇文章的时候,有两种不同的格式:密码字符串,“旧”格式和“新”格式。到目前为止,这个问题中的所有内容,显然也是所有文档,都涉及“旧”格式,因此我将在此处进行描述。这仅用于加密。如果在 dm-crypt 中使用完整性,那么必须考虑 AEAD 密码,它会变得更加复杂。
内核解析的格式是“ cipher [ :
keycount ] -
mode -
ivmode [ :
ivopts ]”。示例:aes-xts-plain64
、blowfish-cbc-essiv:sha256
、aes:64-cbc-lmk
。
加密器
的密码来使用,例子有aes
,anubis
,twofish
,arc4
,等内核DM-隐窝驱动程序没有密码列表。这会传递给 Linux Crypto API,因此可以使用内核支持的任何合适的密码。
keycount
与密码一起使用的两个密钥的可选幂。对于除lmk
ivmode之外的所有内容,默认为 1,默认为 64。这实际上仅适用于 LMK,1 以外的值将无法在其他模式下正常工作。
mode与密码一起使用的块链接模式。例子是ecb
,cbc
,xts
。除了知道不ecb
使用 IV 之外,md-crypt 驱动程序将其传递给 Linux Crypto API,并且可以使用内核支持的任何链接模式。
ivmode用于为每个扇区生成初始化向量 (IV) 的算法。在典型的对称密钥加密中,与 dm-crypt 不同,IV 是加密或解密时与密钥一起传递到密码中的另一位数据。整个操作只传入了一个 IV。由于 dm-crypt 需要能够单独读写每个扇区,因此它不会将整个磁盘加密为单个操作。相反,每个扇区都有一个 IV。此处指定了创建 IV 的算法,而不是将 IV 作为数据传入。这不是 Linux Crypto API 的一部分,因为 IV 生成不是由密码完成的,并且允许的ivmode值由 dm-crypt 驱动程序定义。他们是:
plain
, plain64
, plain64be
,benbi
这些只是使用各种格式的扇区号作为 IV。适用于像 XTS 这样的块模式,这些模式旨在在使用简单且可预测的 IV 时抵抗水印等攻击。 plain64
似乎是最常推荐的。null
IV 始终为零。为了测试和向后兼容性,您不应该使用它。lmk
兼容 Loop-AES 加密方案。tcw
与 TrueCrypt 兼容。essiv
使用用密钥散列加密的扇区号。适用于像 CBC 这样的模式,当使用像plain64
.ivopts与essiv
ivmode一起使用的散列,对于所有其他模式将被忽略。
作为一种特殊情况,“ cipher-plain
”或“ cipher ”被解释为“ cipher-cbc-plain
”。另一个特殊情况是ecb
mode 没有要指定的ivmode。
/proc/crypto
关于/proc/crypto
,只有密码和模式是相关的。dm-crypt 构造一个“模式(
密码)
”形式的加密 API 规范,并从内核请求它。这是/proc/crypto
作为name
for a应该寻找的内容skcipher
。例子:
name : xts(aes)
driver : xts-aes-aesni
module : kernel
priority : 401
refcnt : 1
selftest : passed
internal : no
type : skcipher
async : yes
blocksize : 16
min keysize : 32
max keysize : 64
ivsize : 16
chunksize : 16
walksize : 16
Run Code Online (Sandbox Code Playgroud)
该type
的skcipher
表示这是一个对称密钥加密,什么DM-隐窝用途和名称xts(aes)
将被写入aes-xts
时,与DM-隐窝规定。这些keysize
字段还告诉我们可以与此密码一起使用的密钥大小。
如果这是来自模块,模块名称可能会显示module
在行中。但是,许多密码(通常是那些没有任何硬件特定代码的软件中的密码)是作为通用密码实现的,该密码与通用块链接代码相结合以生成最终的 skcipher。例如:
name : xts(anubis)
driver : xts(ecb(anubis-generic))
module : kernel
type : skcipher
name : anubis
driver : anubis-generic
module : anubis
type : cipher
Run Code Online (Sandbox Code Playgroud)
在这种情况下,anubis 密码与内核 XTS 块链接模式代码相结合以生成最终密码xts(anbuis)
,该密码已分配kernel
. 但是为了使这个可用,我们需要通用的阿努比斯密码,它来自anubis
模块。大多数密码都有一个模块别名“crypto-
密码”,可用于加载它们,例如modprobe crypto-anubis
加载提供 anubis 密码的模块。
使用该cryptsetup benchmark
命令时,只有密码和模式很重要,因为这是基准测试的全部内容。如果未指定模式,则默认为 CBC。该ivmode被完全忽略。因此,标杆,aes
,aes-cbc
,和aes-cbc-foobar
都是等效的。