《信息安全系統設計與實現下》EXP1-密碼引擎-加密API研究


密碼引擎API的主要標准和規范:

1.總結這些API在編程中的使用方式:

1.1微軟的Crypto API

1.1.1CryptoAPI系統架構由五個主要功能區域組成:

  • 基本密碼功能
  • 證書編碼/解碼功能
  • 證書存儲功能
  • 簡化的消息功能
  • 低級消息功能

1.1.2基本密碼功能

  • 用於連接到CSP的上下文功能。這些功能使應用程序可以按名稱選擇特定的CSP或選擇可以提供所需功能類別的特定CSP。
  • 密鑰生成功能,用於生成和存儲加密密鑰。包括對更改鏈接模式,初始化向量和其他加密功能的全面支持。有關更多信息,請參見密鑰生成和交換功能。
  • 密鑰交換功能,用於交換或傳輸密鑰。有關更多信息,請參見加密密鑰存儲和交換以及密鑰生成和交換功能。

1.1.3證書編碼/解碼功能

  • 用於加密或解密數據的功能。還包括對哈希數據的支持。有關更多信息,請參見數據加密和解密功能和數據加密和解密。

1.1.4證書存儲功能

  • 用於管理數字證書收集的功能。有關更多信息,請參見數字證書和證書存儲功能。

1.1.5簡化的消息功能

  • 用於加密和解密消息和數據的功能。
  • 用於簽名消息和數據的功能。
  • 用於驗證接收到的消息和相關數據上簽名真實性的功能。

1.1.6低級消息功能

  • 用於執行由簡化消息功能執行的所有任務的功能。與簡化的消息功能相比,低級消息功能提供了更大的靈活性,但需要更多的函數調用。有關更多信息,請參見低級消息和低級消息功能。

image-20210412093302813

1.2 RAS公司的PKCS#11標准:

  • PKCS#11(簡稱P11)就是針對密碼設備的接口指令標准。P11模型中重要的概念之一是slot,也稱為槽。一個slot為一個密碼設備對象。某個打開的slot會話稱之為session。Session之間存在不同的驗證權限。而同一個slot的不同的session之間存在操作的互相影響性,同時在某些狀況下,權限會發生同步。另外一個重要的概念是對象。P11中支持幾種重要的對象,如公鑰、私鑰、對稱密鑰,數據對象等。

  • CSP接口標准:CSP接口標准為微軟所頒發,在windows操作系統上通行。CSP中重要的概念是容器(container)。一個容器中具有一對公私鑰。而證書卻是這一對密鑰的附加屬性了。

1.3 中國商用密碼標准:GMT 0016-2012 智能密碼鑰匙密碼應用接口規范,GMT 0018-2012密碼設備應用接口規范:

  • GMT 0016-2012 智能密碼鑰匙密碼應用接口規范:

    • 本標准規定了基於PKI密碼體制的智能密碼鑰匙密碼應用接口,描述了密碼應用接口的函數、數據類型、參數的定義和設備的安全要求。本標准適用於智能密碼鑰匙產品的研制、使用和檢測。
  • GMT 0018-2012密碼設備應用接口規范:

    • 本標准規定了公鑰密碼基礎設施應用技術體系下服務類密碼設備的應用接口標准。本標准適用於服務類密碼設備的研制、使用,以及基於該類密碼設備的應用開發,也可用於指導該類密碼設備的檢測。

2.列出這些API包含的函數,進行分類,並總結它們的異同:

2.1 微軟的Crypto API:

2.1.1服務提供者函數

應用程序使用服務提供者函數來連接和斷開一個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安裝的卻省上下文

2.1.2密鑰的產生和交換函數

密鑰產生函數創建、配置和銷毀加密密鑰。他們也用於和其他用戶進行交換密鑰。下面就是主要的一些函數:

  • CryptAcquireCertificatePrivateKey對於指定證書上下文得到一個HCRYPTPROV句柄和dwKeySpec
  • CryptDeriveKey從一個密碼中派生一個密鑰
  • CryptDestoryKey銷毀密鑰
  • CryptDuplicateKey制作一個密鑰和密鑰狀態的精確復制
  • CryptExportKey把CSP的密鑰做成BLOB 傳送到應用程序的內存空間中
  • CryptGenKey創建一個隨機密鑰
  • CryptGenRandom產生一個隨機數
  • CryptGetKeyParam得到密鑰的參數
  • CryptGetUserKey得到一個密鑰交換或簽名密鑰的句柄
  • CryptImportKey把一個密鑰BLOB傳送到CSP 中
  • CryptSetKeyParam指定一個密鑰的參數

2.1.3編碼/解碼函數

有一些編碼/解碼函數,他們可以用來對證書、證書撤銷列表、證書請求和證書擴展進行編碼和解碼。

  • CryptDecodeObject對lpszStructType結構進行解碼
  • CryptDecodeObjectEx對lpszStructType結構進行解碼,此函數支持內存分配選項
  • CryptEncodeObject對lpszStructType結構進行編碼
  • CyptEncodeObjectEx對lpszStructType結構進行編碼,此函數支持內存分配選項

2.1.4數據加密/解密函數

這些函數支持數據的加密/解密操作。

  • CryptEncrypt 和CryptDecrypt 要求在被調用前指定一個密鑰。

    • 注:這個密鑰可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 產生。創建密鑰時要指定加密算法。
  • CryptSetKeyParam函數可以指定額外的加密參數。

  • CryptDecrypt使用指定加密密鑰來解密一段密文

  • CryptEncrypt使用指定加密密鑰來加密一段明文

  • CryptProtectData執行對DATA_BLOB結構的加密

  • CryptUnprotectData執行對DATA_BLOB結構的完整性驗證和解密

2.1.5哈希和數字簽名函數

這些函數在應用程序中完成計算哈希、創建和校驗數字簽名。

  • CryptCreateHash創建一個空哈希對象
  • CryptDestoryHash銷毀一個哈希對象
  • CryptDuplicateHash復制一個哈希對象
  • CryptGetHashParam得到一個哈希對象參數
  • CryptHashData對一塊數據進行哈希,把它加到指定的哈希對象中
  • CryptHashSessionKey對一個會話密鑰進行哈希,把它加到指定的哈希對象中
  • CryptSetHashParam設置一個哈希對象的參數
  • CryptSignHash對一個哈希對象進行簽名
  • CryptVerifySignature校驗一個數字簽名

2.2 RAS公司的PKCS#11標准:

CSP總共有23個函數接口。簡介如下:

2.2.1CSP連接函數:

  • CPAcquireContext:為應用程序創建一個上下文
  • CPGetProvParam:返回CSP相關的信息
  • CPReleaseContext:釋放CPAcquireContext創建的上下文
  • CPSetProvParam :設置CSP的參數操作

2.2.2 CSP密鑰生成和交換函數:

  • CPDeriveKey:從一個數據散列中生成一個會話密鑰,它保證生成的密鑰 互不相同
  • CPDestroyKey:釋放一個密鑰句柄,釋放后,句柄將無效,密鑰將無法再被訪問
  • CPExportKey:從CSP容器中導出密鑰
  • CPGenKey:用來生成密鑰或密鑰對
  • CPGenRandom:使用隨機數填充一個緩沖
  • CPGetKeyParam:用來得到加密操作密鑰的屬性
  • CPGetUserKey:用來獲取CSP容器中的持久密鑰對
  • CPImportKey:從一個blob中導入密鑰到CSP容器中
  • CPSetKeyParam:設置密鑰的屬性

2.2.3 CSP加解密函數:

  • CPDecrypt:用來解密先前被加密的數據
  • CPEncrypt:用來加密明文
  • CSP散列和數字簽名函數:
  • CPCreateHash:初始化並散列輸入數據
  • CPDestroyHash:刪除一個散列對象句柄
  • CPDuplicateHash:創建一個散列對象的拷貝
  • CPGetHashParam:獲取散列對象的計算結果
  • CPHashData:散列輸入的數據
  • CPSetHashParam:定制一個散列對象的屬性
  • CPSignHash:簽名一個散列對象
  • CPVerifySignature:校驗一個數字簽名

2.3 GMT 0016-2012

