CSP開發流程

當前,國內許多科研單位開發了高強度加密算法,這些加密算法或者以純軟件形式,或者以加密卡形式提
供給用戶。不同加密服務提供者提供的加密接口往往各不相同,這就給用戶帶來不便。因此,出現了有關加
密API國際標準和規範,呈現給用戶加密API有幾種統一形式。目前有關加密API國際標準和規範主要有
:GSS-APIV2.0、GCS-API、CDSA、RSAPKCS#11CryptographicTokenInterfaceStandardV2.01、RSAB
SAFEAPI、微軟CryptoAPIV2.0。其中,CDSA、RSAPKCS#11和微軟CryptoAPI在實際中應用得較多,也
是PKI推薦使用的加密API。以下主要討論微軟CryptoAPI是如何調用加密服務提供(CSP)以及如何開發
基於微軟CryptoAPI加密服務提供。

1 加密體系結構

     MicrosoftCryptoAPI是“Microsoftcryptographicapplicationprogramminginterface”的簡稱,是Microsoft公
司提出的安全加密應用框架和服務。Windows系列操作系統,都支持MicrosoftCryptoAPI。與其他安全加密
應用框架一樣,MicrosoftCryptoAPI也遵循一系列PKI標準和規範。應用開發者可以比較簡便、快速地開發
出標準、通用和易於擴展的安全加密應用。C
ryptoAPI功能是爲應用程序開發者提供在Win32環境下使用加密、驗證等安全服務時標準加密接口。微
軟CryptoAPI體系結構見圖1。CryptoAPI之上是應用程序,之下是CSP。CSP是一個真正執行加密功能獨
立模塊,典型的CSP有微軟RSABaseProvider。目前任何一個加密服務提供者若想成爲微軟合法CSP,就必
須獲得微軟授予的一個簽名文件,該簽名文件保證了微軟CryptoAPI識別該CSP。對於Microsoft合法CSP,

微軟會提供與其CryptoAPI接口規範。微軟提供CSP安裝程序會將該CSP各個文件安放到相應目錄下
,並在註冊表中按CSP的類型和名稱爲該CSP註冊。CryptoAPI使用系統註冊表存儲CSP數據庫,CSP數
據庫中記錄了所有已安裝到計算機中的CSP。

2 CryptoAPI調用底層CSP服務方式

    微軟CryptoAPI從2方面保證安全通信:保密性和驗證。CSP是真正執行加密工作獨立的模塊。物理上一
個CSP由2部分組成:一個動態鏈接庫,一個簽名文件。若加密算法用硬件實現,則CSP還包括硬件裝置。

CryptoAPI函數調用底層CSP函數時,首先使用函數CryptAcquireContext,給出欲選擇CSP名稱參數和
類型參數即可,該函數返回一個指向被選擇的CSP句柄。CSP有一個密鑰庫。密鑰庫用於存儲密鑰,每個密
鑰庫包括一個或多個密鑰容器(keycontainers)。每個密鑰容器中含屬於一個特定用戶所有密鑰對。每個

密鑰容器被賦予唯一名字;以這個名字做函數CryptAcquireContext參數,從而獲得指向這個密鑰容器句柄
。CSP將永久保存密鑰容器,包括保存每個密鑰容器中公/私鑰對(會話密鑰除外)。在交換密鑰時,或密鑰需要離開

CSP(即導出密鑰)時,就存在選擇什麼樣數據結構存儲密鑰問題。微軟CryptoAPI採用KeyBlob數據結構存儲離開了

CSP內部的密鑰。密鑰總是在CSP內部被安全地保存,應用程序只能通過句柄訪問密鑰,而KeyBlob則例外。當使用

CryptExportKey函數從CSP中導出密鑰時,KeyBlob被創建。之後某一時間,使用CryptImportKey函數將密鑰導入到其
他CSP中(不同機器上的不同CSP)。因此,KeyBlob是在不同CSP之間安全傳送密鑰載體。KeyBlob有一個標準信息
頭和位於信息頭之後一段表示密鑰本身的數據組成。應用程序不訪問KeyBlob內部,而是把KeyBlob當作一個透明對
象。

    由於公/私鑰對私鑰部分需要絕對保密,所以私鑰要用對稱加密算法加密。加密PrivateKeyBlob時,除了
BLOBHEADER之外所有部分都要加密。但加密所用算法和密鑰(或密鑰參數)不與該KeyBlob存儲在一起
,應用程序負責管理這些信息。

 

3 CSP程序開發

     進行CSP程序開發,首先選擇和實現CSP支持加密算法和數據格式;確定好加密算法和數據格式後,應該
清楚CSP實現的函數及函數流程,在瞭解這些之後,具體程序設計較爲容易。

1)開發CSP基本流程。

      選擇和實現CSP要支持每一個加密算法和數據格式後,創建一個CSP過程如下:

    1創建CSP.dll,導出CrytoSPI函數接口。

    2開發CSP安裝程序,創建合適註冊表項。

    3測試所開發出CSP.dll的實現功能。

    4通過CryptAPI測試開發出的CSP。

    5讓微軟正式對該CSP簽名,使CSP可以應用到MicrosoftWindows系列操作系統中。

    6測試經過微軟正式簽名CSP。這個步驟和4相同,不過此時的CSP已經通過了微軟正式簽名。

下面主要對CSP開發第一步進行詳細的說明,只有做好1,對2~6也較爲容易,不進行詳述。

 

2)CSP應實現的函數及其功能。

     在所創建的CSP.dll中,CSP應實現以下24個函數。

