密碼引擎API的主要標準和規範包括:
- 微軟的Crypto API
- RAS公司的PKCS#11標準
- 中國商用密碼標準:GMT 0016-2012 智慧密碼鑰匙密碼應用介面規範,GMT 0018-2012密碼裝置應用介面規範等
研究以上API介面,總結他們的異同,並以龍脈GM3000Key為例,寫出呼叫不同介面的程式碼,提交部落格連結和程式碼連結
0 查詢各種標準的原始文件,研究學習(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
Crypto API
CryptoAPI(簡稱CAPI)是Windows嚮應用程式開發人員提供的一套密碼學程式設計介面,包括加密解密、身份認證和編碼解碼等。加密服務提供程式(Cryptographic Service Provider,簡稱CSP)也稱加密服務提供商,指的是Microsoft或其他公司提供的包含密碼演算法的DLL模組,CryptoAPI的呼叫最終是由這些模組中的相關API 執行的。具體說來,CryptoAPI是由Advapi32.dll和Crypt32.dll匯出的,應用程式對CryptoAPI的呼叫,會經過CryptoSPI(系統程式設計介面),然後CryptoSPI將呼叫傳遞到加密服務提供程式。應用程式開發人員可以使用CryptoAPI,而無需瞭解其底層實現細節,就像可以在不瞭解圖形硬體配置的情況下可以使用圖形庫中的API一樣
PKCS#11
PKCS#11是密碼學令牌介面標準(Cryptographic Token Interface Standard)的簡稱。它定義了一套API,用於訪問和管理密碼學令牌,例如智慧卡和硬體安全模組(HSM)。PKCS#11 API允許應用程式執行加密、解密、簽名、金鑰生成等操作,而這些操作都在安全的密碼學令牌上進行。這個標準由RSA安全(現在屬於戴爾科技)開發,並被廣泛用於安全相關應用程式和系統中
GMT 0016-2012
規定了基於PKI密碼體制的智慧密碼鑰匙密碼應用介面,描述了密碼應用介面的函式、資料型別、引數的定義和裝置的安全要求
GMT 0018-2012
規定了公鑰密碼基礎設施應用技術體系下服務類密碼裝置的應用介面標準
1 總結這些API在程式設計中的使用方式
Crypto API
CryptoAPI函式使用“加密服務提供者”(CSP)完成資料加密、解密以及金鑰的儲存管理、所有的CSP都是相互獨立的模組。理論上,CSP應該獨立於特定的應用程式,也就是說所有的應用程式可以使用任何一個CSP。但是,實際上有些應用程式只能與特定的CSP協作。CSP與應用程式之間的關係類似於Windows GDI模型。CSP就類似於圖形硬體驅動程式。
PKCS#11
KCS#11是公鑰加密標準(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA實驗室(RSA Laboratories)釋出,它為加密令牌定義了一組平臺無關的API ,如硬體安全模組和智慧卡。 PKCS#11稱為Cyptoki,定義了一套獨立於技術的程式設計介面,USBKey安全應用需要實現的介面。 由於沒有一個真正的標準加密令牌,這個API已經發展成為一個通用的加密令牌的抽象層。 PKCS#11 API定義最常用的加密物件型別( RSA金鑰,X.509證書,DES /三重DES金鑰等)和所有需要使用的功能,建立/生成,修改和刪除這些物件。注意:pkcs#11只提供了介面的定義, 不包括介面的實現,一般介面的實現是由裝置提供商提供的,如usbkey的生產廠商會提供 符合PKCS#11介面標準的API的實現。這樣你只要透過介面呼叫API函式即可實現其功能
GMT 0016-2012
呼叫標頭檔案以及介面進行使用
GMT 0018-2012
密碼行業標準列表
2 列出這些API包含的函式,進行分類,並總結它們的異同
Crypto API
- 基本加密函式
服務提供者函式:
金鑰的產生和交換函式:
編碼/解碼函式:
資料加密/解密函式:
雜湊和數字簽名函式:
證書和證書庫函式
證書庫函式:
維護函式:
證書函式:
證書撤銷列表函式:
證書信任列表函式:
擴充套件屬性函式:
證書驗證函式
使用CTL 的函式:
證書鏈驗證函式:
訊息函式
低階訊息函式:
簡化訊息函式:
輔助函式
資料管理函式:
資料轉換函式:
增強金鑰用法函式:
金鑰標示函式:
證書庫回撥函式:
OID 支援函式:
遠端物件恢復函式:
PFX 函式:
PKCS#11
通用介面:
加密解密:
簽名和訊息鑑別:
GMT 0016-2012
裝置管理函式:
訪問控制函式:
應用管理函式:
檔案管理函式:
容器管理函式:
密碼服務函式:
GMT 0018-2012
裝置管理類函式:
- 開啟裝置:SDF_OpenDevice
- 關閉裝置:SDF_CloseDevice
- 建立會話:SDF_OpenSession
- 關閉會話:SDF_CloseSession
- 獲取裝置資訊:SDF_GetDeviceInfo
- 產生隨機數:SDF_GenerateRandom
- 獲取私鑰使用許可權:SDF_GetPrivateKeyAccessRight
- 釋放私鑰使用許可權:SDF_ReleasePrivateKeyAccessRight
金鑰管理類函式 - 匯出RSA簽名公鑰:SDF_ExportSignPublicKey_RSA
- 匯出RSA加密公鑰:SDF_ExportEncPublicKey_RSA
- 產生RSA非對稱金鑰對並輸出:SDF_GenerateKeyPair_RSA
- 生成會話金鑰並用內部RSA公鑰加密輸出:SDF_GenerateKeyWithIPK_RSA
- 生成會話金鑰並用外部RSA公鑰加密輸出:SDF_GenerateKeyWithEPK_RSA
- 匯入會話金鑰並用內部RSA私鑰解密:SDF_ImportKeyWithISK_RSA
- 基於RSA演算法的數字信封轉換:SDF_ExchangeDigitEnvelopeBaseOnRSA
- 匯出ECC簽名公鑰:SDF_ExportSignPublicKey_ECC
- 匯出ECC加密公鑰:SDF_ExportEncPublicKey_ECC
- 產生ECC非對稱金鑰對並輸出:SDF_GenerateKeyPair_ECC
- 生成會話金鑰並用內部ECC公鑰加密輸出:SDF_GenerateKeyWithIPK_ECC
- 生成會話金鑰並用外部ECC公鑰加密輸出:SDF_GenerateKeyWithEPK_ECC
- 匯入會話金鑰並用內部ECC私鑰解密:SDF_ImportKeyWithISK_ECC
- 生成金鑰協商引數並輸出:SDF_GenerateAgreementDataWithECC
- 計算會話金鑰:SDF_GenerateKeyWithECC
- 產生協商資料並計算會話金鑰:SDF_GenerateAgreementDataAndKeyWithECC
- 基於ECC演算法的數字信封轉換:SDF_ExchangeDigitEnvelopeBaseOnECC
- 生成會話金鑰並用金鑰加密金鑰加密輸出:SDF_GenerateKeyWithKEK
- 匯入會話金鑰並用金鑰加密金鑰解密:SDF_ImportKeyWithKEK
- 銷燬會話金鑰:SDF_DestroyKey
非對稱演算法運算類函式: - 外部公鑰RSA運算:SDF_ExternalPublicKeyOperation_RSA
- 內部公鑰RSA運算:SDF_InternalPublicKeyOperation_RSA
- 內部私鑰RSA運算:SDF_InternalPrivateKeyOperation_RSA
- 外部金鑰ECC驗證:SDF_ExternalVerify_ECC
- 內部金鑰ECC簽名:SDF_InternalSign_ECC
- 內部金鑰ECC驗證:SDF_InternalVerify_ECC
- 外部金鑰ECC加密:SDF_ExternalEncrypt_ECC
對稱演算法運算類函式: - 對稱加密:SDF_Encrypt
- 對稱解密:SDF_Decrypt
- 計算MAC:SDF_CalculateMAC
使用者檔案操作類函式 - 建立檔案:SDF_CreateFile
- 讀取檔案:SDF_ReadFile
- 寫檔案:SDF_WriteFile
- 刪除檔案:SDF_DeleteFile
3 以龍脈GM3000Key為例,寫出呼叫不同介面的程式碼(Crypto API,PKCS#11,SKF介面),把執行截圖加入部落格,並提供程式碼連結
- SKF介面
- API介面
- PKCS#11
DES:
DES3:
RC2:
RC4:
RSA:
AES:
- getusbinfos.sln