《信息系统设计与实现下》 实验一-密码引擎-加密API研究
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
通:大致流程相似,先连设备,进行设备操作,然后进行密钥管理,然后进行算法运算,且密码算法的大致相似,都初始化,单组操作,多组操作,结束这四步。