初始化函數:CSP初始化函數有CPAcquireContext、CPReleaseContext,其中CPAcquireContext有2個作
用,其一是根據提供參數獲取不同CSP,其二是根據參數產生或銷燬密鑰容器。CPReleaseContext用於釋放
加密接口函數句柄。以上2函數調用成功則返回非0值。

散列函數:CSP散列函數有CPCreateHash、CPHashData、CPGetHashParam、CPDestroyHash、

CPHash-SessionKey、CPGenRandom共6個函數,前面4個函數通常一起使用,並根據給定數據產生散列值。

CPCre-ateHash用於產生CSP散列對象句柄,該句柄用於後續CPHashData函數產生散列值,緊接着使用

CPGetH-ashParam獲取所產生散列值。最後由CPDestroyHash銷燬散列對象句柄。具體散列算法根據

CPCreateHash參數確定。可以設定CPGetHashParam中參數防止同一數據進行多次加密。CPHashSessionKey

用於對密鑰對象產生散列值,CPGenRandom用於由隨機數填充緩衝區,這個函數主要用於利用隨機數進行加密。

密鑰生成函數:產生密鑰函數有CPDeriveKey、CPGenKey、CPDestroyKey等函數,其中CPDeriveKey用於
根據口令產生密碼,CPGenKey用於根據隨機數產生密碼,使用CRYPT-EXPORTABLE參數時,產生一個
可以輸出密鑰,以便不同計算機或會話之間採用,CPDestroyKey用於釋放密鑰句柄。

加/解密類函數:加密和解密函數有CPEncrypt、CPDecrypt、CPSignHash、CPVerifySignature等函數,

CPEncrypt用於進行加密操作,CPDecrypt用於進行解密操作,這2個函數特別有用,他們包含以下參數,密鑰句柄、

散列對象句柄、用於判斷是否爲最後一塊布爾值、加密/解密數據塊指針、加密/解密緩衝區數量等參數。

注意有些加密算法使得加密數據長度與解密數據長度相同,但有些算法會增加加密數據塊長度。CPSign-Hash

對數據進行簽名,其實質是對數據進行散列和對散列結果進行加密(簽名私鑰)合成。CPVerifySig-nature對簽名

進行驗證,其實質是對原始數據進行散列得到結果一,對簽名數據進行解密(簽名公鑰)得到結果二,比較二者是否一致。

如果是,則驗籤成功,否則失敗。

密鑰操作函數:密鑰輸入/輸出函數有CPExportKey、CPImportKey,其中CPExportKey用於導出密鑰,使其產生一個副本,CPImportKey用於導入副本密鑰。獲取和設置密鑰參數函數有CPGetKeyParam、CPGetUserKey、CPSetKeyParam等,CPGetKeyParam用於獲取當前密鑰操作的數據,CPGetUserKey用於獲取用戶密鑰參數句柄,CPSetKeyParam用於對密鑰進行各種定製操作。

其他函數:其他對CSP對象和哈西對象進行操作的函數有CPGetProvParam、CPSetHashParam、

CPSet-Provider、CPSetProvParam等,其中CPGetProvParam用於獲取當前操作CSP參數,CPSetHashParam用於對散
列對象定製操作,CPSetProvider用於指定當前用戶默認CSP,CPSetProvParam用於定製各種CSP操作。

3)CSP開發其他注意事項。

在開發CSP過程中,對其函數流程應非常清楚。CSP提供運算功能可分爲:散列運算、加密/解密運算、簽名/驗籤運算、

密鑰輸出/輸入操作、對象屬性設置和讀取等幾類。CSP內部運行時,一般通過CPAcquireContext得到密鑰容器句柄,

並在以後函數調用中通過密鑰容器句柄來使用CSP提供各種密碼運算。因此在開發CSP過程中,對CSP各種初始化工作應在CPAcquireContext中完成。在開發CSP過程中,最重要的就是一定要考慮好其數據結構,只有合理的數據結構,才能保證其有序運行。其數據結構主要包含存儲數據結構和內存數據結構,下面是開發中所採用的數據結構,以供參考。

1存儲數據結構 

    CSP中存儲數據結構包括2部分,一部分是CSP註冊信息,即安裝了CSP後它爲OS提
供定位信息;一部分是CSP自身信息,即對CSP中用到密鑰容器內容保存。CSP安裝好以後,在註冊表中爲
OS提供定位信息和使用密鑰容器信息位置。在該密鑰容器中,應區分不同加密方式,對不同加密方式,應給
出不同加密動態連接庫函數。在密鑰容器中可以有各種用戶密鑰信息,如可以包含簽名公鑰值,簽名私鑰值
,簽名密鑰對是否可以輸出,加密公鑰值,加密私鑰值,加密密鑰對是否可以輸出等各種信息。

2內存數據結構 

            內存數據結構主要介紹密鑰值內存表示,不管是何種類型密鑰,它在內存中都是一個結構化數據塊。

可將其統一處理爲一個一維數組。底層密碼算法的動態連接庫函數應能處理此一維數組。很明顯,

Container在註冊表中必須保存密鑰值數組值。

4 結 語

           按照以上方法,可以開發自己的CSP,並將該CSP嵌入微軟操作系統中,利用微軟CryptoAPI函數調用該
CSP,從而方便實現加密、解密、簽名、驗籤等操作,真正實現CSP密碼模塊本地化。爲在網絡上進行安全數
據傳輸打下了基礎。

 

本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jiadelin/archive/2008/10/31/3191421.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章