首页 > 技术文章 > 《信息系统设计与实现下》 实验一-密码引擎-加密API研究

tanjie200 2021-04-25 22:23 原文

1 各种标准参考

1.1 微软的Crypto API

英文原版:https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptoapi-system-architecture
参考1:http://www.doc88.com/p-3387349090807.html
参考2:https://docs.microsoft.com/en-us/previous-versions/ms867086(v=msdn.10)?redirectedfrom=MSDN 翻译版:https://wenku.baidu.com/view/8867f794dd88d0d233d46a89.html
参考3:https://blog.csdn.net/jiftlixu/article/details/19835873

1.2 RAS公司的PKCS#11标准

英文原版:https://docs.oracle.com/javase/9/security/pkcs11-reference-guide1.htm#JSSEC-GUID-30E98B63-4910-40A1-A6DD-663EAF466991
英文pdf:https://www.doc88.com/p-3939101431520.html?r=ref-https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D1ZLDxshKx5AhjxHBQE177CU-Bdr2SBSsdDCwZZHoJJx-HiUTDR7mp-Z2Vqv9jwjGWLP0tuDBXsJqBCnKoBIoJq%26wd%3D%26eqid%3Db9afc4260017d3e00000000260745dad
参考1:https://wenku.baidu.com/view/f039dea3f524ccbff1218422.html
参考2:https://www.docin.com/p-749303487.html

1.3 中国商用密码标准

1.3.1 GMT 0016-2012 智能密码钥匙密码应用接口规范

https://max.book118.com/html/2017/1225/145915404.shtm

1.3.2 GMT 0018-2012密码设备应用接口规范

http://www.gmbz.org.cn/main/viewfile/20180110020642562680.html

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

2.1 微软的Crypto API

结构图:



翻译图:


简化结构图

在程序中调用:先创建密钥容器,先使用CSP句柄,不同的算法设置不同的CSP类型

有了CSP句柄绑定到密钥容器后,再调具体的算法就可以执行了。

2.2 RAS公司的PKCS#11标准

结构图:


PKCS#11是从cyprtoki开始的,上面的其他安全层可以自定义,然后是设备异步和同步(应该是多个接口使用同一个设备),slot>槽,token>令牌
结构图中有一些概念:(概念关系图,参考网中图不清晰,重做了一下):

代码调用:应该先初始化ki,然后设置槽和令牌,再就是设置会话,设置对象,就对象可以进行密码算法相关操作。

2.3 中国商用密码标准

2.3.1 GMT 0016-2012 智能密码钥匙密码应用接口规范



一个设备认证密钥可以对应多个应用


接口函数:设备管理,访问控制包括设备认证、PIN码管理和安全状态管理等,应用管理,文件管理,容器管理(跟证书有关),密码服务就是各种算法了如RSA等

2.3.2 GMT 0018-2012密码设备应用接口规范


接口涉及设备管理、密钥管理、非对称算法运算、对此算法运算、杂凑函数运算、文件操作

3 列出这些API包含的函数,进行分类,并总结它们的异同

3.1 微软的Crypto API

API原文连接
类型截图

主要类型:
CryptoXML函数:用xml格式的数据做数字签名
签名函数:签名和时间戳
基础密码函数:
  服务提供函数:连接或断开CSP
  密钥产生和交换函数:用户之间交换密钥以及密钥的创建、验证和摧毁
  对象编解码函数:对证书相关的部分编解码
  数据加密和解密函数:需要加密密钥
  摘要和数字签名函数:计算hash和创建和验证数字签名和验证
证书和证书存储函数:
  证书存储函数:
  证书和证书存储维护函数:
  证书函数:处理CRLs和CTLs
  证书撤销列表函数
  证书信任列表函数
  拓展属性的函数
制作证书函数:
证书验证函数:
  使用CTL的验证函数
  证书链验证函数
信息函数:
  低层的消息函数
  简化消息函数
辅助函数:
数据管理函数
数据转换函数
增强的密钥使用函数
键标识符函数
OID支持函数
远程对象检索函数
PFX函数:支持Personal Information Exchange(PFX)格式BLOBs
证书服务备份和恢复函数
回调函数:注册或安装在CSp中定义过的应用
证书日志定义函数
证书日志函数
Windows下的信任函数
对象地位函数:在安全通道验证证书

3.2 RAS公司的PKCS#11标准

类型 函数名 描述
通用 C_Initialize Cryptoki初始化
C_Finalize 结束Cryptoki
C_getInfo 获取Cryptoki信息
C_GetFunctionList 获取函数列表指针
Slot/Token管理 C_GetSlotList 获取Slot列表
C_GetSlotInfo 获取Slot信息
C_GetTokenInfo 获取Token信息
C_WaitForSlotEvent 等待Slot的事件发生
C_GetMechanismList 获取机制列表
C_GetMechanismInfo 获取机制信息
C_InitToken 初始化Token
C_InitPIN 初始化PIN
C_SetPIN 设定PIN
会话管理 C_OpenSession 打开会话
C_CloseSession 关闭会话
C_CloseAllSessions 关闭所有会话
C_GetSessionInfo 获取会话信息
C_GetOperationState 获取操作状态
C_SetOperationState 设置操作状态
C_Login 登录
对象管理 C_CreateObject 创建对象
C_CopyObject 复制对象
C_DestoryObject 销毁对象
C_GetObjectSize 获取对象大小
C_GetAttibuteValue 获取属性值
C_SetAttributeValue 设定属性值
C_FindObjectsInit 查找对象初始化操作
C_FindObject 查找对象
C_FindObjectFinal 结束查找对象操作
加密函数 C_EncryptInit 加密初始化
C_Encrypt 加密操作
C_EncryptUpdate 加密更新
C_EncryptFinal 结束加密
解密函数 C_DecryptInit 解密初始化
C_Decrypt 解密操作
C_DecryptUpdate 解密更新
C_DecryptFinal 结束解密
摘要函数 C_DigestInit 摘要初始化
C_Digest 摘要操作
C_DigestUpdate 摘要更新
C_DigestKey 对KEY摘要
C_DigestFinal 结束摘要
签名函数 C_SignInit 签名初始化
C_Sign 签名操作
C_SignUpdate 签名更新
C_SignFinal 结束签名
C_SignRecoverInit 可恢复签名的初始化
C_SignRecover 可恢复签名操作
验签函数 C_VerifyInit 验签初始化
C_Verify 验签操作
C_VerifyUpdate 验签更新
C_VerifyFinal 结束验签
C_VerifyRecoverInit 可恢复验签的初始化
C_VerifyRecover 可恢复验签操作
KEY管理 C_GenerateKey 生成KEY
C_GenerateKeyPair 生成公私钥对
C_WrapKey 对Key打包
C_UnwrapKey 对KEY解包
C_DeriveKey 派生Key
随机数产生函数 C_SeedRandom 设定随机种子
C_GenerateRandom 生成随机数

3.3 中国商用密码标准

3.3.1 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_UnblockPIN 解锁PIN
SKF_VerifyPIN 校验PIN
SKF_ClearSecueState 清除应用安全状态
应用管理 SKF_CreateApplication 创建应用
SKF_EnumApplication 枚举应用
SKF_DeleteApplication 删除应用
SKF_OpenApplication 打开应用
SKF_CloseApplication 关闭应用
文件管理 SKF_CreateFile 创建文件
SKF_DeleteFile 删除文件
SKF_EnumFile 枚举文件
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_GenRSAKeyPair 生成RSA签名密钥对
SKF_ImportRSAKeyPair 导入RSA加密密钥对
SKF_RSASignDate RSA签名
SKF_RSAVerify RSA验签
SKF_RSAExportSessionKey RSA生成并导出会话密钥
SKF_GenECCKeyPair 生成ECC签名密钥对
SKF_ImportECCKeyPair 导入ECC加密密钥对
SKF_ECCSignDate ECC签名
SKF_ECCVerify ECC验签
SKF_ECCExportSessionKey ECC生成并导出会话密钥
SKF_ExtECCEncrypt ECC外来公钥加密
SKF_GenerateAgreementDataWithECC ECC产生协商数据并计算会话密钥
SKF_ExportPublicKey 导出公钥
SKF_ImportSessionKey 导入会话密钥
SKF_EncryptInit 加密初始化
SKF_Encrypt 单组数据加密
SKF_EncryptUpdate 多组数据加密
SKF_EncryptFinal 结束加密
SKF_DecryptInit 解密初始化
SKF_Decrypt 单组数据解密
SKF_DecryptUpdate 多组数据解密
SKF_DecryptFinal 结束解密
SKF_DigetInit 杂凑初始化
SKF_Diget 单组数据杂凑
SKF_DigetUpdate 多组数据杂凑
SKF_DigetFinal 结束杂凑
SKF_MacInit 消息鉴别码初始化
SKF_Mac 单组数据消息鉴别码
SKF_MacUpdate 多组数据消息鉴别码
SKF_MacFinal 结束消息鉴别码
SKF_CloseHandle 关闭密码对象句柄

