加密研究
API使用方式總結
1 微軟的Crypto API
1.1CryptoAPI系統架構由五個主要功能區域組成:
- 基本密碼功能
- 證書編碼/解碼功能
- 證書儲存功能
- 簡化的訊息功能
- 低階訊息功能
1.2基本密碼功能
- 用於連線到CSP的上下文功能。這些功能使應用程式可以按名稱選擇特定的CSP或選擇可以提供所需功能類別的特定CSP。
- 金鑰生成功能,用於生成和儲存加密金鑰。包括對更改連結模式,初始化向量和其他加密功能的全面支援。有關更多資訊,請參見金鑰生成和交換功能。
- 金鑰交換功能,用於交換或傳輸金鑰。有關更多資訊,請參見加密金鑰儲存和交換以及金鑰生成和交換功能。
1.3證書編碼/解碼功能
- 用於加密或解密資料的功能。還包括對雜湊資料的支援。有關更多資訊,請參見資料加密和解密功能和資料加密和解密。
1.4證書儲存功能
- 用於管理數字證書收集的功能。有關更多資訊,請參見數字證書和證書儲存功能。
1.5簡化的訊息功能
- 用於加密和解密訊息和資料的功能。
- 用於簽名訊息和資料的功能。
- 用於驗證接收到的訊息和相關資料上簽名真實性的功能。
1.6低階訊息功能
- 用於執行由簡化訊息功能執行的所有任務的功能。與簡化的訊息功能相比,低階訊息功能提供了更大的靈活性,但需要更多的函式呼叫。有關更多資訊,請參見低階訊息和低階訊息功能。
2 RAS公司的PKCS#11標準
PKCS#11(簡稱P11)就是針對密碼裝置的介面指令標準。P11模型中重要的概念之一是slot,也稱為槽。一個slot為一個密碼裝置物件。某個開啟的slot會話稱之為session。Session之間存在不同的驗證許可權。而同一個slot的不同的session之間存在操作的互相影響性,同時在某些狀況下,許可權會發生同步。另外一個重要的概念是物件。P11中支援幾種重要的物件,如公鑰、私鑰、對稱金鑰,資料物件等。
CSP介面標準:CSP介面標準為微軟所頒發,在windows作業系統上通行。CSP中重要的概念是容器(container)。一個容器中具有一對公私鑰。而證書卻是這一對金鑰的附加屬性了。
3 中國商用密碼標準:GMT 0016-2012 智慧密碼鑰匙密碼應用介面規範,GMT 0018-2012密碼裝置應用介面規範
GMT 0016-2012 智慧密碼鑰匙密碼應用介面規範:
- 本標準規定了基於PKI密碼體制的智慧密碼鑰匙密碼應用介面,描述了密碼應用介面的函式、資料型別、引數的定義和裝置的安全要求。本標準適用於智慧密碼鑰匙產品的研製、使用和檢測。
GMT 0018-2012密碼裝置應用介面規範:
- 本標準規定了公鑰密碼基礎設施應用技術體系下服務類密碼裝置的應用介面標準。本標準適用於服務類密碼裝置的研製、使用,以及基於該類密碼裝置的應用開發,也可用於指導該類密碼裝置的檢測。
對API函式分類,並總結異同
微軟的API
服務提供者函式
應用程式使用服務提供者函式來連線和斷開一個CSP。
- 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安裝的卻省上下文
金鑰的產生和交換函式
金鑰產生函式建立、配置和銷燬加密金鑰。他們也用於和其他使用者進行交換金鑰。下面就是主要的一些函式:
- 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結構進行編碼,此函式支援記憶體分配選項
資料加密/解密函式
這些函式支援資料的加密/解密操作。
-
CryptEncrypt 和CryptDecrypt 要求在被呼叫前指定一個金鑰。
-
注:這個金鑰可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 產生。建立金鑰時要指定加密演算法。
-
CryptSetKeyParam函式可以指定額外的加密引數。
-
CryptDecrypt使用指定加密金鑰來解密一段密文
-
CryptEncrypt使用指定加密金鑰來加密一段明文
-
CryptProtectData執行對DATA_BLOB結構的加密
-
CryptUnprotectData執行對DATA_BLOB結構的完整性驗證和解密
雜湊和數字簽名函式
這些函式在應用程式中完成計算雜湊、建立和校驗數字簽名。
- CryptCreateHash建立一個空雜湊物件
- CryptDestoryHash銷燬一個雜湊物件
- CryptDuplicateHash複製一個雜湊物件
- CryptGetHashParam得到一個雜湊物件引數
- CryptHashData對一塊資料進行雜湊,把它加到指定的雜湊物件中
- CryptHashSessionKey對一個會話金鑰進行雜湊,把它加到指定的雜湊物件中
- CryptSetHashParam設定一個雜湊物件的引數
- CryptSignHash對一個雜湊物件進行簽名
- CryptVerifySignature校驗一個數字簽名
RAS公司的PKCS#11標準
CSP總共有23個函式介面。簡介如下:
CSP連線函式:
- CPAcquireContext:為應用程式建立一個上下文
- CPGetProvParam:返回CSP相關的資訊
- CPReleaseContext:釋放CPAcquireContext建立的上下文
- CPSetProvParam :設定CSP的引數操作
CSP金鑰生成和交換函式
- CPDeriveKey:從一個數據雜湊中生成一個會話金鑰,它保證生成的金鑰 互不相同
- CPDestroyKey:釋放一個金鑰控制代碼,釋放後,控制代碼將無效,金鑰將無法再被訪問
- CPExportKey:從CSP容器中匯出金鑰
- CPGenKey:用來生成金鑰或金鑰對
- CPGenRandom:使用隨機數填充一個緩衝
- CPGetKeyParam:用來得到加密操作金鑰的屬性
- CPGetUserKey:用來獲取CSP容器中的持久金鑰對
- CPImportKey:從一個blob中匯入金鑰到CSP容器中
- CPSetKeyParam:設定金鑰的屬性
CSP加解密函式:
- CPDecrypt:用來解密先前被加密的資料
- CPEncrypt:用來加密明文
- CSP雜湊和數字簽名函式:
- CPCreateHash:初始化並雜湊輸入資料
- CPDestroyHash:刪除一個雜湊物件控制代碼
- CPDuplicateHash:建立一個雜湊物件的拷貝
- CPGetHashParam:獲取雜湊物件的計算結果
- CPHashData:雜湊輸入的資料
- CPSetHashParam:定製一個雜湊物件的屬性
- CPSignHash:簽名一個雜湊物件
- CPVerifySignature:校驗一個數字簽名
GMT 0016-2012
裝置管理系列函式:
- SKF_WaitForDevEvent:等待裝置插拔事件
- SKF_ CancelWaitForDevEvent:取消等待裝置插拔事件
- SKF_ EnumDev :列舉裝置
- SKF_ ConnectDev:連線裝置
- SKF_ DisconnectDev :斷開連線
- SKF_ GetDevState:獲取裝置狀態
- SKF_ SetLabel:設定裝置標籤
- SKF_ GetDevInfo:獲取裝置資訊
- SKF_ LockDev:鎖定裝置
- SKF_ UnlockDev:解鎖裝置
- SKF_Transmit:裝置命令傳輸
訪問控制系列函式:
- SKF_ ChangeDevAuthKey:修改裝置認證金鑰
- SKF_DevAuth:裝置認證
- SKF_ ChangePIN:修改PIN
- SKF_ GetPINInfo:獲得PIN碼資訊
- SKF_ VerifyPIN:校驗PIN
- SKF_ UnblockPIN:解鎖PIN
- SKF_ ClearSecueState:清除應用安全狀態
應用管理系列函式:
- SKF_ CreateApplication:建立應用
- SKF_ EnumApplication:列舉應用
- SKF_ DeleteApplication:刪除應用
- SKF_ OpenApplication:開啟應用
- SKF_ CloseApplication:關閉應用
檔案管理系列函式:
- SKF_ CreateFile:建立檔案
- SKF_ DeleteFile :刪除檔案
- SKF_ EnumFiles:列舉檔案
- SKF_ GetFileInfo:獲取檔案資訊
- SKF_ ReadFile:讀檔案
- SKF_ WriteFile :寫檔案
容器管理系列函式:
- SKF_CreateContainer:建立容器
- SKF_ DeleteContainer:刪除容器
- SKF_ EnumContainer:列舉容器
- SKF_ OpenContainer:開啟容器
- SKF_ CloseContainer:關閉容器
- SKF_ GetContainerType:獲得容器型別
- SKF_ ImportCertificate:導人數字證書
- SKF_ ExportCertificate:匯出數字證書
密碼服務系列函式:
- SKF_ GenRandom :生成隨機數
- SKF_ GenExtRSAKey:生成外部RSA金鑰對
- SKF_ GenRSAKeyPair:生成RSA簽名金鑰對
- SKF_ ImportRSAKeyPair:導人RSA加密金鑰對
- SKF_ RSASignDataRSA:簽名
- SKF_ RSAVerify:RSA驗籤
- SKF_ RSAExportSessionKey:RSA生成並匯出會話金鑰
- SKF_ ExtRSAPubKeyOperation:RSA外來公鑰運算
- SKF_ ExtRSAPriKeyOperation:RSA外來私鑰運算
- SKF_ GenECCKeyPair:生成ECC簽名金鑰對
- SKF_ ImportECCKeyPair:匯入ECC加密金鑰對
- SKF_ ECCSignData :ECC簽名
- SKF_ ECCVerify:ECC驗籤
- SKF_ ECCExportSessionKey:ECC生成並匯出會話金鑰
- SKF_ExtECCEncrypt:ECC外來公鑰加密.
- SKF_ ExtECCDecrypt:ECC外來私鑰解密.
- SKF_ ExtECCSign:ECC外來私鑰簽名.
- SKF_ ExtECCVerify :ECC外來公鑰驗籤.
- SKF_ GenerateAgreementDataWithECC:ECC生成金鑰協商引數並輸出
- SKF_ GenerateKeyWithECC:ECC計算會話金鑰.
- SKF_ GenerateAgreementDataAndKeyWithECC:ECC產生協商資料並計算會話金鑰
- SKF_ExportPablicKey:匯出公鑰
- SKF_ImportSessionKey:匯入會話金鑰
- SKF_ SetSymmKey:明文導人會話金鑰
- SKF_ EncrypInit:加密初始化
- SKF_ Encrypt:單組資料加密
- SKF_ EncryptUpdate:多組資料加密
- SKF_ EncryptFinal:結束加密
- SKF_ Digestlnit:密碼雜湊初始化
- SKF_Digest:單組資料密碼雜湊
- SKF_ DigestUpdate:多組資料密碼雜湊
- SKP_ DigestFinal:結束密碼雜湊
- SKF_ MacInit:訊息鑑別碼運算初始化
- SKF_ Mac:單組資料訊息鑑別碼運算
- SKF_ MacUpdate:多組資料訊息鑑別碼運算
- SKF_ MacFinal:結束訊息鑑別碼運算
- SKF_ CloseHandle:關閉密碼物件控制代碼
GMT 0018-2012
裝置管理:
- 開啟裝置:SDEOpenDerice
- 關閉裝置:SDF_ Cias eDevice
- 建立會話:SDF_ OpenSesion
- 關閉會話: SDF _CloseSession
- 獲取裝置資訊:SDF _GetDeviceInfo
- 產生隨機數:SDF_enerateRandom
- 獲取私鑰使用許可權: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_ nternalSign_ ECC
- 內部金鑰ECC驗證:SDF_ InternalVerify_ ECC
- 外部金鑰ECC加密:SDF_ ExternalEncrypt_ECC
對稱演算法運算類函式
- 對稱加密:SDF_Encrypt
- 對稱解密:SDF_Decrypt
- 計算MAC:SDF_CalculateMAC
雜湊運算類函式
- 雜湊運算初始化:SDF_HashInit
- 多包雜湊運算:SDF_HashUpdate
- 雜湊運算結束:SDF_HashFinal
使用者檔案操作類函式:
- 建立檔案:SDF_CreatFile
- 讀取檔案:SDF_ReadFile
- 寫檔案:SDF_WriteFile
- 刪除檔案:SDF_DeleteFile
總結異同
- 這三類標準中都包含加解密的函式,並且自成體系。
- 具體函式名稱有些許不同,但大同小異。
- 還有GM涉及到了裝置的管理,所以有裝置管理介面還有訪問控制函式。
寫出呼叫不同介面的程式碼
加密檔案 encfile:
初始化向量:
簽名驗籤:
列舉當前計算機支援的CSP型別以及所有CSP名稱,獲得預設的CSP名稱並讀取其相關引數屬性:
Provider: