1. Linux内核支持哪些加密算法 ? 内核支持的加密算法很多,包括: 对称加密算法,如AES,3DES; 对称密码体制的发展趋势将以分组密码为重点。分组密码算法通常由密钥扩展算法和加密(解密)算法两部分组成。密钥扩展算法将b字节用户主密钥扩展成r个子密钥。加密算法由一个密码学上的弱函数f与r个子密钥迭代r次组成。混乱和密钥扩散是分组密码算法设计的基本原则。抵御已知明文的差分和线性攻击,可变长密钥和分组是该体制的设计要点。 AES是美国国家标准技术研究所NIST旨在取代DES的21世纪的加密标准。 AES的基本要求是,采用对称分组密码体制,密钥长度的最少支持为128、192、256,分组长度128位,算法应易于各种硬件和软件实现。1998年NIST开始AES第一轮分析、测试和征集,共产生了15个候选算法。1999年3月完成了第二轮AES2的分析、测试。2000年10月2日美国政府正式宣布选中比利时密码学家Joan Daemen 和 Vincent Rijmen 提出的一种密码算法RIJNDAEL 作为 AES. 在应用方面,尽管DES在安全上是脆弱的,但由于快速DES芯片的大量生产,使得DES仍能暂时继续使用,为提高安全强度,通常使用独立密钥的三级DES。但是DES迟早要被AES代替。流密码体制较之分组密码在理论上成熟且安全,但未被列入下一代加密标准。
摘要算法,如sha1,md5; 数据摘要算法是密码学算法中非常重要的一个分支,它通过对所有数据提取指纹信息以实现数据签名、数据完整性校验等功能,由于其不可逆性,有时候会被用做敏感信息的加密。数据摘要算法也被称为哈希(Hash)算法或散列算法。 SHA(Secure Hash Algorithm)是由美国专门制定密码算法的标准机构—— 美国国家标准技术研究院(NIST)制定的,SHA系列算法的摘要长度分别为:SHA为20字节(160位)、SHA256为32字节(256位)、 SHA384为48字节(384位)、SHA512为64字节(512位),由于它产生的数据摘要的长度更长,因此更难以发生碰撞,因此也更为安全,它是未来数据摘要算法的发展方向。由于SHA系列算法的数据摘要长度较长,因此其运算速度与MD5相比,也相对较慢。
目前SHA1的应用较为广泛,主要应用于CA和数字证书中,另外在目前互联网中流行的BT软件中,也是使用SHA1来进行文件校验的。
MD5(Message-Digest Algorithm 5,消息摘要算法版本5),它由MD2、MD3、MD4发展而来,由Ron Rivest(RSA公司)在1992年提出,目前被广泛应用于数据完整性校验、数据(消息)摘要、数据加密等。MD2、MD4、MD5 都产生16字节(128位)的校验值,一般用32位十六进制数表示。MD2的算法较慢但相对安全,MD4速度很快,但安全性下降,MD5比MD4更安全、速度更快。
目前在互联网上进行大文件传输时,都要得用MD5算法产生一个与文件匹配的、存储MD5值的文本文件(后缀名为 .md5或.md5sum),这样接收者在接收到文件后,就可以利用与 SFV 类似的方法来检查文件完整性,目前绝大多数大型软件公司或开源组织都是以这种方式来校验数据完整性,而且部分操作系统也使用此算法来对用户密码进行加密,另外,它也是目前计算机犯罪中数据取证的最常用算法。
压缩算法,如deflate。
DEFLATE是同时使用了LZ77算法与哈夫曼编码(Huffman Coding)的一个无损数据压缩算法。它最初是由Phil Katz为他的PKZIP归档工具第二版所定义的,后来定义在RFC 1951规范中。 人们普遍认为DEFLATE不受任何专利所制约,并且在LZW(GIF文件格式使用)相关的专利失效之前,这种格式除了在ZIP文件格式中得到应用之外也在gzip压缩文件以及PNG图像文件中得到了应用。 DEFLATE压缩与解压的源代码可以在自由、通用的压缩库zlib上找到。
不过内核好像不支持非对称加密算法。
2. 加密算法源文件位置 这些算法作为加密函数框架的最底层,提供加密和解密的实际操作。这些函数可以在内核crypto文件夹下,相应的文件中找到。
3. 配置编译选项将加密算法作为模块编入内核
Cryptographic options Cryptographic API Cryptographic algorithm manager
参考: CryptoAPI support 提供核心的加密API支持.这里的加密算法被广泛的应用于驱动程序通信协议等机制上,子选项可以全不选,内核中若有其他部分依赖它,会自动选 (M)Cipher Algorithms 创建加密模版实例,必须要选 -- 128 bit blocksize (M) AES (aka Rijndael) cipher (M) Identity Function cipher (M) Crypto Devices (M) Loop Crypto support 4. 加密API 的调用方法: 不过内核模块不能直接调用这些函数,因为它们并没有export。内核提供一个统一的框架,来管理这些算法。 加密算法通过crypto_register_alg()和crypto_unregister_alg()注册。 内核将加密算法分为三类,1)cipher,2)compress,3)digest。 加密函数框架中有相应的API封装,提供给模块调用。 对于使用这些加密函数,首先通过crypto_alloc_tfm()来分配一个加密函数对象的实例。初始化这些实例,然后就可以通过框架提供的API对数据进行加密和解密。完成以后,必须通过crypto_free_tfm()撤销实例。5. 代码示例:
2)compress算法(deflate)
3)cipher算法(aes) #include<linux/module.h> #include <linux/kernel.h> #include <linux/crypto.h> #include <linux/scatterlist.h> #include <linux/gfp.h> #include <linux/err.h> #include <linux/syscalls.h> #include <linux/slab.h> #include <linux/highmem.h> struct crypto_tfm *tfm; #if 1 char *code = "Hello everyone,I'm robert" "Hello everyone,I'm robert" "Hello everyone,I'm robert"; char *key = "00112233445566778899aabbccddeeff"; #endif #if 0 char code[]={0x00,0x11,0x22,0x33,0x44,0x55,0x66,0x77,0x88,0x99,0xaa, 0xbb,0xcc,0xdd,0xee,0xff}; char key[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a, 0x0b,0x0c,0x0d,0x0e,0x0f}; #endif static inline void hexdump(unsignedchar*buf,unsignedint len){ while(len--) printk("%02x",*buf++); printk("\n"); } static int __init test_init(void){ int ret,templen,keylen,codelen; struct scatterlist sg[1]; char *result; char *temp; keylen = 16; codelen = strlen(code)/2; #if 0 printk("<1>%s, codelen=%d\n",code,strlen(code)); printk("<1>%s, keylen=%d\n",key,strlen(key)); #endif /* Allocate transform for AES ECB mode */ tfm = crypto_alloc_tfm("aes",CRYPTO_TFM_MODE_ECB); if(IS_ERR(tfm)){ printk("<1>failed to load transform for aes ECB mode !\n"); return 0; } ret = crypto_cipher_setkey(tfm,key,keylen); if(ret){ printk("<1>failed to setkey \n"); goto failed1; } sg_init_one(sg,code,codelen); /* start encrypt */ ret = crypto_cipher_encrypt(tfm,sg,sg,codelen); if(ret){ printk("<1>encrypt failed \n"); goto failed1; } temp = kmap(sg[0].page)+ sg[0].offset; hexdump(temp,sg[0].length); /* start dencrypt */ templen = strlen(temp)/2; sg_init_one(sg,temp,templen); ret = crypto_cipher_decrypt(tfm,sg,sg,templen); if(ret){ printk("<1>dencrypt failed \n"); goto failed1; } result = kmap(sg[0].page)+ sg[0].offset; printk("<1>%s\n",result); // hexdump(result,sg[0].length); #if 0 if(memcmp(code,result,strlen(code))!= 0) printk("<1>dencrpt was not successful\n"); else printk("<1>dencrypt was successful\n"); #endif failed1: crypto_free_tfm(tfm); return 0; } static void __exit test_exit(void) { } module_init(test_init); module_exit(test_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("robert@cm"); 部分采用网络代码。 |
|
来自: 昵称14797374 > 《android》