加密API研究
Crypto API
CryptoAPI概述
Windows Crypto API是Microsoft 公司提出的安全加密應用服務框架,也是PKI推薦使用的加密 API。它提供了在Win32 環境下使用認證、編碼、加密和簽名等安全服務時的標準加密介面,用於增強應用程式的安全性與可控性。應用開發者可以在不瞭解複雜的加密機制和加密演算法的情況下,簡便、快速地開發出標準、通用和易於擴充套件的安全加密應用程式。Crypto API 提供的功能主要有:金鑰管理、資料加密和解密、數字簽名和驗證、證書管理、可信根證書管理、資料編碼和解碼、數字證書編碼和解碼、PKCS#7標準格式編碼和解碼等。
Crypto API使用方式
CryptoAPI本身不實現密碼運算相關操作,而是作業系統通過呼叫CryptoSPI函式介面相應的加密服務提供者函式(CSP)來實現。CryptoAPI函式使用“加密服務提供者”(CSP)完成資料加密、解密以及金鑰的儲存管理、所有的CSP都是相互獨立的模組。理論上,CSP應該獨立於特定的應用程式,也就是說所有的應用程式可以使用任何一個CSP。但是,實際上有些應用程式只能與特定的CSP協作。CSP與應用程式之間的關係類似於Windows GDI模型。CSP就類似於圖形硬體驅動程式。
Crypto API包含的函式
CryptoAPI體系主要由一下幾部分組成:基本加密函式、證書編碼與解碼函式、證書儲存函式、簡化資訊處理函式、底層資訊處理函式。
基本加密函式包含了以下幾種:服務提供者函式、金鑰的產生和交換函式、編碼/解碼函式、資料加密/解密函式和雜湊和數字簽名函式。
證書和證書庫函式管理、使用和取得證書、證書撤銷列表和證書信任列表。
金鑰的產生和交換函式:
CryptAcquireCertificatePrivateKey | 對於指定證書上下文得到一個HCRYPTPROV 控制代碼和dwKeySpec |
---|---|
CryptDeriveKey | 從一個密碼中派生一個金鑰 |
CryptDestoryKey | 銷燬金鑰 |
CryptDuplicateKey | 製作一個金鑰和金鑰狀態的精確複製 |
CryptExportKey | 把CSP 的金鑰做成BLOB 傳送到應用程式的記憶體空間中 |
CryptGenKey | 建立一個隨機金鑰 |
CryptGenRandom | 產生一個隨機數 |
CryptGetKeyParam | 得到金鑰的引數 |
CryptGetUserKey | 得到一個金鑰交換或簽名金鑰的控制代碼 |
CryptImportKey | 把一個金鑰BLOB 傳送到CSP中 |
CryptSetKeyParam | 指定一個金鑰的引數 |
編碼/解碼函式:
CryptDecodeObject | 對lpszStructType 結構進行解碼 |
---|---|
CryptDecodeObjectEx | 對lpszStructType 結構進行解碼,此函式支援記憶體分配選項 |
CryptEncodeObject | 對lpszStructType 結構進行編碼 |
CyptEncodeObjectEx | 對lpszStructType 結構進行編碼,此函式支援記憶體分配選項 |
資料加密/解密函式:
CryptDecrypt | 使用指定加密金鑰來解密一段密文 |
---|---|
CryptEncrypt | 使用指定加密金鑰來加密一段明文 |
CryptProtectData | 執行對DATA_BLOB 結構的加密 |
CryptUnprotectData | 執行對DATA_BLOB 結構的完整性驗證和解密 |
雜湊和數字簽名函式:
CryptCreateHash | 建立一個空雜湊物件 |
---|---|
CryptDestoryHash | 銷燬一個雜湊物件 |
CryptDuplicateHash | 複製一個雜湊物件 |
CryptGetHashParam | 得到一個雜湊物件引數 |
CryptHashData | 對一塊資料進行雜湊,把它加到指定的雜湊物件中 |
CryptHashSessionKey | 對一個會話金鑰進行雜湊,把它加到指定的雜湊物件中 |
CryptSetHashParam | 設定一個雜湊物件的引數 |
CryptSignHash | 對一個雜湊物件進行簽名 |
CryptVerifySignature | 校驗一個數字簽名 |
PKCS #11
PKCS #11概述
PKCS#11是公鑰加密標準Public-Key Cryptography Standards中的一份子,由RSA實驗室釋出。PKCS#11標準定義了與密碼令牌的獨立於平臺的API,API本身命名為Cryptoki,這個API已經發展成為一個通用的加密令牌的抽象層。PKCS#11主要是應用於智慧卡和HSM。
PKCS #11使用方式
PKCS#11稱為Cyptoki,定義了一套獨立於技術的程式設計介面,USBKey安全應用需要實現的介面。 由於沒有一個真正的標準加密令牌,這個API已經發展成為一個通用的加密令牌的抽象層。 PKCS #11 API定義最常用的加密物件型別( RSA金鑰,X.509證書,DES /三重DES金鑰等)和所有需要使用的功能,建立/生成,修改和刪除這些物件。注意:pkcs#11只提供了介面的定義, 不包括介面的實現,一般介面的實現是由裝置提供商提供的,如usbkey的生產廠商會提供 符合PKCS#11介面標準的API的實現。這樣你只要通過介面呼叫API函式即可實現其功能。
PKCS #11 函式類別以及相關函式:
-
通用:C_Initialize()、C_Finalize()、C_GetInfo() 和 C_GetFunctionList()
-
會話管理:C_OpenSession()、C_CloseSession()、C_GetSessionInfo()、C_CloseAllSessions()、C_Login() 和 C_Logout()
-
插槽和令牌管理:C_GetSlotList()、C_GetSlotInfo()、C_GetMechanismList()、C_GetMechanismInfo() 和 C_SetPIN()
-
加密和解密:C_EncryptInit()、C_Encrypt()、C_EncryptUpdate()、C_EncryptFinal()、C_DecryptInit()、C_Decrypt()、_DecryptUpdate() 和 C_DecryptFinal()
-
訊息摘要:C_DigestInit()、C_Digest()、C_DigestKey()、C_DigestUpdate() 和 C_DigestFinal()
-
MAC 的簽名和應用:C_Sign()、C_SignInit()、C_SignUpdate()、C_SignFinal()、C_SignRecoverInit() 和 C_SignRecover()
-
簽名驗證:C_Verify()、C_VerifyInit()、C_VerifyUpdate()、C_VerifyFinal()、C_VerifyRecoverInit() 和 C_VerifyRecover()
-
雙重用途加密函式:C_DigestEncryptUpdate()、C_DecryptDigestUpdate()、C_SignEncryptUpdate() 和 C_DecryptVerifyUpdate()
-
隨機數生成:C_SeedRandom() 和 C_GenerateRandom()
-
物件管理:C_CreateObject()、C_DestroyObject()、C_CopyObject()、C_FindObjects()、C_FindObjectsInit()、C_FindObjectsFinal()、C_GetAttributeValue() 和 C_SetAttributeValue()
-
金鑰管理:C_GenerateKey()、C_GenerateKeyPair() 和 C_DeriveKey()
GMT 0016-2012
GMT 0016-2012 概述
規定了公鑰密碼基礎設施應用技術體系下服務類密碼裝置的應用介面標準。
適用於服務類密碼裝置的研製、使用,以及基於該類密碼裝置的應用開發,也可用於指導該類密碼裝置的檢測。
GMT 0016-2012使用方式
呼叫標頭檔案以及介面進行使用
GMT 0016-2012包含的函式
裝置管理類函式
SDF_OpenDevice | 開啟裝置 |
---|---|
SDF_CloseDevice | 關閉裝置 |
SDF_OpenSession | 建立會話 |
SDF_CloseSession | 關閉會話 |
SDF_GetDeviceInfo | 獲取裝置資訊 |
SDF_GenerateRandom | 產生隨機數 |
SDF_GetPrivateKeyAccessRight | 獲取私鑰使用許可權 |
SDF_ReleasePrivateKeyAccessRight | 釋放私鑰獲取許可權 |
金鑰管理類函式
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_ExchangeDigitEnvelopeIaseOnRSAH | 基於RSA演算法的數字信封轉換 |
SDF_ExportSignPublicKey_ECC | 匯出ECC簽名公鑰 |
SDF_ExportEncPublicKey_ECC | 匯出ECC加密公鑰 |
SDF_GenerateKeyPair_ECC | 產生ECC非對稱金鑰對並輸出 |
SDF_GenerateKeyWithIPK_ECC | 生成會話金鑰並用內部ECC公鑰加密輸出 |
SDF_GenerateKeyWithEPK_ECC | 生成會話金鑰並用外部ECC公鑰加密輸出 |
SDF_ImportKeyWithISKECC | 匯入會話金鑰並用內部 ECC私鑰解密 |
SDF_GenerateAgreementDataWithECC | 生成金鑰協商引數並輸出 |
SDF_GenerateKeyWihECC | 計算會話金鑰 |
SDF_GenerateAgreermentDataAndKeyWithECC | 產生協商資料並計算會話金鑰 |
SDF_ExchangeDigitEnvelopeBaseOnECC | 基於ECC演算法的數字信封轉換 |
SDF_GenerateKeyWithKEK | 生成會話金鑰並用金鑰加密金鑰加密輸出 |
SDF_ImportKeyWithKEK | SDF_GenerateKey WitlKEK匯入會話金鑰並用金鑰加密金鑰解密 |
SDF_DestroyKey | 銷燬會話金鑰 |
非對稱演算法運算類函式
SDF_ExternalPublicKeyOperation_RSA | 外部公鑰RSA運算 |
---|---|
SDF_InternalPublicKeyOperation_RSA | 內部公鑰RSA運算 |
SDF_InternalPrivateKeyOperation_RSA | 內部私鑰RSA運算 |
SDF_ExternalVerify_ECC | 外部金鑰ECC驗證 |
SDF_InternalSign_ECC | 內部金鑰ECC簽名 |
SDF_InternalVerify_ECC | 內部金鑰ECC驗證 |
SDFExternalEncrypt_ECC | 外部金鑰EC加密 |
對稱演算法運算類函式
SDF_ Encrypt | 對稱加密 |
---|---|
SDF_Dccrypt | 對稱解密 |
SDF_CalculateMAC | 計算MAC |
雜湊運算類函式
SDF HashInit | 雜湊運算初始化 |
---|---|
SDF HashUpdate | 多包雜湊運算 |
SDF_HashFinal | 雜湊運算結束 |
使用者檔案操作類函式
SDF_CreateFile | 建立檔案 |
---|---|
SDF_ReadFile | 讀取檔案 |
SDF_WriteFile | 寫檔案 |
SDF_DeleteFile | 刪除檔案 |
GMT 0018-2012
GMT 0018-2012概述
GMT 0018-2012標準規定了公鑰密碼基礎設施應用技術體系下服務類密碼裝置的應用介面標準。適用於服務類密碼裝置的研製、使用,以及基於該類密碼裝置的應用開發,也可用於指導該類密碼裝置的檢測。
規範性引用檔案
下列檔案對於本檔案的應用是必不可少的。凡是注日期的引用檔案,僅注日期的版本適用於本檔案;凡是不注日期的引用檔案,其最新版本(包括所有的修改單)適用於本檔案;GM/T 0006密碼應用標識規範;GM/T AAAA SM2密碼演算法使用規範。
其中還包括了對部分術語的規定:
演算法標識algorithm identifier | 用於對密碼演算法進行唯一標識的符號。 |
---|---|
非對稱密碼演算法/公鑰密碼演算法asymmetric cryptographic algorithm/public key cryptograplrithmts | 加解密使用不同金鑰的密碼演算法。 |
解密decipherment/decryption | 加密過程對應的逆過程。 |
裝置金鑰device key pair | 儲存在裝置內部的用於裝置管理的非對稱金鑰對,包含簽名金鑰對和加密金鑰對。 |
加密encipherment/encryption | 對資料進行密碼變換以產生密文的過程。 |
金鑰加密金鑰key encryption key ;KEK | 對金鑰進行加密保護的金鑰。 |
公鑰基礎設施public key infrastructure;PKI | 用公鑰密碼技術建立的普遍適用的基礎設施,為使用者提供證書管理和金鑰管理等安全服務。 |
私鑰訪問控制碼private key access password | 用於驗證私鑰使用許可權的口令字。 |
對稱密碼技術/對稱密碼體制symmetric cryptographic technique | 原發者和接收者均採用同一祕密金鑰進行變換的密碼技術(體制)。其中,加密金鑰與解密金鑰相同,或者一個金鑰可以從另一個金鑰匯出的密碼體制。 |
會話金鑰session key | 處於層次化金鑰結構中的最低層,僅在一次會話中使用的金鑰。 |
使用者金鑰user key | 儲存在裝置內部的用於應用密碼運算的非對稱金鑰,包含簽名金鑰對和加密金鑰對。 |
GMT 0018-2012使用方式
在公鑰密碼基礎設施應用技術體系框架中,密碼裝置服務層由密碼機,密碼卡,智慧密碼終端等裝置組成,通過本標準規定的密碼裝置應用介面向通用密碼服務層提供基礎密碼服務。基礎密碼服務包括金鑰生成、單一的密碼運算、檔案管理等的服務。
GMT 0018-2012 函式
裝置管理類函式
裝置管理類函式包括以下具體函式:
A.開啟裝置:SDF_OpenDevice
B.關閉裝置:SDF_CloseDevice
C.建立會話:SDF_OpenSession
D.關閉會話:SDF_CloseSession
E.獲取裝置資訊:SDF_GetDeviceInfo
F.產生隨機數:SDF_GenerateRandom
G.獲取私鑰使用許可權:SDF_GetPrivateKeyAccessRight
H.釋放私鑰使用許可權: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_GenerateKeyWiuhECC
- 產生協商資料並計算會話金鑰∶SDF_GenerateAgreementDataAndKeyWithECC
- 基於 ECC演算法的數字信封轉換∶SDF_ExchangeDigitEnvelopeBaseOnECC
- 生成會話金鑰並用金鑰加密金鑰加密輸出∶SDF_GenerateKeyWithKEK
- 匯入會話金鑰並用金鑰加密金鑰解密∶SDF_ImportKeyWithKEK
- 銷燬會話金鑰∶SDF_DestroyKey