CSP的開發(fā)流程.doc_第1頁
CSP的開發(fā)流程.doc_第2頁
CSP的開發(fā)流程.doc_第3頁
CSP的開發(fā)流程.doc_第4頁
CSP的開發(fā)流程.doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

CSP的開發(fā)流程當前,國內許多科研單位開發(fā)了高強度加密算法,這些加密算法或者以純軟件形式,或者以加密卡形式提供給用戶。不同加密服務提供者提供的加密接口往往各不相同,這就給用戶帶來不便。因此,出現(xiàn)了有關加密API國際標準和規(guī)范,呈現(xiàn)給用戶加密API有幾種統(tǒng)一形式。目前有關加密API國際標準和規(guī)范主要有:GSS-APIV2.0、GCS-API、CDSA、RSAPKCS#11CryptographicTokenInterfaceStandardV2.01、RSABSAFEAPI、微軟CryptoAPIV2.0。其中,CDSA、RSAPKCS#11和微軟CryptoAPI在實際中應用得較多,也是PKI推薦使用的加密API。以下主要討論微軟CryptoAPI是如何調用加密服務提供(CSP)以及如何開發(fā)基于微軟CryptoAPI加密服務提供。1 加密體系結構MicrosoftCryptoAPI是“Microsoftcryptographicapplicationprogramminginterface”的簡稱,是Microsoft公司提出的安全加密應用框架和服務。Windows系列操作系統(tǒng),都支持MicrosoftCryptoAPI。與其他安全加密應用框架一樣,MicrosoftCryptoAPI也遵循一系列PKI標準和規(guī)范。應用開發(fā)者可以比較簡便、快速地開發(fā)出標準、通用和易于擴展的安全加密應用。CryptoAPI功能是為應用程序開發(fā)者提供在Win32環(huán)境下使用加密、驗證等安全服務時標準加密接口。微軟CryptoAPI體系結構見圖1。CryptoAPI之上是應用程序,之下是CSP。CSP是一個真正執(zhí)行加密功能獨立模塊,典型的CSP有微軟RSABaseProvider。目前任何一個加密服務提供者若想成為微軟合法CSP,就必須獲得微軟授予的一個簽名文件,該簽名文件保證了微軟CryptoAPI識別該CSP。對于Microsoft合法CSP,微軟會提供與其CryptoAPI接口規(guī)范。微軟提供CSP安裝程序會將該CSP各個文件安放到相應目錄下,并在注冊表中按CSP的類型和名稱為該CSP注冊。CryptoAPI使用系統(tǒng)注冊表存儲CSP數(shù)據(jù)庫,CSP數(shù)據(jù)庫中記錄了所有已安裝到計算機中的CSP。2CryptoAPI調用底層CSP服務方式微軟CryptoAPI從2方面保證安全通信:保密性和驗證。CSP是真正執(zhí)行加密工作獨立的模塊。物理上一個CSP由2部分組成:一個動態(tài)鏈接庫,一個簽名文件。若加密算法用硬件實現(xiàn),則CSP還包括硬件裝置。CryptoAPI函數(shù)調用底層CSP函數(shù)時,首先使用函數(shù)CryptAcquireContext,給出欲選擇CSP名稱參數(shù)和類型參數(shù)即可,該函數(shù)返回一個指向被選擇的CSP句柄。CSP有一個密鑰庫。密鑰庫用于存儲密鑰,每個密鑰庫包括一個或多個密鑰容器(keycontainers)。每個密鑰容器中含屬于一個特定用戶所有密鑰對。每個密鑰容器被賦予唯一名字;以這個名字做函數(shù)CryptAcquireContext參數(shù),從而獲得指向這個密鑰容器句柄。CSP將永久保存密鑰容器,包括保存每個密鑰容器中公/私鑰對(會話密鑰除外)。在交換密鑰時,或密鑰需要離開CSP(即導出密鑰)時,就存在選擇什么樣數(shù)據(jù)結構存儲密鑰問題。微軟CryptoAPI采用KeyBlob數(shù)據(jù)結構存儲離開了CSP內部的密鑰。密鑰總是在CSP內部被安全地保存,應用程序只能通過句柄訪問密鑰,而KeyBlob則例外。當使用CryptExportKey函數(shù)從CSP中導出密鑰時,KeyBlob被創(chuàng)建。之后某一時間,使用CryptImportKey函數(shù)將密鑰導入到其他CSP中(不同機器上的不同CSP)。因此,KeyBlob是在不同CSP之間安全傳送密鑰載體。KeyBlob有一個標準信息頭和位于信息頭之后一段表示密鑰本身的數(shù)據(jù)組成。應用程序不訪問KeyBlob內部,而是把KeyBlob當作一個透明對象。由于公/私鑰對私鑰部分需要絕對保密,所以私鑰要用對稱加密算法加密。加密PrivateKeyBlob時,除了BLOBHEADER之外所有部分都要加密。但加密所用算法和密鑰(或密鑰參數(shù))不與該KeyBlob存儲在一起,應用程序負責管理這些信息。3CSP程序開發(fā)進行CSP程序開發(fā),首先選擇和實現(xiàn)CSP支持加密算法和數(shù)據(jù)格式;確定好加密算法和數(shù)據(jù)格式后,應該清楚CSP實現(xiàn)的函數(shù)及函數(shù)流程,在了解這些之后,具體程序設計較為容易。1)開發(fā)CSP基本流程。選擇和實現(xiàn)CSP要支持每一個加密算法和數(shù)據(jù)格式后,創(chuàng)建一個CSP過程如下:1創(chuàng)建CSP.dll,導出CrytoSPI函數(shù)接口。2開發(fā)CSP安裝程序,創(chuàng)建合適注冊表項。3測試所開發(fā)出CSP.dll的實現(xiàn)功能。4通過CryptAPI測試開發(fā)出的CSP。5讓微軟正式對該CSP簽名,使CSP可以應用到MicrosoftWindows系列操作系統(tǒng)中。6測試經過微軟正式簽名CSP。這個步驟和4相同,不過此時的CSP已經通過了微軟正式簽名。下面主要對CSP開發(fā)第一步進行詳細的說明,只有做好1,對26也較為容易,不進行詳述。2)CSP應實現(xiàn)的函數(shù)及其功能。在所創(chuàng)建的CSP.dll中,CSP應實現(xiàn)以下24個函數(shù)。初始化函數(shù):CSP初始化函數(shù)有CPAcquireContext、CPReleaseContext,其中CPAcquireContext有2個作用,其一是根據(jù)提供參數(shù)獲取不同CSP,其二是根據(jù)參數(shù)產生或銷毀密鑰容器。CPReleaseContext用于釋放加密接口函數(shù)句柄。以上2函數(shù)調用成功則返回非0值。散列函數(shù):CSP散列函數(shù)有CPCreateHash、CPHashData、CPGetHashParam、CPDestroyHash、CPHash-SessionKey、CPGenRandom共6個函數(shù),前面4個函數(shù)通常一起使用,并根據(jù)給定數(shù)據(jù)產生散列值。CPCre-ateHash用于產生CSP散列對象句柄,該句柄用于后續(xù)CPHashData函數(shù)產生散列值,緊接著使用CPGetH-ashParam獲取所產生散列值。最后由CPDestroyHash銷毀散列對象句柄。具體散列算法根據(jù)CPCreateHash參數(shù)確定??梢栽O定CPGetHashParam中參數(shù)防止同一數(shù)據(jù)進行多次加密。CPHashSessionKey用于對密鑰對象產生散列值,CPGenRandom用于由隨機數(shù)填充緩沖區(qū),這個函數(shù)主要用于利用隨機數(shù)進行加密。密鑰生成函數(shù):產生密鑰函數(shù)有CPDeriveKey、CPGenKey、CPDestroyKey等函數(shù),其中CPDeriveKey用于根據(jù)口令產生密碼,CPGenKey用于根據(jù)隨機數(shù)產生密碼,使用CRYPT-EXPORTABLE參數(shù)時,產生一個可以輸出密鑰,以便不同計算機或會話之間采用,CPDestroyKey用于釋放密鑰句柄。加/解密類函數(shù):加密和解密函數(shù)有CPEncrypt、CPDecrypt、CPSignHash、CPVerifySignature等函數(shù),CPEncrypt用于進行加密操作,CPDecrypt用于進行解密操作,這2個函數(shù)特別有用,他們包含以下參數(shù),密鑰句柄、散列對象句柄、用于判斷是否為最后一塊布爾值、加密/解密數(shù)據(jù)塊指針、加密/解密緩沖區(qū)數(shù)量等參數(shù)。注意有些加密算法使得加密數(shù)據(jù)長度與解密數(shù)據(jù)長度相同,但有些算法會增加加密數(shù)據(jù)塊長度。CPSign-Hash對數(shù)據(jù)進行簽名,其實質是對數(shù)據(jù)進行散列和對散列結果進行加密(簽名私鑰)合成。CPVerifySig-nature對簽名進行驗證,其實質是對原始數(shù)據(jù)進行散列得到結果一,對簽名數(shù)據(jù)進行解密(簽名公鑰)得到結果二,比較二者是否一致。如果是,則驗簽成功,否則失敗。密鑰操作函數(shù):密鑰輸入/輸出函數(shù)有CPExportKey、CPImportKey,其中CPExportKey用于導出密鑰,使其產生一個副本,CPImportKey用于導入副本密鑰。獲取和設置密鑰參數(shù)函數(shù)有CPGetKeyParam、CPGetUserKey、CPSetKeyParam等,CPGetKeyParam用于獲取當前密鑰操作的數(shù)據(jù),CPGetUserKey用于獲取用戶密鑰參數(shù)句柄,CPSetKeyParam用于對密鑰進行各種定制操作。其他函數(shù):其他對CSP對象和哈西對象進行操作的函數(shù)有CPGetProvParam、CPSetHashParam、CPSet-Provider、CPSetProvParam等,其中CPGetProvParam用于獲取當前操作CSP參數(shù),CPSetHashParam用于對散列對象定制操作,CPSetProvider用于指定當前用戶默認CSP,CPSetProvParam用于定制各種CSP操作。3)CSP開發(fā)其他注意事項。在開發(fā)CSP過程中,對其函數(shù)流程應非常清楚。CSP提供運算功能可分為:散列運算、加密/解密運算、簽名/驗簽運算、密鑰輸出/輸入操作、對象屬性設置和讀取等幾類。CSP內部運行時,一般通過CPAcquireContext得到密鑰容器句柄,并在以后函數(shù)調用中通過密鑰容器句柄來使用CSP提供各種密碼運算。因此在開發(fā)CSP過程中,對CSP各種初始化工作應在CPAcquireContext中完成。在開發(fā)CSP過程中,最重要的就是一定要考慮好其數(shù)據(jù)結構,只有合理的數(shù)據(jù)結構,才能保證其有序運行。其數(shù)據(jù)結構主要包含存儲數(shù)據(jù)結構和內存數(shù)據(jù)結構,下面是開發(fā)中所采用的數(shù)據(jù)結構,以供參考。1存儲數(shù)據(jù)結構CSP中存儲數(shù)據(jù)結構包括2部分,一部分是CSP注冊信息,即安裝了CSP后它為OS提供定位信息;一部分是CSP自身信息,即對CSP中用到密鑰容器內容保存。CSP安裝好以后,在注冊表中為OS提供定位信息和使用密鑰容器信息位置。在該密鑰容器中,應區(qū)分不同加密方式,對不同加密方式,應給出不同加密動態(tài)連接庫函數(shù)。在密鑰容器中可以有各種用戶密鑰信息,如可以包含簽名公鑰值,簽名私鑰值,簽名密鑰對是否可以輸出,加密公鑰值,加密私鑰值,加密密鑰對是否可以輸出等各種信息。2內存數(shù)據(jù)結構內存數(shù)據(jù)結構主

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論