密码引擎API的主要标准和规范包括:
1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
内容:
0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)
1 总结这些API在编程中的使用方式(5分)
2 列出这些API包含的函数,进行分类,并总结它们的异同(10分)
3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口)
微软的Crypto API
基本加密函数
用于连接到云解决方案提供商的上下文函数。 这些函数使应用程序能够按名称选择特定的云解决方案提供商,或选择可以提供所需功能类的特定云解决方案提供商。
用于生成和存储加密密钥的密钥生成函数。 完全支持更改 链接模式、 初始化向量和其他加密功能。 有关详细信息,请参阅密钥生成和Exchange函数。
用于交换或传输密钥的密钥交换函数。 有关详细信息,请参阅加密密钥存储和Exchange以及密钥生成和Exchange函数。
证书编码/解码函数
用于加密或解密数据的函数。 还支持 哈希 数据。 有关详细信息,请参阅数据加密和解密函数和数据加密和解密。
证书Microsoft Store函数
用于管理数字证书集合的函数。 有关详细信息,请参阅数字证书和证书Microsoft Store函数。
简化的消息函数
用于加密和解密消息和数据的函数。
用于对消息和数据进行签名的函数。
用于验证已接收消息和相关数据的签名的真实性的函数。
有关详细信息,请参阅 简化的消息 和 简化的消息函数。
低级别消息函数
用于执行简化消息函数执行的所有任务的函数。 低级别消息函数比简化的消息函数更灵活,但需要更多的函数调用。
每个功能区域在其函数名称中都有一个关键字,指示其功能区域。
https://learn.microsoft.com/zh-cn/windows/win32/seccrypto/cryptoapi-system-architecture
RAS公司的PKCS#11标准
PKCS#11概述
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
PKCS#11主要是应用于智能卡和HSM。
PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
GMT 0016-2012 智能密码钥匙密码应用接口规范:
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。本标准适用于智能密码钥匙产品的研制、使用和检测。
GMT 0018-2012密码设备应用接口规范:
本标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。本标准适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
API函数
设备管理系列函数
概述
设备管理主要完成设备的插拔事件处理、枚举设备、连接设备、断开连接、获取设备状态、设置设备标签、获取设备信息、锁定设备、解锁设备和设备命令传输等操作。设备管理系列函数如下表所示:
1、等待设备插拔事件
函数原型:ULONG DEVAPI SKF_WaitForDevEvent(LPSTR szDevName,ULONG *pulDevNameLen, ULONG *pulEvent)
功能描述:该函数等待设备插入或者拔除事件。szDevName返回发生事件的设备名称。
参 数:szDevName:[OUT] 发生事件的设备名称。
pulDevNameLen:[IN/OUT] 输入/输出参数,当输入时表示缓冲区长度,输出时表示设备名称的有效长度,长度包含字符串结束符。
pulEvent:[OUT]事件类型。1表示插入,2表示拔出。
返 回 值:SAR_OK:成功;其他:错误码。
2、取消等待设备插拔事件
函数原型:ULONG DEVAPI SKF_CancelWaitForDevEvent()
功能描述:该函数取消等待设备插入或者拔除事件。
参 数:无
返 回 值:SAR_OK:成功;其他:错误码。
备 注:使本进程正在执行的SKF_WaitForDevEvent函数立即返回。
3、枚举设备
函数原型:ULONG DEVAPI SKF_EnumDev(BOOL bPresent, LPSTR szNameList, ULONG *pulSize)
功能描述:获得当前系统中的设备列表。
参 数:bPresent:[IN] 为TRUE表示取当前设备状态为存在的设备列表。为FALSE表示取当前驱动支持的设备列表。
szNameList:[OUT] 设备名称列表。如果该参数为NULL,将由pulSize返回所需要的内存空间大小。每个设备的名称以单个‘\0’结束,以双‘\0’表示列表的结束。
pulSize:[IN,OUT] 输入时表示设备名称列表的缓冲区长度,输出时表示szNameList所占用的空间大小。
返 回 值:SAR_OK:成功;其他:错误码。
4、连接设备
函数原型:ULONG DEVAPI SKF_ConnectDev (LPSTR szName, DEVHANDLE *phDev)
功能描述:通过设备名称连接设备,返回设备的句柄。
参 数:szName: [IN] 设备名称。
phDev:[OUT] 返回设备操作句柄。
返 回 值:SAR_OK:成功;其他:错误码。
5、断开连接
函数原型:ULONG DEVAPI SKF_DisConnectDev (DEVHANDLE hDev)
功能描述:断开一个已经连接的设备,并释放句柄。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
返 回 值:SAR_OK:成功;其他:错误码。
备 注:如果该设备已被锁定,函数应首先解锁该设备。断开连接操作并不影响设备的权限状态。
6、获取设备状态
函数原型:ULONG DEVAPI SKF_GetDevState(LPSTR szDevName, ULONG *pulDevState)
功能描述:获取设备是否存在的状态。
参 数:szDevName:[IN] 设备名称。
pulDevState:[OUT] 返回设备状态。
返 回 值:SAR_OK:成功;其他:错误码。
7、设置设备标签
函数原型:ULONG DEVAPI SKF_SetLabel (DEVHANDLE hDev, LPSTR szLabel)
功能描述:设置设备标签。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
szLabel:[IN] 设备标签字符串。该字符串应小于32字节。
返 回 值:SAR_OK:成功;其他:错误码。
8、获取设备信息
函数原型:ULONG DEVAPI SKF_GetDevInfo (DEVHANDLE hDev, DEVINFO *pDevInfo)
功能描述:获取设备的一些特征信息,包括设备标签、厂商信息、支持的算法等。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
pDevInfo:[OUT] 返回设备信息。
返 回 值:SAR_OK:成功;其他:错误码。
9、锁定设备
函数原型:ULONG DEVAPI SKF_LockDev (DEVHANDLE hDev, ULONG ulTimeOut)
功能描述:获得设备的独占使用权。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
ulTimeOut:[IN] 超时时间,单位为毫秒。如果为0xFFFFFFFF表示无限等待。
返 回 值:SAR_OK:成功;其他:错误码。
10、解锁设备
函数原型:ULONG DEVAPI SKF_UnlockDev (DEVHANDLE hDev)
功能描述:释放对设备的独占使用权。
参 数:hDev:[IN] 连接设备时返回的设备句柄。
返 回 值:SAR_OK:成功;其他:错误码。
11、设备命令传输
函数原型:ULONG DEVAPI SKF_Transmit(DEVHANDLE hDev, BYTE* pbCommand, ULONG ulCommandLen,BYTE* pbData, ULONG* pulDataLen)
功能描述:将命令直接发送给设备,并返回结果。
参 数:hDev:[IN] 设备句柄。
pbCommand:[IN] 设备命令。
ulCommandLen:[IN] 命令长度。
pbData:[OUT] 返回结果数据。
pulDataLen:[IN,OUT] 输入时表示结果数据缓冲区长度,输出时表示结果数据实际长度。
返 回 值:SAR_OK:成功;其他:错误码。
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
(一)SKF接口
龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln
(二)Crypto API
1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln
2.龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts\EnumCerts.sln
(三)PKCS#11
1.龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln
(1)DES