首页 理论教育 Linux内核安全模块深入剖析:五个参数简介

Linux内核安全模块深入剖析:五个参数简介

时间:2023-11-22 理论教育 版权反馈
【摘要】:算法这个子参数规定一个加密算法,比如aes。图18-2 ECB加密模式ECB解密模式如图18-3所示。2)plain初始化向量的头部32bit来自一个扇区号,初始化向量的其余bit为0。这个keycount必须是2的整数次幂。

Linux内核安全模块深入剖析:五个参数简介

在dm-crypt设备的构造函数crypt_ctr中,需要5个参数:cipher、key、iv_offset、dev_path、start。

1.cipher

cipher字面意思是密码。这里实际上是用于规定加密算法相关的三个参数:算法、模式和初始化向量。格式为:

978-7-111-54905-5-Part05-52.jpg

三个子参数之间用“-”分隔,子参数中若还有子项,则用“:”分隔。

(1)算法(alg)

这个子参数规定一个加密算法,比如aes。

(2)模式(mode)

在块加密(Block Cipher)运算中,一段固定大小的比特称为块,如何重复使用针对块的加密算法来对所有数据进行加密运算,就是模式 [1] 。加密模式有很多种,下面简要叙述两种简单的模式:ECB(Electronic Codebook)和CBC(Cipher Block Chaining)

ECB(Electronic Codebook)是最简单的一种加密模式。它就是将数据分割为块,然后对块进行分别加密,如图18-2所示。

978-7-111-54905-5-Part05-53.jpg

图18-2 ECB加密模式

ECB解密模式如图18-3所示。

978-7-111-54905-5-Part05-54.jpg

图18-3 ECB解密模式

ECB是最简单的一种模式,它的缺点是不能很好地隐藏数据模式。在有些场景下,它根本提供不了任何私密性,比如加密bitmap格式的图像。如图18-4、18-5所示。

978-7-111-54905-5-Part05-55.jpg

图18-4 ECB加密处理前

978-7-111-54905-5-Part05-56.jpg

图18-5 ECB加密处理后

CBC(Cipher Block Chaining)是由IBM公司于1976年发明的一种加密模式。在CBC模式中,每一块在加密前要先和前一块加密后的密文做一个XOR运算。这样,每一块的加密后的密文就不仅和这一块的明文数据相关,还和此块之前的所有明文数据相关。对于第一块数据的加密,第一块数据首先和一个叫做初始化向量的块先做XOR运算。需要注意的是加密和解密的次序是相反的,加密从第一块开始处理,解密从最后一块开始处理。CBC加密、解密模式分别如图18-6、18-7所示。

978-7-111-54905-5-Part05-57.jpg

图18-6 CBC加密模式

978-7-111-54905-5-Part05-58.jpg

图18-7 CBC解密模式

Linux内核提供一个proc文件/proc/crypto,列出所有当前内核支持的加密算法信息。例如:

978-7-111-54905-5-Part05-59.jpg

每一条记录的名字是模式和算法名的拼接,例如上面列出的“cbc(aes)”,就表示使用CBC模式的aes算法。

(3)初始化向量(iv)

从前面的模式介绍可知,CBC一定需要一个初始化向量,EBC并不一定需要。虽然如此,dm-crypt总是会构建一个初始化向量,用以加强加密的效果。这个子参数有7种取值:

1)null

初始化向量总是全0。(www.xing528.com)

2)plain

初始化向量的头部32bit来自一个扇区号,初始化向量的其余bit为0。

3)plain64

初始化向量的头部64bit来自一个扇区号,初始化向量的其余bit为0,初始化向量的长度和算法有关。这里用到的扇区号和实际要加解密的扇区的扇区号有关,但不一定相等。取值为实际的扇区号加上后面要提到的iv_offset。

4)benbi

这种模式和plain64类似,有两点不同。首先,它前面填充0,最后放一个和扇区号相关的数;其次,这个数的产生涉及二进制移位操作。

5)essiv

前面的几种生成初始化向量的方式有一个共同的问题,初始化向量是可预测的,基于这点就可以展开“Watermarking attack” [2] 。为了进一步提高安全性,就要让初始化向量不可预测。essiv就是一种不可预测地生成初始化向量的方式。

essiv的全称是Encrypted Salt Sector Initialization Vector。从代码实现上看,它是在plain64的基础上对初始化向量再进行加密,加密的算法就是前面的算法子参数所规定的算法,加密的密钥是后面提供的key参数的哈希值。有哈希值就需要有哈希算法,哈希算法通过初始化向量的可选参数提供(对于essiv,可选参数必须有,而且必须是一个哈希算法的名字)。

回忆一下,cipher参数的格式是:

978-7-111-54905-5-Part05-60.jpg

举个essiv的例子:

978-7-111-54905-5-Part05-61.jpg

初始化向量的生成过程是这样的:首先采用plain64模式生成一个初始化向量,然后对这个初始化向量进行加密,加密算法为aes,加密密钥是对key参数进行sha256算法的哈希计算的结果。

6)lmk

前面的初始化向量的生成方法,除了null,都是基于扇区号的。lmk又进了一步,它既基于扇区号,又基于存储内容。算法有些复杂,读者如果感兴趣可以查看内核crypt_iv_lmk_one函数的实现。

7)tcw

tcw和lmk类似,过程比lmk多了一个子步骤——whitening。

2.key

这个参数是一个HEX编码的字符串,18.1节中的例子给出的是:

978-7-111-54905-5-Part05-62.jpg

注意这个字符串不一定只包含一个密钥,它可能包含多个密钥。首先lmk格式的iv需要一个额外密钥,tcw格式的iv需要两个额外密钥。其次用于数据加密的密钥在dm-crypt中也不一定只有一个。在多个数据加密密钥的情况下,加密时用到哪一个呢?这就和下面要介绍的参数iv_offset有关。

3.iv_offset

回忆一下,cipher参数的格式是:

978-7-111-54905-5-Part05-63.jpg

其中的keycount规定了用于数据加密的密钥的个数(不包含lmk和tcw需要的额外密钥)。这个keycount必须是2的整数次幂。

iv_offset有两个作用,一个是生成初始化向量时需要扇区号,这个iv_offset作为偏移参与扇区号的运算;另一个是参与决定使用哪一个密钥。假设keycount=8,当前要处理dm-crypt设备的扇区号是10,iv_offset是3,那么生成初始化向量所需的扇区号是10+3=13,所用的密钥是第5个密钥(从0开始计数),计算过程是:(10+3)%8=5。

4.dev_path

这个参数规定了一个“底层”实际存储数据的块设备,可以用设备号的格式输入,比如“8:16”,也可以用设备文件的形式输入,比如“/dev/sda”。

5.start

这个参数规定dm-crypt设备在“底层”设备上的起始扇区号。比如输入0,就表示自“底层”设备0号扇区开始就是dm-crypt设备的数据。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