如何确定我可以在 dm-crypt/LUKS 中使用哪些密码和密码模式?

15 encryption disk-encryption luks dm-crypt

我使用的是基于 Ubuntu 的系统,但很难确定我可以使用哪些密码和密码模式。

cryptsetup 手册页说:

“有关可用选项的列表,请参阅 /proc/crypto。您可能需要加载其他内核加密模块才能获得更多选项。”

我的 /proc/crypto 里面的内容很少。如何找出可供我加载的额外内核加密模块?

not*_*erg 13

有许多文档和手册页需要阅读,但您可能特别感兴趣的一个文档是LUKS 磁盘格式规范(PDF)。

附录 B(很自然,接近尾声)说,

密码和哈希规范注册表

即使cipher-namecipher-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-plain64blowfish-cbc-essiv:sha256aes:64-cbc-lmk

  • 加密器 的密码来使用,例子有aesanubistwofisharc4,等内核DM-隐窝驱动程序没有密码列表。这会传递给 Linux Crypto API,因此可以使用内核支持的任何合适的密码。

  • keycount 与密码一起使用的两个密钥的可选幂。对于除lmkivmode之外的所有内容,默认为 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似乎是最常推荐的。
    • nullIV 始终为零。为了测试和向后兼容性,您不应该使用它。
    • lmk 兼容 Loop-AES 加密方案。
    • tcw 与 TrueCrypt 兼容。
    • essiv使用用密钥散列加密的扇区号。适用于像 CBC 这样的模式,当使用像plain64.
  • ivoptsessiv ivmode一起使用的散列,对于所有其他模式将被忽略。

作为一种特殊情况,“ cipher-plain ”或“ cipher ”被解释为“ cipher-cbc-plain ”。另一个特殊情况是ecbmode 没有要指定的ivmode

这与 /proc/crypto

关于/proc/crypto,只有密码模式是相关的。dm-crypt 构造一个“模式(密码)”形式的加密 API 规范,并从内核请求它。这是/proc/crypto作为namefor 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)

typeskcipher表示这是一个对称密钥加密,什么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被完全忽略。因此,标杆,aesaes-cbc,和aes-cbc-foobar都是等效的。