原标题:Linux加解密支持模块代码总体描述
1.3.1.4.算法的具体实现
Linux内核加密算法的实现是通过内核模块动态加载实现的。使用内核模块实现算法可以丰富内核的加密算法,在加密时既可以使用内核里面已经实现的算法,同时也可以动态加载自己实现的算法。算法的具体实现主要通过定义在算法操作集xxx_tfm和xxx_alg中的定义的钩子函数完成。其中xxx为具体的算法名称。这一类算法操作集里面主要定义的钩子函数有算法密钥的设置、加密、解密。操作集函数里面包含了密钥的设置、加解密操作。
1.3.2. 内核算法
Linux内核中具体算法的实现在crypto中,从独立的crypto文件就可以看出加密在linux内核里面的重要性,具体分析算法MD5,研究内核是如何实现加密的。具体代码参见linux-3.5.4/crypto/md5.c。
从md5.c可以看出,在内核中加密算法的实现是通过内核模块的形式实现的。为什么不直接在内核实现?如果在内核直接实现有其以下几个缺点:
1. 增加了内核的“体积”;
2. 如果在现有的内核中再新增或删除算法时,将不得不重新编译内核。
Linux内核模块主要由以下几部分组成[2]:
1. 模块加载函数(必须)。当通过insmod命令加载模块时,模块的加载函数会自动被内核执行,完成相关初始化工作。
2. 模块的卸载函数(必须)。当通过rmmod命令卸载模块时,模块的卸载函数会自动被内核执行,完成模块的卸载工作。
3. 模块许可证声明(必须)。模块许可证LICENSE声明了内核模块的许可权限,如果不声明LICENSE则在内核加载时会收到内核污染的警告。
4. 模块参数(可选)。模块参数是指模块在加载时可以传入参数。
5. 模块的导出(可选)。和内核中函数导出类似,在有EXPORT_SYMBOL()导出函数或变量后就可以被其他模块使用。
6. 模块的其他信息(可选)。比如模块的作者MODULE_AUTHOR(“XXX”),模块的功能描述以及模块的版本等。
了解算法以何种形式在内核出现,实现算法需要注意哪些操作。首先要了解这个算法的实现原理,比如MD5是一种Hash算法,它是以512位的分组长度来处理消息,然后每一个分组又被划分为16个32位的子分组,最终产生128位的消息摘要。接下来MD5主要实现了算法操作集中定义的钩子函数。
在算法里面实现了上述钩子函数之后通过向算法注册结构crypto_alg中成员变量填充赋值来实现算法。具体填充方式如下。
static struct= {
.=,
.=,
.=,
.=,
.=,
.=,
.= sizeof(struct),
.= sizeof(struct),
.= {
.= "md5",
.=,
.=,
.=,
}
后操作就是模块的加载卸载操作,加载模块时注册算法,使用crypto_register_xxx进行算法注册,其中xxx为具体算法名称或该算法属于哪一类算法。卸载模块时使用crypto_unregister_xxx注销算法。这样一个完整的算法就实现了。
另外内核中实现加密算法模块还有另一种形式。以ablkcipher异步分组算法进行具体分析。具体源码参见linux-3.5.4/crypto/ablkcipher.c。
Ablkcipher算法以内核模块的形式给出,但它不像上面提到的简单的对算法操作集xxx_alg或crypto_alg进行填充,而是对结构体crypto_type中成员进行赋值,接下来其他操作和MD5基本一致。结构体crypto_type包含的主要成员见表1-1。
表1-1 结构体crypto_type中成员定义
成员函数
函数功能
(*ctxsize)(struct crypto_alg *alg, u32 type, u32 mask)
算法上下文大小
(*init)(struct crypto_tfm *tfm, u32 type, u32 mask)
算法操作的初始化 ,包括密钥设置、加密、解密操作
(*show)(struct seq_file *m, struct crypto_alg *alg)
输出内核算法里面的基本信息
(*report)(struct sk_buff *skb, struct crypto_alg *alg)
变量的初始化操作
通过md5和ablkcipher可以总结出内核对算法实现的主要步骤:
1. 了解算法的实现原理。
2. 以内核模块实现。
3. 针对具体算法或算法属于的类型实现算法的操作集里面定义的钩子函数。
4. 对算法注册结构crypto_alg或crypto_type中成员结构进行赋值。
5. 在加载卸载算法时进行注册、注销操作。
1.3.3.算法测试
掌握了内核如何实现算法,那么怎么能判断一个算法是否是一个好的算法?一个好的算法要做到消息内容安全和加解密速度的平衡。也就是说在保证消息安全的同时也要使消息的加解密速度尽可能快,不能为了安全而单纯提高密钥的位数,这样的结构使得加解密过程比较耗时。当然也不能纯粹为了提高加解密的速度而放弃了消息的安全性。内核给出了算法加解密执行速度测的程序。测试代码位于/linux-3.5.4/crypto/tcrypt.c。
在测试算法时使用slab分配器为算法测试分配空间。算法性能的测试几乎包含了内核提供的所有算法。这里的检测主要是通过对加解密的速度进行检测。以cipher算法为例,它的算法测试函数为test_cipher_speed,该函数的执行首先判断是进行算法加密测试还是解密测试,确定加解密形式之后对算法分配对象tfm,然后对其进行密钥的设置、表的初始化、设置缓冲区以及获取初始化向量的大小,最后通过sec变量选择调用test_cipher_jiffies还是test_cipher_cycles。其中函数test_cipher_jiffies主要是对加密或解密操作处理消息的时间进行计数。而函数test_cipher_cycles则是对算法的执行轮数中对消息的处理进行时间计数,执行过程中主要是通过加密或解密轮数进行速度测试。返回搜狐,查看更多
责任编辑: