实验一-密码引擎-3-加密API

实验一-密码引擎-3-加密API研究

任务详情

密码引擎API的主要标准和规范包括:

  1. 微软的Crypto API
  2. RAS公司的PKCS#11标准
  3. 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等

研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。

内容:

0. 查找各种标准的原始文档,研究学习

  • 微软的Crypto API
    • CryptoAPI 系统体系结构
    • Web Crypto API
  • PKCS#11
    • PKCS#11标准文档
  • 中国商用密码标准
    • GMT 0016-2012 智能密码钥匙密码应用接口规范
    • GMT 0018-2012 密码设备应用接口规范

1. 总结这些API在编程中的使用方式

  • 微软的Crypto API:
    • 提供了一组函数用于在 Windows 平台上执行各种加密和安全操作,包括数据加密、数字签名、证书管理等。开发者可以使用这些函数来实现文件加密、数字签名、证书管理等功能,而不需要了解底层加密算法的细节。
  • PKCS#11:
    • 定义了一组平台无关的 API,用于与密码令牌(如硬件安全模块和智能卡)进行交互。提供了对加密对象(如RSA密钥、X.509证书、对称密钥等)的创建、使用、修改和删除的功能。
  • 中国商用密码标准:
    • GMT 0016-2012:规定了基于PKI密码体制的智能密码钥匙密码应用接口,包括函数、数据类型、参数定义等。
    • GMT 0018-2012:规定了服务类密码设备的应用接口标准,适用于密码设备的研制、使用和应用开发。

2. 列出这些API包含的函数,并进行分类

微软的Crypto API:

  • 加密函数:
    • CryptEncrypt, CryptDecrypt
  • 数字签名函数:
    • CryptSignMessage, CryptVerifyMessage
  • 证书管理函数:
    • CertCreateCertificateContext, CertFreeCertificateContext

PKCS#11:

  • 初始化函数:
    • C_Initialize, C_Finalize
  • 对象管理函数:
    • C_CreateObject, C_DestroyObject
  • 加密函数:
    • C_Encrypt, C_Decrypt

中国商用密码标准:

GMT 0016-2012:

  • 密钥管理函数:
    • InitKeyHandle, GenerateKey
  • 加密函数:
    • EncryptData, DecryptData

GMT 0018-2012:

  • 设备初始化函数:
    • DeviceInit, DeviceFinal
  • 对象管理函数:
    • CreateObject, DestroyObject

代码示例

Crypto API

// 主函数
void main(void)

// 加密文件
BOOL EncryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword)

// 解密文件
BOOL DecryptFile(PCHAR szSource, PCHAR szDestination, PCHAR szPassword)

// 签名文件
BOOL SignFile(PCHAR szSource, PCHAR szDestination)

// 验证签名
BOOL VerifyFile(PCHAR szSource, PCHAR szDestination)

// 错误处理
void HandleError(char *s)
加密文件
打开源文件: hSource = fopen(szSource,“rb”)
取得密钥容器(CSP)句柄: CryptAcquireContext(&hCryptProv,NULL,NULL,PROV_RSA_FULL,0)
创建会话密钥:
CryptCreateHash(hCryptProv,CALG_MD5, 0, 0, &hHash)
CryptHashData(hHash, (BYTE *)szPassword, strlen(szPassword), 0)
CryptDeriveKey(hCryptProv, ENCRYPT_ALGORITHM, hHash, KEYLENGTH, &hKey)
CryptDestroyHash(hHash)
加密数据文件:
CryptEncrypt(hKey, 0, feof(hSource), 0, pbBuffer, &dwCount, dwBufferLen)
清理工作:
free(pbBuffer)
CryptDestroyKey(hKey)
CryptDestroyHash(hHash)
CryptReleaseContext(hCryptProv, 0)
解密文件
打开加密文件(同上)
取得密钥容器(CSP)句柄(同上)
创建会话密钥(同上)
解密数据文件:
CryptDecrypt(hKey, 0, feof(hSource), 0, pbBuffer, &dwCount)
清理工作: (同上)
签名文件
打开源文件(同上)
取得密钥容器(CSP)句柄(同上)
取得签名用的密钥句柄(非对称RSA密钥)
CryptGetUserKey(hCryptProv, AT_SIGNATURE, &hKey)
导出签名用密钥对的公钥
CryptExportKey(hKey, NULL, PUBLICKEYBLOB, 0, pbKeyBlob, &dwBlobLen)
计算数据文件的Hash值
CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &hHash)
CryptHashData(hHash, pbBuffer, dwCount, 0)
对数据文件的Hash值进行签名
CryptSignHash(hHash, AT_SIGNATURE, NULL, 0, pbSignature, &dwSigLen)
清理工作: (同上)
验证签名
打开文件(同上)
取得密钥容器(CSP)句

(2)PKCS#11

根据机制标记,可以分为几类:

CKF_ENCRYPT:加密类
CKF_DECRYPT:解密类
CKF_DIGEST:摘要类
CKF_SIGN:签名类
CKF_SIGN_RECOVER:可恢复签名类
CKF_VERIFY:验证类
CKF_VERIFY_RECOVER:可恢复验证类
CKF_GENERATE:密钥产生
CKF_GENERATE_KEY_PAIR:密钥对产生
CKF_WRAP:密钥封装
CKF_UNWRAP:密钥解封
CKF_DERIVE:密钥派生

(3)GMT 0016-2012

(4)GMT 0018-2012

下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件,凡是不注日期的引用文件,其最新版本(包括所有的修单)适用于本文件,

- GM/T0006 密码应用标识规范
- GM/T0009 SM2密码算法使用规范


3. 以龙脉GM3000Key为例,写出调用不同接口的代码

# 使用微软的Crypto API
import win32crypt

def encrypt_data(data, key):
    encrypted_data = win32crypt.CryptEncrypt(data, key)
    return encrypted_data

def decrypt_data(data, key):
    decrypted_data = win32crypt.CryptDecrypt(data, key)
    return decrypted_data

# 使用PKCS#11
from pkcs11 import CryptoToken

def encrypt_data(data, token):
    encrypted_data = token.encrypt(data)
    return encrypted_data

def decrypt_data(data, token):
    decrypted_data = token.decrypt(data)
    return decrypted_data

# 使用GMT 0016-2012
from gmt0016 import SmartKey

def encrypt_data(data, key_handle):
    encrypted_data = SmartKey.encrypt_data(data, key_handle)
    return encrypted_data

def decrypt_data(data, key_handle):
    decrypted_data = SmartKey.decrypt_data(data, key_handle)
    return decrypted_data

# 使用GMT 0018-2012
from gmt0018 import ServiceKeyDevice

def encrypt_data(data, device_handle):
    encrypted_data = ServiceKeyDevice.encrypt(data, device_handle)
    return encrypted_data

def decrypt_data(data, device_handle):
    decrypted_data = ServiceKeyDevice.decrypt(data, device_handle)
    return decrypted_data


posted @ 2024-04-14 19:13  20211312徐元琦  阅读(6)  评论(0编辑  收藏  举报