一、概述
Linux內核從2.5版本開始引入了強力的加密機制,主要原因有:刪除冗余代碼、支持IPSec協議以及通用的加密功能等。將來的應用會包括:硬件加密設備驅動、內核代碼簽名、硬件隨機數生成器、文件系統加密等。
二、如何使用加密API
1、安裝
從2.6.6版本之後,內核源碼就提供了豐富的密碼學算法支持,需要配置編譯選項將加密算法作為模塊編入內核。如圖所示,menuconfig的時候配置這部分選項
重新安裝內核之後可以看到相應的目錄下這些模塊
2、使用API編程
這裡介紹的是使用加密API的方法,而且是運行在內核態的程序:
例1
- char *Kern_Digest(const void *data, size_t count,
- unsigned char *md, unsigned int *size, const char *name)
- {
- struct crypto_tfm *tfm;
- struct scatterlist sg[1];
- tfm = crypto_alloc_tfm(name, 0);
- sg_init_one(sg, data, count); //這裡復制需要做哈希的數據
- crypto_digest_init(tfm);
- crypto_digest_update(tfm, sg, 1);
- crypto_digest_final(tfm, md);
- if (size != NULL)
- *size = tfm->cra_digest.dia_digestsize;
- crypto_free_tfm(tfm);
- }
例2
- #include <linux/crypto.h>
-
- int len;
- char key[8];
- char result[64];
- struct crypto_tfm *tfm;
- struct scatterlist sg[2];
-
- tfm = crypto_alloc_tfm("des", 0);
- if(tfm == NULL)
- fail();
-
- crypto_cipher_setkey(tfm, key, 8);
-
- //把需要加密的數據復制到scatterlist
-
- crypto_cipher_encrypt(tfm, sg[0], sg[0], len); //這裡可以模擬輸入輸出
-
- crypto_free_tfm(tfm);
以上兩個例子僅示范了如何使用API,可以看到最重要的2個數據結構是: crypto_tfm 和 scatterlist
crypto_tfm類型指針tfm可以理解為指代了一個算法對象
scatterlist類型數據可以認為是這些密碼算法操縱的數據對象。
同時也可以看到,API的命名很容易閱讀(這也是Linux內核命名的一個特色)
這部分加密庫提供的接口都在linux/crypto.h頭文件中有定義,進行實驗的時候需要與內核相關,這裡可能要一些模塊編程的補充。