在我撰写本文时,当前的5.1内核具有用于密码字符串的两种不同格式,即“旧”格式和“新”格式。到目前为止,此问题中的所有内容(显然也包括所有文档)都处理“旧”格式,因此我将在此处进行描述。这仅用于加密。如果将完整性与dm-crypt一起使用,则必须考虑AEAD密码,并且变得更加复杂。
内核解析的格式为“ cipher [ :
keycount ] -
模式-
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,而ivmode的默认值为64。这实际上仅适用于LMK,而1以外的值将无法在其他模式下正常工作。
模式与密码一起使用的块链接模式。例子有ecb
,cbc
,xts
。ecb
md-crypt驱动程序不知道不使用IV,而是将其传递给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之类的模式的含义,这些模式在使用诸如的简单IV时不能抵抗各种攻击plain64
。
ivopts与essiv
ivmode一起使用的哈希,对于所有其他模式均被忽略。
作为一种特殊情况,“ 密码-plain
”或仅“ 密码 ”被解释为“ 密码-cbc-plain
”。另一个特殊情况是ecb
模式没有ivmode可以指定。
这有什么关系 /proc/crypto
关于/proc/crypto
,仅密码和模式相关。dm-crypt可以构建“ mode (
cipher)
” 形式的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
该type
的skcipher
表示这是一个对称密钥加密,什么DM-隐窝用途和名称xts(aes)
将被写入aes-xts
时,与DM-隐窝规定。这些keysize
字段还告诉我们该密码可以使用哪些密钥大小。
如果来自模块,则模块名称可能会显示在该module
行中。但是,许多密码(通常是软件中没有任何硬件特定代码的密码)都是作为通用密码实施的,该密码与通用块链接代码组合在一起以生成最终密码。例如:
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-
cipher ”,可用于加载它们,例如modprobe crypto-anubis
将加载提供anubis密码的模块。
使用该cryptsetup benchmark
命令时,只有密码和模式才重要,因为这是基准测试的全部内容。如果未指定mode,则默认为CBC。该ivmode被完全忽略。因此,标杆,aes
,aes-cbc
,和aes-cbc-foobar
都是等效的。
/lib/modules/*/kernel/crypto/
可能看起来很不错,但是模块可以位于文件系统上的任何位置。