在我撰写本文时,当前的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
与密码一起使用的两个密钥的可选幂。除lmkivmode以外,所有其他选项的默认值均为1,而ivmode的默认值为64。这实际上仅适用于LMK,而1以外的值将无法在其他模式下正常工作。
模式与密码一起使用的块链接模式。例子有ecb,cbc,xts。ecbmd-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似乎是最常用的建议。
nullIV始终为零。为了测试和向后兼容,您不应使用此功能。
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/可能看起来很不错,但是模块可以位于文件系统上的任何位置。