1. 程式人生 > 其它 >密碼引擎-加密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

1.2 PKCS#11

PKCS #11

1.3 GM/T 0016-2012 智慧密碼鑰匙密碼應用介面規範

1.4 GM/T 0018-2012 密碼裝置應用介面規範

2 總結這些API在程式設計中的使用方式

2.1 CryptoAPI

2.1.1 體系結構

CryptoAPI體系架構共由五大部分組成:

  1. 基本加密函式:用於選擇CSP、建立CSP連線、產生金鑰、交換及傳輸金鑰等操作
  2. 證書編解碼函式:用於資料加密、解密、雜湊等操作,建立和校驗數字簽名操作;實現證書、證書撤銷列表、證書請求和證書擴充套件編碼和解碼操作。
  3. 證書庫管理函式:用於數字證書及證書管理等操作。這組函式用於管理證書、證書撤銷列表和證書信任列表的使用、儲存、獲取等。
  4. 簡單的訊息函式:用於訊息處理,比如訊息編解碼,訊息加解密,數字簽名及簽名驗籤等操作。它是把多個底層訊息函式包裝在一起以完成某個特定任務,方便使用者使用。
  5. 底層訊息函式:底層訊息函式對傳輸的PKCS#7資料進行編碼,對接收到的PKCS#7資料進行解碼,並且對接收到的訊息進行解碼和驗證。它可以實現簡單訊息函式可以實現的所有功能,且提供更大的靈活性,但一般需要更多的函式呼叫。

2.1.2 基本功能

  1. 金鑰管理

    在CryptoAPI中,支援兩種型別的金鑰:會話金鑰、公私鑰對。會話金鑰也稱為對稱金鑰,用於對稱金鑰演算法。為了保證金鑰的安全性,在CryptoAPI中,這些金鑰都儲存在CSP內部,使用者可以通過CryptExportKey以加密金鑰形式匯出。公私鑰用於非對稱加密演算法。非對稱加密演算法主要用於加解密會話金鑰和數字簽名。在CryptoAPI中,一般來說,大多數CSP產生的金鑰容器包含兩對金鑰對,一對用於加密會話金鑰,稱為交換金鑰對,一對用於產生數字簽名,稱為簽名金鑰對。在CryptoAPI中所有的金鑰都儲存在CSP中,CSP負責金鑰的建立,銷燬,匯入匯出等操作。

  2. 資料編解碼

    CryptoAPI採用的編碼方式為ASN.1,編碼規則為DER,表示傳送資料時先把資料抽象為ASN.1物件,然後使用DER編碼規則把ASN.1物件轉化為可傳輸的0,1串;接收方接收到資料後,利用DER解碼規則把0,1串轉化為ASN.1物件,然後把ASN.1物件轉化為具體應用支援的資料物件。

  3. 資料加解密

    在CryptoAPI中約定加密較大資料塊時,採用對稱金鑰演算法。通過其封裝好的加解密函式來實現資料加解密操作。

  4. 雜湊和數字簽名

    雜湊和數字簽名一般用於資料的完整性校驗和身份鑑別。CryptoAPI中,通過其封裝好的雜湊與數字簽名函式來實現相關操作。微軟公司提供的CSP產生的數字簽名遵循RSA標準(PKCS#6)

  5. 數字證書管理

    數字證書主要用於安全通訊中的身份鑑別。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