CSP的開發流程

來源:互聯網
上載者:User

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

1 加密體繫結構

     MicrosoftCryptoAPI是“Microsoftcryptographicapplicationprogramminginterface”的簡稱,是Microsoft公
司提出的安全加密應用程式框架和服務。Windows系列作業系統,都支援MicrosoftCryptoAPI。與其他安全加密
應用程式框架一樣,MicrosoftCryptoAPI也遵循一系列PKI標準和規範。應用開發人員可以比較簡便、快速地開發
出標準、通用和易於擴充的安全加密應用。C
ryptoAPI功能是為應用程式開發人員提供在Win32環境下使用加密、驗證等安全服務時標準加密介面。微
軟CryptoAPI體繫結構見圖1。CryptoAPI之上是應用程式,之下是CSP。CSP是一個真正執行加密功能獨
立模組,典型的CSP有微軟RSABaseProvider。目前任何一個Data Encryption Service提供者若想成為微軟合法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密碼模組本地化。為在網路上進行安全數
據傳輸打下了基礎。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.