1. 程式人生 > 其它 >加密API研究

加密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

非對稱演算法運算類函式