密碼引擎-加密API研究
密碼引擎-加密API研究
目錄
- 密碼引擎-加密API研究
0 任務詳情
- 查詢各種標準的原始文件,研究學習(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
- 總結這些API在程式設計中的使用方式
- 列出這些API包含的函式,進行分類,並總結它們的異同
- 以龍脈GM3000Key為例,寫出呼叫不同介面的程式碼(Crypto API,PKCS#11,SKF介面),把執行截圖加入部落格,並提供程式碼連結
1 研究學習原始文件
1.1 CryptoAPI
- Cryptography
- CryptoAPI System Architecture
- Cryptographic Provider Types
- Microsoft Cryptographic Service Providers
- Cryptography API: Next Generation
- wincrypt.h header
1.2 PKCS#11
1.3 GM/T 0016-2012 智慧密碼鑰匙密碼應用介面規範
1.4 GM/T 0018-2012 密碼裝置應用介面規範
2 總結這些API在程式設計中的使用方式
2.1 CryptoAPI
2.1.1 體系結構
CryptoAPI體系架構共由五大部分組成:
- 基本加密函式:用於選擇CSP、建立CSP連線、產生金鑰、交換及傳輸金鑰等操作
- 證書編解碼函式:用於資料加密、解密、雜湊等操作,建立和校驗數字簽名操作;實現證書、證書撤銷列表、證書請求和證書擴充套件編碼和解碼操作。
- 證書庫管理函式:用於數字證書及證書管理等操作。這組函式用於管理證書、證書撤銷列表和證書信任列表的使用、儲存、獲取等。
- 簡單的訊息函式:用於訊息處理,比如訊息編解碼,訊息加解密,數字簽名及簽名驗籤等操作。它是把多個底層訊息函式包裝在一起以完成某個特定任務,方便使用者使用。
- 底層訊息函式:底層訊息函式對傳輸的PKCS#7資料進行編碼,對接收到的PKCS#7資料進行解碼,並且對接收到的訊息進行解碼和驗證。它可以實現簡單訊息函式可以實現的所有功能,且提供更大的靈活性,但一般需要更多的函式呼叫。
2.1.2 基本功能
-
金鑰管理
在CryptoAPI中,支援兩種型別的金鑰:會話金鑰、公私鑰對。會話金鑰也稱為對稱金鑰,用於對稱金鑰演算法。為了保證金鑰的安全性,在CryptoAPI中,這些金鑰都儲存在CSP內部,使用者可以通過CryptExportKey以加密金鑰形式匯出。公私鑰用於非對稱加密演算法。非對稱加密演算法主要用於加解密會話金鑰和數字簽名。在CryptoAPI中,一般來說,大多數CSP產生的金鑰容器包含兩對金鑰對,一對用於加密會話金鑰,稱為交換金鑰對,一對用於產生數字簽名,稱為簽名金鑰對。在CryptoAPI中所有的金鑰都儲存在CSP中,CSP負責金鑰的建立,銷燬,匯入匯出等操作。
-
資料編解碼
CryptoAPI採用的編碼方式為ASN.1,編碼規則為DER,表示傳送資料時先把資料抽象為ASN.1物件,然後使用DER編碼規則把ASN.1物件轉化為可傳輸的0,1串;接收方接收到資料後,利用DER解碼規則把0,1串轉化為ASN.1物件,然後把ASN.1物件轉化為具體應用支援的資料物件。
-
資料加解密
在CryptoAPI中約定加密較大資料塊時,採用對稱金鑰演算法。通過其封裝好的加解密函式來實現資料加解密操作。
-
雜湊和數字簽名
雜湊和數字簽名一般用於資料的完整性校驗和身份鑑別。CryptoAPI中,通過其封裝好的雜湊與數字簽名函式來實現相關操作。微軟公司提供的CSP產生的數字簽名遵循RSA標準(PKCS#6)
-
數字證書管理
數字證書主要用於安全通訊中的身份鑑別。CryptoAPI中,對數字證書的使用管理函式分為證書與證書庫函式、證書驗證函式兩大部分。
2.2 PKCS#11
PKCS#11是使用非常普遍的密碼裝置介面,在實際應用中,國密的密碼裝置應用介面規範GM/T 0018-2012
與之作用相同,在技術體系架構中處於類似的位置。PKCS#11標準定義了與密碼令牌的獨立於平臺的API,API本身命名為Cryptoki,這個API已經發展成為一個通用的加密令牌的抽象層。PKCS#11主要是應用於智慧卡和HSM。
Cryptoki模型
Cryptoki:Cryptographic Token Interface Standard 密碼令牌介面標準,應用程式與各種各樣行動式密碼裝置間的一種介面。裝置的種類和所支援的能力的種類取決於專用的Cryptoki庫。該標準只定義庫的介面,不定義庫的實現,介面實現由裝置商提供。Cryptoki主要目標是一個低階程式介面,將裝置的細節抽象化,並把密碼裝置的通用模型-密碼令牌提供給應用程式。第二目標是資源共享,單個裝置能為一個以上的應用程式共享。Cryptoki為一個或多個密碼裝置提供一個介面,這些裝置通過大量的槽在系統中執行,密碼裝置可以按照某一命令集執行某些密碼操作,這些命令通常通過標準的裝置驅動程式來實現,Cryptoki的作用就是遮蔽這些硬體的差異。
2.3 SKF
針對支援國密演算法USB KEY裝置的應用,我國頒佈一個行業標準《智慧密碼鑰匙應用介面規範》(GM/T 0016-2012)中給出,市面上銷售的國密演算法的USB KEY裝置必須支援這個介面規範。因此,只要根據這個規範開發的應用程式,就可以相容使用不同廠家及品牌的USB KEY產品。由於此規範中函式名稱都以SKF開頭,所以我們一般把按照此規範提供的裝置開發介面庫叫做SKF庫或SKF介面。
智慧密碼鑰匙密碼應用介面位於智慧密碼鑰匙應用程式和智慧密碼鑰匙裝置驅動之間。
一個裝置中存在裝置認證金鑰和多個應用,應用之間相互獨立。
應用由管理員PIN,使用者PIN、檔案和容器組成,可以存在多個檔案和多個容器。每個應用維護各自的與管理員PIN和使用者PIN相關的許可權狀態。
容器中存放加密金鑰對、簽名金鑰對和會話金鑰。其中加密金鑰對用於保護會話金鑰,簽名金鑰對用於數字簽名和驗證,會話金鑰用於資料加解密和MAC運算。容器中也可以存放與加密金鑰對對應的加密數字證書和與簽名金鑰對對應的簽名數字證書。其中,簽名金鑰對由內部產生,加密金鑰對由外部產生並安全匯入,會話金鑰可由內部產生或者由外部產生並安全匯入。
3 對這些API包含的函式進行分類和對比
3.1 CryptoAPI
3.1.1 基本加密函式
(1)服務提供者函式
應用程式使用服務提供者函式來連線和斷開一個CSP(Cryptographic Service Providers)。
函式名 | 函式功能 |
---|---|
CryptAcquireContext | 獲得指定CSP 的金鑰容器的控制代碼 |
CryptContextAddRef | 對HCRYPTPROV 控制代碼增加一個應用計數 |
CryptEnumProviders | 列舉當前計算機中的CSP |
CryptEnumProviderTypes | 列舉CSP 的型別 |
CryptGetDefaultProvider | 對於指定CSP 型別的卻省CSP |
CryptGetProvParam | 得到一個CSP 的屬性 |
CryptInstallDefaultContext | 安裝先前得到的HCRYPTPROV 上下文作為當前卻省的上下文 |
CryptReleaseContext | 釋放由CryptAcquireContext 得到的控制代碼 |
CryptSetProvider|CryptSetProviderEx | 為指定CSP 型別指定一個卻省的CSP |
CryptSetProvParam | 指定一個CSP 的屬性 |
CryptUninstallDefaultContext | 刪除先前由CryptInstallDefaultContext 安裝的卻省上下文 |
(2)金鑰的產生和交換函式
金鑰產生函式建立、配置和銷燬加密金鑰。他們也用於和其他使用者進行交換金鑰。
函式 | 功能 |
---|---|
CryptAcquireCertificatePrivateKey | 對於指定證書上下文得到一個HCRYPTPROV控制代碼和dwKeySpec |
CryptDeriveKey | 從一個密碼中派生一個金鑰 |
CryptDestoryKey | 銷燬金鑰 |
CryptDuplicateKey | 製作一個金鑰和金鑰狀態的精確複製 |
CryptExportKey | 把CSP 的金鑰做成BLOB 傳送到應用程式的記憶體空間中 |
CryptGenKey | 建立一個隨機金鑰 |
CryptGenRandom | 產生一個隨機數 |
CryptGetKeyParam | 得到金鑰的引數 |
CryptGetUserKey | 得到一個金鑰交換或簽名金鑰的控制代碼 |
CryptImportKey | 把一個金鑰BLOB 傳送到CSP中 |
CryptSetKeyParam | 指定一個金鑰的引數 |
(3)編碼/解碼函式
有一些編碼/解碼函式,他們可以用來對證書、證書撤銷列表、證書請求和證書擴充套件進行編碼和解碼。
函式 | 函式功能 |
---|---|
CryptDecodeObject | 對lpszStructType 結構進行解碼 |
CryptDecodeObjectEx | 對lpszStructType 結構進行解碼,此函式支援記憶體分配選項 |
CryptEncodeObject | 對lpszStructType 結構進行編碼 |
CyptEncodeObjectEx | 對lpszStructType 結構進行編碼,此函式支援記憶體分配選項 |
(4)資料加密/解密函式
這些函式支援資料的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被呼叫前指定一個金鑰。這個金鑰可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 產生。建立金鑰時要指定加密演算法。CryptSetKeyParam 函式可以指定額外的加密引數。
函式 | 功能 |
---|---|
CryptDecrypt | 使用指定加密金鑰來解密一段密文 |
CryptEncrypt | 使用指定加密金鑰來加密一段明文 |
CryptProtectData | 執行對DATA_BLOB 結構的加密 |
CryptUnprotectData | 執行對DATA_BLOB 結構的完整性驗證和解密 |
(5)雜湊和數字簽名函式
這些函式在應用程式中完成計算雜湊、建立和校驗數字簽名。
函式 | 功能 |
---|---|
CryptCreateHash | 建立一個空雜湊物件 |
CryptDestoryHash | 銷燬一個雜湊物件 |
CryptDuplicateHash | 複製一個雜湊物件 |
CryptGetHashParam | 得到一個雜湊物件引數 |
CryptHashData | 對一塊資料進行雜湊,把它加到指定的雜湊物件中 |
CryptHashSessionKey | 對一個會話金鑰進行雜湊,把它加到指定的雜湊物件中 |
CryptSetHashParam | 設定一個雜湊物件的引數 |
CryptSignHash | 對一個雜湊物件進行簽名 |
CryptVerifySignature | 校驗一個數字簽名 |
3.1.2 證書和證書庫函式
這組函式管理、使用和取得證書、證書撤銷列表和證書信任列表。
(1)證書庫函式
一個使用者站點可以收集許多證書。這些證書是為這個站點的使用者所使用的,證書描述了這個使用者的具體身份。對於每個人,可能有一個以上的證書。證書庫和其相關的函式提供了對庫獲得、列舉、驗證和使用證書庫裡的資訊。
函式 | 功能 |
---|---|
CertAddStoreToCollection | 在證書庫中增加一個證書 |
CertCloseStore | 關閉一個證書庫控制代碼 |
CertControlStore | 如果證書緩衝區和證書本身內容不相符時,允許給應用程式發一個通知 |
CertDuplicateStore | 通過增加引用計數來複制證書庫控制代碼 |
CertEnumPhysicalStore | 對於指定系統庫列舉物理庫 |
CertEnumSystemStore | 列舉所有可用的系統庫 |
CertEnumSystemStoreLocation | 列舉可用系統庫的所有位置 |
CertGetStoreProperty | 得到一個庫的屬性 |
CertOpenStore | 使用指定庫型別來開啟證書庫 |
CertOpenSystemStore | 開啟一個系統證書庫 |
CertRegisterPhysicalStore | 在一個註冊系統庫裡增加一個物理庫 |
CertRegisterSystemStore | 註冊一個系統庫 |
CertRemoveStoreFromCollection | 從一個庫集合裡刪除證書庫 |
CertSaveStore | 儲存證書庫 |
CertSetStoreProperty | 設定證書屬性 |
CertUnregisterPhysicalStore | 從系統庫中刪除一個物理庫 |
CertUnregisterSystemStore | 反註冊一個指定系統庫 |
(2)維護函式
函式 | 功能 |
---|---|
CertAddSerializeElementToStore | 在庫中增加一系列證書或CRL |
CertCreateContext | 從編碼位元組中建立指定上下文 |
CertEnumSubjectInSortedCTL | 在CTL 庫中列舉信任主題 |
CertFindSubjectInCTL | 在CTL 中尋找指定主題 |
CertFindSubjectInSortedCTL | 在分類CTL 中尋找指定主題 |
(3)證書函式
下列函式是針對於證書的。大多數函式都是處理CRL 和CTL 的。
函式 | 功能 |
---|---|
CertAddCertificateContextToStore | 在證書庫裡增加一個證書上下文 |
CertAddCertificateLinkToStore | 在證書庫裡增加一個對不同庫裡的證書上下文的連結 |
CertAddEncodedCertificateToStore | 把編碼證書轉換成證書上下文並且把它加到證書庫裡 |
CertCreateCertificateContext | 從編碼證書中建立一個證書上下文。但這個上下文並不放到證書庫裡 |
CertCreateSelfSignCertificate | 建立一個自簽名證書 |
CertDeleteCertificateFromStore | 從證書庫裡刪除一個證書 |
CertDuplicateCertificate | 通過增加引用計數來複制證書上下文 |
CertEnumCertificateInStore | 在證書庫裡列舉證書上下文 |
CertFindCertificateInStore | 在證書庫裡尋找證書上下文 |
CertFreeCertificateContext | 釋放一個證書上下文 |
CertGetIssuerCertificateFromStore | 在證書庫裡得到指定主題證書的發行者 |
CertGetSubjectCertificateFromStore | 獲得主題證書的上下文 |
CertGetValidUsages | 返回所有證書的用法 |
CertSerializeCertificateStoreElement | 序列化編碼證書的證書上下文 |
CertVerifySubjectCertificateContext | 使用發行者來驗證主題證書 |
CryptUIDlgViewContext | 顯示證書、CRL 或CTL |
CryptUIDlgSelectCertificateFromStore | 從指定庫中顯示對話方塊,可以從中選擇證書 |
(4)證書撤銷列表函式
函式 | 功能 |
---|---|
CertAddCRLContextToStore | 在證書庫裡增加一個CRL 上下文 |
CertAddCRLLinkToStore | 在不同的庫裡增加一個CRL 上下文連結 |
CertAddEncodedCRLToStore | 把編碼CRL 轉化成CRL 上下文然後把它加入到證書庫中 |
CertCreateCRLContext | 從編碼CRL 中建立CRL 控制代碼,但不把它加到庫中 |
CertDeleteCRLFromStore | 從證書庫裡刪除一個CRL |
CertDuplicateCRLContext | 通過增加引用計數來複制CRL 上下文 |
CertEnumCRLsInStore | 列舉庫裡的CRL 控制代碼 |
CertFindCertificateInCRL | 從指定證書裡尋找CRL 列表 |
CertFindCRLInStore | 在庫裡尋找CRL 上下文 |
CertFreeCRLContext | 釋放CRL 上下文 |
CertGetCRLFromStore | 從庫裡得到CRL 上下文控制代碼 |
CertSerializeCRLStoreElement | 序列化CRL 上下文的編碼CRL 和它的屬性 |
(5)證書信任列表函式
函式 | 功能 |
---|---|
CertAddCTLContextToStore | 把一個CTL 上下文加入到證書庫裡 |
CertAddCTLLinkToStore | 給不同庫裡的CRL 上下文新增連結 |
CertAddEncodedCTLToStore | 把編碼CTL 轉化成CTL 上下文並且把它加到證書庫裡 |
CertCreateCTLContext | 從編碼CTL 中建立CTL 上下文 |
CertDeleteCTLFromStore | 從證書庫裡刪除CTL |
CertDuplicateCTLContext | 通過增加引用計數來複制CTL 上下文 |
CertEnumCTLsInStore | 在證書庫裡列舉CTL 上下文 |
CertFindCTLInStore | 在證書庫裡查詢CTL 上下文 |
CertFreeCTLContext | 釋放CTL 上下文 |
CertSerializeCTLStoreElement | 序列化CTL 上下文的編碼CTL 和屬性 |
(6) 擴充套件屬性函式
函式 | 功能 |
---|---|
CertEnumCertificateContextProperties | 列舉指定證書上下文的屬性 |
CertEnumCRLContextProperties | 列舉指定CRL 上下文的屬性 |
CertEnumCTLContextProperties | 列舉指定CTL 上下文的屬性 |
CertGetCertificateContextProperty | 得到證書屬性 |
CertGetCRLContextProperty | 得到CRL 屬性 |
CertGetCTLContextProperty | 得到CTL 屬性 |
CertSetCertificateContextProperty | 設定證書屬性 |
CertSetCRLContextProperty | 設定CRL 屬性 |
CertSetCTLContextProperty | 設定CTL 屬性 |
3.1.3 證書驗證函式
證書驗證是通過CTL 和證書列表進行的。
(1)使用CTL的函式
函式 | 功能 |
---|---|
CertVerifyCTLUsage | 驗證CTL 用法 |
CryptMsgEncodeAndSignCTL | 編碼和驗證CTL |
CryptMsgGetAndVerifySigner | 從一個訊息中獲得和驗證CTL |
CryptMsgSignCTL | 對包含CTL 的訊息進行簽名 |
(2)證書鏈驗證函式
函式 | 功能 |
---|---|
CertCreateCertificateChainEngine | 為應用程式建立一個新的非卻省的鏈引擎 |
CertCreateCTLEntryFromCertificateContextProperties | 建立一個CTL 入口 |
CertDuplicateCertificateChain | 通過增加引用計數來複制證書鏈 |
CertFindChainInStore | 在證書庫裡查詢證書鏈 |
CertFreeCertificateChain | 釋放證書鏈 |
CertFreeCertificateChainEngine | 釋放證書鏈引擎 |
CertGetCertificateChain | 從最後一個證書建立一個上下文連結串列 |
CertSetCertificateContextPropertiesFromCTLEntry | 通過CTL 入口屬性來設定證書上下文的屬性 |
CertIsValidCRLForCertificate | 通過檢查CRL 來確定CRL 是否包括指定被撤銷的證書 |
CertVerifyCertificateChainPolicy | 通過檢查證書鏈來確定它的完整性 |
3.1.4 訊息函式
CryptoAPI 訊息函式包括兩組:
- 低階訊息函式
- 簡化訊息函式。
低階訊息函式直接和PKCS#7 訊息工作。這些函式對傳輸的PKCS#7 資料進行編碼,對接收到的PKCS#7 資料進行解碼,並且對接收到的訊息進行解密和驗證。簡化訊息函式是比較高階的函式,是對幾個低階訊息函式和證書函式的封裝,用來執行指定任務。這些函式在完成一個任務時,減少了函式呼叫的數量,因此簡化了CryptoAPI的使用。
(1)低階訊息函式
函式 | 功能 |
---|---|
CryptMsgCalculateEncodedLength | 計算加密訊息的長度 |
CryptMsgClose | 關閉加密訊息的控制代碼 |
CryptMsgControl | 執行指定的控制函式 |
CryptMsgCountersign | 標記訊息中已存在的簽名 |
CryptMsgCountersignEncoded | 標記已存在的簽名 |
CryptMsgDuplicate | 通過增加引用計數來複制加密訊息控制代碼 |
CryptMsgGetParam | 對加密訊息進行編碼或者解碼後得到的引數 |
CryptMsgOpenToDecode | 開啟加密訊息進行解碼 |
CryptMsgOpenToEncode | 開啟加密訊息進行編碼 |
CryptMsgUpdate | 更新加密訊息的內容 |
CryptMsgVerifyCountersignatureEncoded | 驗證SignerInfo 結構中標記時間 |
CryptMsgVerifyCountersignatureEncodedEx | 驗證SignerInfo 結構中標記時間簽名者可以是CERT_PUBLIC_KEY_INFO 結構 |
(2) 簡化訊息函式
函式 | 功能 |
---|---|
CryptDecodeMessage | 對加密訊息進行解碼 |
CryptDecryptAndVerifyMessageSignature | 對指定訊息進行解密並且驗證簽名者 |
CryptDecryptMessage | 解密指定訊息 |
CryptEncryptMessage | 加密指定訊息 |
CryptGetMessageCertificates | 返回包含訊息的證書和CRL 的證書庫 |
CryptGetMessageSignatureCount | 返回簽名訊息的簽名者數量 |
CryptHashMessage | 建立訊息的雜湊 |
CryptSignAndEncryptMessage | 對訊息進行簽名並且加密 |
CryptSignMessage | 對訊息進行簽名 |
CryptVerifyDetachedMessageHash | 驗證包含已解邦定雜湊的雜湊訊息 |
CryptVerifyDetachedMessageSignature | 驗證包含已解邦定簽名的簽名訊息 |
CryptVerifyMessageHash | 驗證一個雜湊訊息 |
CryptVerifyMessageSignature | 驗證一個簽名訊息 |
3.1.5 輔助函式
(1)資料管理函式
函式 | 功能 |
---|---|
CertCompareCertificate | 比較兩個證書是否相同 |
CertCompareCertificateName | 通過比較兩個證書名稱來決定他們是否相同 |
CertCompareIntegerBlob | 比較兩個整數BLOB |
CertComparePublicKeyInfo | 通過比較兩個證書公鑰來決定他們是否相同 |
CertFindAttribute | 通過OID 來查詢屬性 |
CertFindExtension | 通過OID 來查詢擴充套件 |
CertFindRDNAttr | 通過OID 來查詢RDN 屬性 |
CertGetIntendedKeyUsage | 從證書中取得相關金鑰用法 |
CertGetPublicKeyLength | 從公鑰BLOB 中取得公鑰/私鑰長度 |
CertIsRDNAttrsInCertificateName | 通過指定RDN 陣列屬性比較證書名稱屬性來決定證書是否已包含了所有屬性 |
CertVerifyCRLRevocation | 驗證主題證書是否在CRL 中 |
CertVerifyCRLTimeValidity | 驗證CRL 的有效時間 |
CertVerifyRevocation | 驗證主題證書是否在CRL 中 |
CertVerifyTimeValidity | 驗證CRL 的有效時間 |
CertVerifyValidityNesting | 驗證主題時間的有效性是否在發行者有效時間內 |
CryptExportPublicKeyInfo | 匯出公鑰資訊 |
CryptExportPublicKeyInfoEx | 匯出公鑰資訊(使用者可以指定演算法) |
CryptFindCertificateKeyProvInfo | 列舉CSP 和它的金鑰容器來查詢對應於公鑰的相應私鑰 |
CryptFindLocalizedName | 查詢指定名字的區域性化名稱 |
CryptHashCertificate | 雜湊證書內容 |
CryptHashPublicKeyInfo | 計算公鑰資訊的雜湊 |
CryptHashToBeSigned | 計算簽名內容的資訊雜湊值 |
CryptImportPublicKeyInfo | 把公鑰資訊匯入CSP 並且返回它的控制代碼 |
CryptImportPublicKeyInfoEx | 把公鑰資訊匯入CSP 並且返回它的控制代碼 |
CryptMemAlloc | 分配記憶體 |
CryptMemFree | 釋放記憶體 |
CryptMemRealloc | 重新分配記憶體 |
CryptQueryObject | 得到BLOB 或檔案的內容資訊 |
CryptSignAndEncodeCertificate | 對資訊進行簽名並且編碼 |
CryptSignCertificate | 對證書進行簽名 |
CryptVerifyCertificateSignature | 使用公鑰資訊對主題證書或CRL 的簽名進行驗證 |
CryptVerifyCertificateSignatureEx | 使用公鑰資訊對主題證書或CRL 的簽名進行驗證 |
(2)資料轉換函式
函式 | 功能 |
---|---|
CertAlgIdToOID | 把CSP 演算法標示符轉換成OID |
CertGetNameString | 得到證書的主題或頒發者名稱並且把它轉換成字串 |
CertNameToStr | 把證書名稱BLOB 轉換成字串 |
CertOIDToAlgId | 把OID 轉換成CSP 演算法表示符 |
CertRDNValueToStr | 把名稱值轉換成字串 |
CertStrToName | 把字串轉換成編碼證書名稱 |
CryptBinaryToString | 把二進位制序列轉換成字串 |
CryptFormatObject | 格式化編碼資料,返回Unicode 字串 |
CryptStringToBinary | 把格式化的字串轉換成二進位制序列 |
(3)增強金鑰用法函式
函式 | 功能 |
---|---|
CertAddEnhancedKeyUsageIdentifier | 在證書EKU 屬性中增加一個用法標示符 |
CertGetEnhancedKeyUsage | 獲得證書的EKU 擴充套件或屬性資訊 |
CertRemoveEnhancedKeyUsageIdentifier | 從證書EKU 擴充套件屬性中刪除用法標示符OID |
CertSetEnhancedKeyUsage | 設定證書的EKU 屬性 |
(4)金鑰標示函式
函式 | 功能 |
---|---|
CryptCreateKeyIdentifierFromCSP | 建立CSP 公鑰的金鑰標示符 |
CryptEnumKeyIdentifierProperties | 列舉標示符和其屬性 |
CryptGetKeyIdentifierProperty | 從指定金鑰標示符中獲得指定屬性 |
CryptSetKeyIdentifierProperty | 設定指定金鑰標示符的屬性 |
(5)證書庫回撥函式
函式 | 功能 |
---|---|
CertDllOpenStoreProv | 定義庫提供者開啟函式 |
CertStoreProvCloseCallback | 決定當證書庫引用計數為0 時將發生的動作 |
CertStoreProvDeleteCertCallback | 決定當從證書庫中刪除一個證書之前的動作 |
CertStoreProvDeleteCRLCallback | 決定當從證書庫中刪除一個CRL 之前的動作 |
CertStoreProvReadCertCallback | 保留 |
CertStoreProvReadCRLCallback | 保留 |
CertStoreProvSetCertPropertyCallback | 決定在CertSetCertificateContextProperty 和CertGetCertificateContext 呼叫之前的動作 |
CertStoreProvSetCRLPropertyCallback | 決定在CertSetCRLContextProperty 和CertGetCRLContextProperty 呼叫之前的動作 |
CertStoreProvWriteCertCallback | 決定在證書庫中加入一個證書前的動作 |
CertStoreProvWriteCRLCallback | 決定在證書庫中加入一個CRL 前的動作 |
CertStoreProvReadCTL | 讀CSP 的CTL 上下文 |
CertStoreProvWriteCTL | 決定CTL 是否可被加入到證書庫中 |
CertStoreProvDeleteCTL | 決定CTL 是否可被刪除 |
CertStoreProvSetCTLProperty | 決定是否可以設定CTL 的屬性 |
CertStoreProvControl | 當緩衝庫和儲存庫不同時,通知應用程式 |
CertStoreProvFindCert | 在證書庫中查詢下一個證書 |
CertStoreProvFreeFindCert | 釋放前一個找到的證書上下文 |
CertStoreProvGetCertProperty | 得到指定的證書屬性 |
CertStoreProvFindCRL | 查詢第一個或下一個匹配的CRL |
CertStoreProvFreeFindCRL | 釋放前一個找到的CRL 上下文 |
CertStoreProvGetCRLProperty | 得到指定CRL 屬性 |
CertStoreProvFindCTL | 查詢第一個或下一個匹配的CTL |
CertStoreProvFreeFindCTL | 釋放前一個找到的CTL 上下文 |
CertStoreProvGetCTLProperty | 得到指定CTL 屬性 |
具體函式和功能參考:CryptoAPI
3.2 PKCS#11
3.2.1 通用介面
函式 | 描述 |
---|---|
C_Initialize | 初始化 Cryptoki |
C_Finalize | 整理各種適合 Cryptoki的資源 |
C_GetInfo | 獲得關於Cryptoki的通用資訊 |
C_GetFunctionList | 獲得Cryptoki 庫函式的進入點 |
3.2.2 槽和令牌管理函式
函式 | 功能 |
---|---|
C_GetSlotList | 獲得系統中槽的名單 |
C_GetSlotInfo | 獲得關於特殊槽的資訊 |
C_GetTokenInfo | 獲得關於特殊令牌的資訊 |
C_WaitForSlotEvent | 等待槽事件(令牌插入,轉移等) 的發生 |
C_GetMechanismList | 獲得由令牌支援的機制的名單 |
C_GetMechanismInfo | 獲得關於特殊機制的資訊 |
C_InitToken | 初始化一個令牌 |
C_InitPIN | 初始化普通使用者的 PIN |
C_SetPIN | 改變現在使用者的PIN |
3.2.3 會話管理函式
函式 | 功能 |
---|---|
C_OpenSession | 開啟一個應用程式和特殊令牌之間的連線或安裝一個應用程式呼叫返回令牌插入 |
C_CloseSession | 關閉一個會話 |
C_CloseAllSessions | 用令牌關閉所有的會話 |
C_GetSessionInfo | 獲得關於會話的資訊 |
C_GetOperationState | 獲得會話的加密操作狀態 |
C_SetOperationState | 設定會話的加密操作狀態 |
C_Login | 註冊一個令牌 |
C_Logout | 從一個令牌登出 |
3.2.3 物件管理函式
C_CreateObject | 建立一個物件 |
---|---|
C_CopyObject | 建立一個物件的拷貝 |
C_DestroyObject | 銷燬一個物件 |
C_GetObjectSize | 獲取位元組中一個物件的大小 |
C_GetAttributeValue | 獲取一個物件的屬性值 |
C_SetAttributeValue | 改變一個物件的屬性值 |
C_FindObjectsInit | 初始化一個物件的搜尋操作 |
C_FindObjects | 繼續一個物件搜尋操作 |
C_FindObjectsFinal | 完成一個物件搜尋操作 |
3.2.4 加密和解密函式
函式 | 功能 |
---|---|
C_EncryptInit | 初始化一個加密操作 |
C_Encrypt | 加密單部分資料 |
C_EncryptUpdate | 繼續一個多部分加密操作 |
C_EncryptFinal | 完成一個多部分加密操作 |
C_DecryptInit | 初始化一個解密操作 |
C_Decrypt | 解密單部分加密資料 |
C_DecryptUpdate | 繼續一個多部分解密操作 |
C_DecryptFinal | 完成一個多部分解密操作 |
3.2.5 訊息摘要函式
函式 | |
---|---|
C_DigestInit | 初始化一個訊息摘要操作 |
C_Digest | 摘要單部分資料 |
C_DigestUpdate | 繼續一個多部分摘要操作 |
C_DigestKey | 摘要一個金鑰 |
C_DigestFinal | 完成一個多部分摘要操作 |
3.2.5 簽名和驗籤函式
函式 | 功能 |
---|---|
C_SignInit | 初始化一個簽名操作 |
C_Sign | 簽名單部分資料 |
C_SignUpdate | 繼續一個多部分簽名操作 |
C_SignFinal | 完成一個多部分簽名操作 |
C_SignRecoverInit | 初始化一個簽名操作,在操作中資料能從簽名中恢復 |
C_SignRecover | 簽名單部分資料,在操作中資料能從簽名中恢復 |
C_VerifyInit | 初始化一個鑑定操作 |
C_Verify | 在單部分資料上鑑定一個簽名 |
C_VerifyUpdate | 繼續一個多部分鑑定操作 |
C_VerifyFinal | 完成一個多部分鑑定操作 |
C_VerifyRecoverInit | 初始化一個鑑定操作,在操作中資料能從簽名中恢復 |
C_VerifyRecover | 在單部分資料上鑑定一個簽名,在操作中資料能從簽名中恢復 |
3.2.6 雙重目的的加密
函式 | 功能 |
---|---|
C_DigestEncryptUpdate | 繼續類似的多部分摘要和加密操作 |
C_DecryptDigestUpdate | 繼續類似的多部分解密和摘要操作 |
C_SignEncryptUpdate | 繼續類似的多部分簽名和加密操作 |
C_DecryptVerifyUpdate | 繼續類似的多部分解密和鑑定操作 |
3.2.7 金鑰管理函式
函式 | 功能 |
---|---|
C_GenerateKey | 產生一個保密金鑰 |
C_GenerateKeyPair | 產生一個公共/私鑰對 |
C_WrapKey | 加密一個金鑰 |
C_UnwrapKey | 解密一個金鑰 |
C_DeriveKey | 從基礎金鑰派生一個金鑰 |
3.2.8 隨機數生成函式
函式 | 功能 |
---|---|
C_SeedRandom | 把一個附加種子材料加入隨機數字生成器 |
C_GenerateRandom | 生成隨機資料 |
具體函式內容和功能參考:PKCS#11
3.3 SFK
3.3.1 裝置管理系列函式
函式名稱 | 功能 |
---|---|
SKF_WaitForDevEvent | 等待裝置插拔事件 |
SKF_CanceIWaitForDevEvent | 取消等待裝置插拔事件 |
SKF_EnumDev | 列舉裝置 |
SKF_ConnectDev | 連線裝置 |
SKF_DisconnectDev | 斷開連線 |
SKF_GetDevState | 獲取裝置狀態 |
SKF_SetLabeI | 設定裝置標籤 |
SKF_GetDevInfo | 獲取裝置資訊 |
SKF_LockDev | 鎖定裝置 |
SKF_UnIockDev | 解鎖裝置 |
SKF_Transmit | 裝置命令傳輸 |
3.3.2 訪問控制系列函式
函式名稱 | 功能 |
---|---|
SKF_ChangeDevAuthKey | 修改裝置認證金鑰 |
SKF_DevAuth | 裝置認證 |
SKF_ChangePIN | 修改 PIN |
SKF_GetPINInfo | 獲得 PIN碼資訊 |
SKF_VerifyPIN | 校驗 PIN |
SKF_UnbIockPIN | 解鎖 PIN |
SKF_CIearSecueState | 清除應用安全狀態 |
3.3.3 應用管理系列函式
函式名稱 | 功 能 |
---|---|
SKF_CreateApplication | 建立應用 |
SKF_EnumApplication | 列舉應用 |
SKF_DeleteApplication | 刪除應用 |
SKF_OpenApplication | 開啟應用 |
SKF_CloseApplication | 關閉應用 |
3.3.4 檔案管理系列函式
函式名稱 | 功能 |
---|---|
SKF_CreateFiIe | 建立檔案 |
SKF_DeIeteFiIe | 刪除檔案 |
SKF_EnumFiIes | 列舉檔案 |
SKF_GetFiIeInfo | 獲取檔案資訊 |
SKF_ReadFiIe | 讀檔案 |
SKF_WriteFiIe | 寫檔案 |
3.3.5 容器管理系列函式
函式名稱 | 功能 |
---|---|
SKF_CreateContainer | 建立容器 |
SKF_DeIeteContainer | 刪除容器 |
SKF_EnumContainer | 列舉容器 |
SKF_OpenContainer | 開啟容器 |
SKF_CIoseContainer | 關閉容器 |
SKF_GetContainerType | 獲得容器型別 |
SKF_ImportCertificate | 導人數字證書 |
SKF_ExportCertificate | 匯出數字證書 |
3.3.6 密碼服務系列函式
函式名稱 | 功 能 |
---|---|
SKF_GenRandom | 生成隨機數 |
SKF_GenExtRsAKey | 生成外部 RsA金鑰對 |
SKF_GenRsAKeyPair | 生成 RsA簽名金鑰對 |
SKF_ImportRsAKeyPair | 導人 RsA加密金鑰對 |
SKF_RsAsignData | RsA簽名 |
SKF_RsAVerify | RsA驗籤 |
SKF_Rs/Dxportse*s*ionKey | Rs/生成並匯出會話金鑰 |
SKF_DxtRs/PubKeyOperation | Rs/外來公鑰運算 |
SKF_DxtRs/PriKeyOperation | Rs/外來私鑰運算 |
SKF_GenDAAKeyPair | 生成 DAA簽名金鑰對 |
SKF_ImportDAAKeyPair | 導人 DAA加密金鑰對 |
SKF_DAAsignCata | DAA簽名 |
SKF_DAAVerify | DAA驗籤 |
SKF_DAADxportse*s*ionKey | DAA生成並匯出會話金鑰 |
SKF_DxtDAADncrypt | DAA外來公鑰加密 |
SKF_DxtDAACecrypt | DAA外來私鑰解密 |
SKF_DxtDAAsign | DAA外來私鑰簽名 |
SKF_DxtDAAVerify | DAA外來公鑰驗籤 |
SKF_Generate/gr*e*mentCataWithDAA | DAA生成金鑰協商引數並輸出 |
SKF_GenerateKeyWithDAA | DAA計算會話金鑰 |
SKF_Generate/gr*e*mentCata/ndKeyWithDAA | DAA產生協商資料並計算會話金鑰 |
SKF_DxportPubIicKey | 匯出公鑰 |
SKF_Importse*s*ionKey | 導人會話金鑰 |
SKF_setsymmKey | 明文導人會話金鑰 |
SKF_DncryptInit | 加密初始化 |
SKF_Dncrypt | 單組資料加密 |
SKF_DncryptUpdate | 多組資料加密 |
SKF_DncryptFinaI | 結束加密 |
SKF_CecryptInit | 解密初始化 |
SKF_Cecrypt | 單組資料解密 |
SKF_CecryptUpdate | 多組資料解密 |
SKF_CecryptFinaI | 結束解密 |
SKF_CigestInit | 密碼雜湊初始化 |
SKF_Cigest | 單組資料密碼雜湊 |
SKF_CigestUpdate | 多組資料密碼雜湊 |
SKF_CigestFinaI | 結束密碼雜湊 |
SKF_MacInit | 訊息鑑別碼運算初始化 |
SKF_Mac | 單組資料訊息鑑別碼運算 |
SKF_MacUpdate | 多組資料訊息鑑別碼運算 |
SKF_MacFinaI | 結束訊息鑑別碼運算 |
SKF_AIoseHandIe | 關閉密碼物件控制代碼 |
4 介面呼叫(以龍脈GM3000Key為例)
4.1 Crypto API
程式碼連結:Gitee
4.2 PKCS#11
程式碼和編譯指令碼:Gitee
4.3 SFK
程式碼連結和編譯指令碼:Gitee