我正在使用基于 Ubuntu 的系统,并且很难确定我可以使用哪些密码和密码模式。
cryptsetup 手册页说:
“查看 /proc/crypto 以获取可用选项列表。您可能需要加载其他内核加密模块才能获得更多选项。”
我的 /proc/crypto 中的内容很少。如何找出哪些额外的内核加密模块可供我加载?
答案1
有很多文档和手册页需要阅读,但您可能特别感兴趣的一个文档是LUKS 磁盘格式规范(PDF)。
附录 B(自然是接近末尾)写道,
密码和哈希规范注册表
即使密码名称和密碼模式字符串不会被任何 LUKS 操作解释,它们必须对所有实现具有相同的含义,以实现基于 LUKS 的不同实现之间的兼容性。LUKS 必须确保底层密码系统可以使用密码名称和密码模式字符串,并且由于这些字符串可能并不总是密码系统的原生字符串,因此 LUKS 可能需要将它们映射到适当的内容中。
有效的密码名称列于表 1 中。
表 2 列出了有效的密码模式。根据约定,使用 IV 和调整的密码模式必须从全零 IV/调整开始。这适用于对加密/解密原语的所有调用,尤其是在处理密钥材料时。此外,这些 IV/调整密码模式通常通过在扇区边界重新植入调整/IV 将密码流切割成独立的块。第一个加密/解密块的全零 IV/调整要求等同于将第一个块定义为位于扇区 0 的要求。
表 3 列出了有效的哈希规范哈希规范字段。兼容的实现不必支持所有密码、密码模式或哈希规范。
表 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:哈希- 密码在 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 已发生更改:
- Twofish:128 位分组密码 (新网址)
- 哈希函数 RIPEMD-160 (新网址)
答案2
在我撰写本文时,内核 5.1 的版本有两种不同的密码字符串格式,即“旧”格式和“新”格式。到目前为止,这个问题中的所有内容,以及显然所有文档,都涉及“旧”格式,因此我将在此进行描述。这仅适用于加密。如果使用 dm-crypt 的完整性,则必须考虑 AEAD 密码,这会变得更加复杂。
内核解析的格式是“密碼[:
键数]-
模式-
iv模式[:
伊沃普茨]“。 例子:aes-xts-plain64
,blowfish-cbc-essiv:sha256
,aes:64-cbc-lmk
。
密碼 要使用的密码,例如
aes
,,,,等。内核anubis
dm -crypt 驱动程序没有密码列表。这会传递给 Linux Crypto API,因此可以使用内核支持的任何合适密码twofish
。arc4
键数 可选的用于密码的密钥的幂数。除 ivmode 外,其他所有模式的默认值均为 1
lmk
,ivmode 的默认值为 64。这实际上仅适用于 LMK,1 以外的值将无法在其他模式下正常工作。模式与密码一起使用的块链接模式。示例为
ecb
、、cbc
。xts
除了知道ecb
不使用 IV 之外,md-crypt 驱动程序还会将其传递给 Linux Crypto API,并且可以使用内核支持的任何链接模式。iv模式用于生成每个扇区的初始化向量 (IV) 的算法。在典型的对称密钥加密中,与 dm-crypt 不同,IV 是加密或解密时与密钥一起传递到密码中的另一位数据。整个操作只传递一个 IV。由于 dm-crypt 需要能够单独读取和写入每个扇区,因此它不会将整个磁盘加密为单个操作。相反,每个扇区都有一个 IV。这里指定了创建 IV 的算法,而不是将 IV 作为数据传递。这不是 Linux Crypto API 的一部分,因为 IV 生成不是由密码完成的,并且允许iv模式值由 dm-crypt 驱动程序定义。它们是:
plain
,plain64
,plain64be
,benbi
这些只是使用各种格式的扇区号作为 IV。适用于 XTS 等块模式,旨在使用简单且可预测的 IV 来抵御水印等攻击。plain64
似乎是最常推荐的。null
IV 始终为零。出于测试和向后兼容性考虑,您不应使用此选项。lmk
与Loop-AES加密方案兼容。tcw
与 TrueCrypt 兼容。essiv
使用通过密钥哈希加密的扇区号。适用于使用简单 IV(如)时无法抵御各种攻击的模式(如 CBC)plain64
。
伊沃普茨要使用的哈希
essiv
iv模式,其他所有模式均忽略。
作为特例,“密碼-plain
“ 要不就 ”密碼“被解释为”密碼-cbc-plain
“。另一个特殊情况是ecb
模式没有iv模式指定。
这与/proc/crypto
对于/proc/crypto
,只有密碼和模式是相关的。dm-crypt 构建了一个 Crypto API 规范,形式为“模式(
密碼)
“并从内核请求它。这是在 中应该寻找的内容。/proc/crypto
例如:name
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
表示这是一个对称密钥密码、dm-crypt 使用的密钥以及在使用 dm-crypt 指定时写入的名称。这些字段type
还告诉我们此密码可以使用哪些密钥大小。skcipher
xts(aes)
aes-xts
keysize
如果这是来自模块,模块名称可能会显示在行中module
。但是,许多密码(通常是那些没有任何硬件特定代码的软件中的密码)都是作为通用密码实现的,该密码与通用块链接代码相结合以生成最终的 skcipher。例如:
name : xts(anubis)
driver : xts(ecb(anubis-generic))
module : kernel
type : skcipher
name : anubis
driver : anubis-generic
module : anubis
type : cipher
在这种情况下,anubis 密码与内核 XTS 块链接模式代码相结合,生成最终密码xts(anbuis)
,该密码已分配模块kernel
。但为了使其可用,我们需要来自anubis
模块的通用 anubis 密码。大多数密码都有一个模块别名“crypto-
密碼“可用于加载它们,例如modprobe crypto-anubis
加载提供阿努比斯密码的模块。
使用cryptsetup benchmark
命令时,只有密碼和模式很重要,因为这就是基准测试的全部内容。如果模式未指定则默认为 CBC。iv模式完全被忽略。因此,对于基准测试,aes
、aes-cbc
和aes-cbc-foobar
都是等价的。
答案3
您可以使用以下命令列出内核支持的密码,
[root@arif]# ls /lib/modules/[your kernel version]/kernel/crypto/
algif_rng.ko.xz blowfish_common.ko.xz cmac.ko.xz cts.ko.xz gf128mul.ko.xz michael_mic.ko.xz rsa_generic.ko.xz tgr192.ko.xz xts.ko.xz
ansi_cprng.ko.xz blowfish_generic.ko.xz crc32_generic.ko.xz deflate.ko.xz ghash-generic.ko.xz pcbc.ko.xz salsa20_generic.ko.xz twofish_common.ko.xz zlib.ko.xz
anubis.ko.xz camellia_generic.ko.xz crct10dif_common.ko.xz des_generic.ko.xz jitterentropy_rng.ko.xz pcrypt.ko.xz seed.ko.xz twofish_generic.ko.xz
arc4.ko.xz cast5_generic.ko.xz crct10dif_generic.ko.xz dh_generic.ko.xz khazad.ko.xz rmd128.ko.xz serpent_generic.ko.xz vmac.ko.xz
async_tx cast6_generic.ko.xz cryptd.ko.xz drbg.ko.xz lrw.ko.xz rmd160.ko.xz sha512_generic.ko.xz wp512.ko.xz
authencesn.ko.xz cast_common.ko.xz crypto_null.ko.xz fcrypt.ko.xz mcryptd.ko.xz rmd256.ko.xz tcrypt.ko.xz xcbc.ko.xz
authenc.ko.xz ccm.ko.xz crypto_user.ko.xz gcm.ko.xz md4.ko.xz rmd320.ko.xz tea.ko.xz xor.ko.xz
luks
您可以使用以下命令列出可以使用的密码和哈希以及它们的 I/O 比较,
[root@arif arif]# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1 289342 iterations per second for 256-bit key
PBKDF2-sha256 353293 iterations per second for 256-bit key
PBKDF2-sha512 227555 iterations per second for 256-bit key
PBKDF2-ripemd160 233224 iterations per second for 256-bit key
PBKDF2-whirlpool 236165 iterations per second for 256-bit key
argon2i 4 iterations, 917485 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id 4 iterations, 951672 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
# Algorithm | Key | Encryption | Decryption
aes-cbc 128b 642.2 MiB/s 2495.8 MiB/s
serpent-cbc 128b 89.3 MiB/s 542.6 MiB/s
twofish-cbc 128b 100.4 MiB/s 343.1 MiB/s
aes-cbc 256b 477.2 MiB/s 1979.2 MiB/s
serpent-cbc 256b 89.3 MiB/s 538.9 MiB/s
twofish-cbc 256b 173.3 MiB/s 343.1 MiB/s
aes-xts 256b 1668.0 MiB/s 1664.1 MiB/s
serpent-xts 256b 535.7 MiB/s 523.4 MiB/s
twofish-xts 256b 332.6 MiB/s 339.8 MiB/s
aes-xts 512b 1384.5 MiB/s 1380.7 MiB/s
serpent-xts 512b 539.3 MiB/s 524.4 MiB/s
twofish-xts 512b 335.0 MiB/s 340.1 MiB/s
您可以通过以下命令比较特定的密码,
[root@arif]# ciphers="aes-xts serpent-xts anubis-xts"
[root@arif]# echo "# Algorithm | Key | Encryption | Decryption";for i in $ciphers ; do cryptsetup benchmark --cipher $i|tail -n 1; done
# Algorithm | Key | Encryption | Decryption
aes-xts 256b 1613.9 MiB/s 1642.8 MiB/s
serpent-xts 256b 538.9 MiB/s 521.9 MiB/s
anubis-xts 256b 182.0 MiB/s 182.1 MiB/s