2.3.1 設備管理系列函數:

  • SKF_WaitForDevEvent:等待設備插拔事件
  • SKF_ CancelWaitForDevEvent:取消等待設備插拔事件
  • SKF_ EnumDev :枚舉設備
  • SKF_ ConnectDev:連接設備
  • SKF_ DisconnectDev :斷開連接
  • SKF_ GetDevState:獲取設備狀態
  • SKF_ SetLabel:設置設備標簽
  • SKF_ GetDevInfo:獲取設備信息
  • SKF_ LockDev:鎖定設備
  • SKF_ UnlockDev:解鎖設備
  • SKF_Transmit:設備命令傳輸

2.3.2 訪問控制系列函數:

  • SKF_ ChangeDevAuthKey:修改設備認證密鑰
  • SKF_DevAuth:設備認證
  • SKF_ ChangePIN:修改PIN
  • SKF_ GetPINInfo:獲得PIN碼信息
  • SKF_ VerifyPIN:校驗PIN
  • SKF_ UnblockPIN:解鎖PIN
  • SKF_ ClearSecueState:清除應用安全狀態

2.3.3 應用管理系列函數:

  • SKF_ CreateApplication:創建應用
  • SKF_ EnumApplication:枚舉應用
  • SKF_ DeleteApplication:刪除應用
  • SKF_ OpenApplication:打開應用
  • SKF_ CloseApplication:關閉應用

2.3.4 文件管理系列函數:

  • SKF_ CreateFile:創建文件
  • SKF_ DeleteFile :刪除文件
  • SKF_ EnumFiles:枚舉文件
  • SKF_ GetFileInfo:獲取文件信息
  • SKF_ ReadFile:讀文件
  • SKF_ WriteFile :寫文件

2.3.5 容器管理系列函數:

  • SKF_CreateContainer:創建容器
  • SKF_ DeleteContainer:刪除容器
  • SKF_ EnumContainer:枚舉容器
  • SKF_ OpenContainer:打開容器
  • SKF_ CloseContainer:關閉容器
  • SKF_ GetContainerType:獲得容器類型
  • SKF_ ImportCertificate:導人數字證書
  • SKF_ ExportCertificate:導出數字證書

2.3.6 密碼服務系列函數:

  • 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:關閉密碼對象句柄

2.4 GMT 0018-2012

2.4.1設備管理:

  • 打開設備:SDEOpenDerice
  • 關閉設備:SDF_ Cias eDevice
  • 創建會話:SDF_ OpenSesion
  • 關閉會話: SDF _CloseSession
  • 獲取設備信息:SDF _GetDeviceInfo
  • 產生隨機數:SDF_enerateRandom
  • 獲取私鑰使用權限:SDF _GetPrivateKeyAccessRight
  • 釋放私鑰使用權限:SDF_ReleasePrivateKeyAccessRight

2.4.2 密鑰管理:

  • 導出 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

2.4.3 非對稱算法運算類函數:

  • 外部公鑰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

2.4.4 對稱算法運算類函數

  • 對稱加密:SDF_Encrypt
  • 對稱解密:SDF_Decrypt
  • 計算MAC:SDF_CalculateMAC

2.4.5 雜湊運算類函數

  • 雜湊運算初始化:SDF_HashInit
  • 多包雜湊運算:SDF_HashUpdate
  • 雜湊運算結束:SDF_HashFinal

2.4.6 用戶文件操作類函數:

  • 創建文件:SDF_CreatFile
  • 讀取文件:SDF_ReadFile
  • 寫文件:SDF_WriteFile
  • 刪除文件:SDF_DeleteFile

2.5 總結異同:

  • 這三類標准中都包含加解密的函數,並且自成體系。
  • 具體函數名稱有些許不同,但大同小異。
  • 還有GM涉及到了設備的管理,所以有設備管理接口還有訪問控制函數。

3.以龍脈GM3000Key為例,寫出調用不同接口的代碼(Crypto API,PKCS#11,SKF接口)

3.1 運行截圖:

  • 加密文件:

encFile:
image

可以看到原文件test.txt加密為out.txt輸出。

  • 初始化向量:

KeyGen:
image

  • 簽名驗簽:
    Sign:
    image

  • 枚舉當前計算機支持的CSP類型以及所有CSP名稱,獲得默認的CSP名稱並讀取其相關參數屬性:
    Provider:
    image


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM