密码引擎API的主要标准和规范包括:
- 微软的Crypto API
- RAS公司的PKCS#11标准
- 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接
0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
Crypto API
CryptoAPI(简称CAPI)是Windows向应用程序开发人员提供的一套密码学编程接口,包括加密解密、身份认证和编码解码等。加密服务提供程序(Cryptographic Service Provider,简称CSP)也称加密服务提供商,指的是Microsoft或其他公司提供的包含密码算法的DLL模块,CryptoAPI的调用最终是由这些模块中的相关API 执行的。具体说来,CryptoAPI是由Advapi32.dll和Crypt32.dll导出的,应用程序对CryptoAPI的调用,会经过CryptoSPI(系统编程接口),然后CryptoSPI将调用传递到加密服务提供程序。应用程序开发人员可以使用CryptoAPI,而无需了解其底层实现细节,就像可以在不了解图形硬件配置的情况下可以使用图形库中的API一样
PKCS#11
PKCS#11是密码学令牌接口标准(Cryptographic Token Interface Standard)的简称。它定义了一套API,用于访问和管理密码学令牌,例如智能卡和硬件安全模块(HSM)。PKCS#11 API允许应用程序执行加密、解密、签名、密钥生成等操作,而这些操作都在安全的密码学令牌上进行。这个标准由RSA安全(现在属于戴尔科技)开发,并被广泛用于安全相关应用程序和系统中
GMT 0016-2012
规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求
GMT 0018-2012
规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准
1 总结这些API在编程中的使用方式
Crypto API
CryptoAPI函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。但是,实际上有些应用程序只能与特定的CSP协作。CSP与应用程序之间的关系类似于Windows GDI模型。CSP就类似于图形硬件驱动程序。
PKCS#11
KCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布,它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。 PKCS#11称为Cyptoki,定义了一套独立于技术的程序设计接口,USBKey安全应用需要实现的接口。 由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS#11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能
GMT 0016-2012
调用头文件以及接口进行使用
GMT 0018-2012
2 列出这些API包含的函数,进行分类,并总结它们的异同
Crypto API
- 基本加密函数
服务提供者函数:
密钥的产生和交换函数:
编码/解码函数:
数据加密/解密函数:
哈希和数字签名函数:
证书和证书库函数
证书库函数:
维护函数:
证书函数:
证书撤销列表函数:
证书信任列表函数:
扩展属性函数:
证书验证函数
使用CTL 的函数:
证书链验证函数:
消息函数
低级消息函数:
简化消息函数:
辅助函数
数据管理函数:
数据转换函数:
增强密钥用法函数:
密钥标示函数:
证书库回调函数:
OID 支持函数:
远程对象恢复函数:
PFX 函数:
PKCS#11
通用接口:
加密解密:
签名和消息鉴别:
GMT 0016-2012
设备管理函数:
访问控制函数:
应用管理函数:
文件管理函数:
容器管理函数:
密码服务函数:
GMT 0018-2012
设备管理类函数:
- 打开设备:SDF_OpenDevice
- 关闭设备:SDF_CloseDevice
- 创建会话:SDF_OpenSession
- 关闭会话:SDF_CloseSession
- 获取设备信息:SDF_GetDeviceInfo
- 产生随机数:SDF_GenerateRandom
- 获取私钥使用权限: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_InternalSign_ECC
- 内部密钥ECC验证:SDF_InternalVerify_ECC
- 外部密钥ECC加密:SDF_ExternalEncrypt_ECC
对称算法运算类函数: - 对称加密:SDF_Encrypt
- 对称解密:SDF_Decrypt
- 计算MAC:SDF_CalculateMAC
用户文件操作类函数 - 创建文件:SDF_CreateFile
- 读取文件:SDF_ReadFile
- 写文件:SDF_WriteFile
- 删除文件:SDF_DeleteFile
3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
- SKF接口
- API接口
- PKCS#11
DES:
DES3:
RC2:
RC4:
RSA:
AES:
- getusbinfos.sln