3.3.2 GMT 0018-2012密码设备应用接口规范

类型 函数名 描述
设备管理 SDF_OpenDevice 打开设备
SDF_CloseDevice 关闭设备
SDF_OpenSession 创建会话
SDF_CloseSession 关闭会话
SDF_GetDeviceInfo 获取设备信息
SDF_GenerateRandom 产生随机数
SDF_GetPrivateKeyAccessRight 获取私钥使用权限
SDF_ReleasePrivateKeyAccessRight 释放私钥使用权限
密钥管理 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_ExchangeDigitEnvelopBaseOnRSA 基于RSA算法的数字信封转换
SDF_ExportSignPublicKey_ECC 导出ECC签名公钥
SDF_ExportEncPublicKey_ECC 导出ECC加密公钥
SDF_GenerateKeyPair_ECC 产生ECC非对称密钥对并输出
SDF_GenerateKeyWithIPK_ECC 生成会话密钥并用内部ECC公钥加密输出
SDF_GenerateKeyWithEPK_ECC 生成会话密钥并用外部ECC公钥加密输出
SDF_ImportKeyWithISK_ECC 导入会话密钥并用内部ECC私钥解密
SDF_GenerateAgreementDateWithECC 生成协商数据并计算会话密钥
SDF_GenerateKeyWithECC 计算会话密钥
SDF_GenerateAgreementDateAndKeyWithECC 产生协商数据并计算会话密钥
SDF_ExchangeDigitEnvelopBaseOnECC 基于ECC算法的数字信封转换
SDF_GenerateKeyWithKEK 生成会话密钥并用密钥加密密钥加密输出
SDF_ImportKeyWithKEK 导入会话密钥并用密钥加密密钥解密
SDF_ImportKey 导入明文会话密钥
SDF_DestroyKEY 销毁会话密钥
非对称算法运算类 SDF_ExternalPublicKeyOperation_RSA 外部公钥RSA运算
SDF_ExternalPrivateKeyOperation_RSA 外部私钥RSA运算
SDF_InternalPublicKeyOperation_RSA 内部公钥RSA运算
SDF_InternalPrivateKeyOperation_RSA 内部私钥RSA运算
SDF_ExternalSign_ECC 外部密钥ECC签名
SDF_ExternalVerity_ECC 外部密钥ECC签名
SDF_InternalSign_ECC 内部密钥ECC签名
SDF_InternalVerity_ECC 内部密钥ECC签名
SDF_ExternalEncrypt_ECC 外部密钥ECC加密
SDF_ExternalDecrypt_ECC 外部密钥ECC解密
对称算法运行类函数 SDF_Encrypt 对称加密
SDF_Decrypt 对称解密
SDF_CalculateMAC 计算MAC
杂凑运算 SDF_HashInit 杂凑运算初始化
SDF_HashUpdate 多包杂凑运算
SDF_HashFinal 杂凑运算结束
用户文件操作 SDF_CreateFile 创建文件
SDF_ReadFile 读取文件
SDF_WriteFile 写文件
SDF_DeleteFile 删除文件

3.4 几个标准之间区别

异:使用的接口不同,微软是使用CSP,Pkcs#11使用ki,16标准使用SKF,18标准使用SDF
通:大致流程相似,先连设备,进行设备操作,然后进行密钥管理,然后进行算法运算,且密码算法的大致相似,都初始化,单组操作,多组操作,结束这四步。

4 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接

4.1 csp



4.2 PKCS11




4.3 skf


推荐阅读