0.研究学习原始文档
CryptoAPI
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptography-portal
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptoapi-system-architecture
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptographic-provider-types
https://docs.microsoft.com/en-us/windows/win32/seccrypto/microsoft-cryptographic-service-providers
https://docs.microsoft.com/en-us/windows/win32/seccng/cng-portal
https://docs.microsoft.com/zh-cn/windows/win32/api/wincrypt/
PKCS#11
https://www.doc88.com/p-3939101431520.html?r=ref-https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D771YU21q-5I8k_Y2F4bwPSskryTnctDFbPCYq6l4SobgzjCES1WamTa-oi2w3OSWKBCLvzdBjptU1eqRyO3skK%26wd%3D%26eqid%3D9aeb057e0005ecd2000000026073aede
GM/T 0016-2012 智能密码钥匙密码应用接口规范
GM/T 0018-2012 密码设备应用接口规范
http://www.gmbz.org.cn/main/bzlb.html
- 总结这些API在编程中的使用方式:
- CryptoAPI是微软推荐的加密API,提供了在Win32环境下进行加密、验证等安全服务的标准接口。它包括简单消息函数、低层消息函数、基本加密函数、证书编解码函数和证书库管理函数,用于敏感信息的加密、签名以及网络传输的私有性和认证性保障。
- PKCS#11(Cryptoki)为应用程序与各种密码设备之间提供接口,将密码设备的细节抽象化,支持数据、证书和密钥的存储与管理。
- SKF是针对支持国密算法USB KEY设备的应用而制定的行业标准,提供智能密码钥匙应用接口规范,使开发的应用程序兼容不同厂家及品牌的USB KEY产品。
- 列出这些API包含的函数,进行分类,并总结它们的异同:
CryptoAPI:
连接/断开CSP函数: - CryptAcquireContext: 用于连接CSP,获取指定CSP的密钥容器的句柄。
- CryptReleaseContext: 用于断开CSP连接,释放CSP句柄。
枚举CSP函数: - CryptEnumProviders: 用于枚举计算机上的所有CSP。
获得/设置默认CSP函数: - CryptGetDefaultProvider: 用于获取系统默认的CSP。 - CryptSetProvider: 用于设置系统默认的CSP。
获得/设置CSP参数函数:- CryptGetProvParam: 用于获取CSP各种参数属性。 - CryptSetProvParam: 用于设置CSP各种参数属性。
密钥的生成与交换函数:- CryptGenKey: 用于产生一个随机的对称或非对称算法的密钥。 - CryptDeriveKey: 根据基础数据派生一对称密钥。
- CryptDestroyKey: 用于销毁密钥。
- CryptDuplicateKey: 用于复制一个密钥。
- CryptExportKey: 用于从CSP导出密钥或密钥对。
- CryptImportKey: 用于将BLOB数据导入CSP。
- CryptGetKeyParam: 用于获得key句柄的各项参数。
- CryptSetKeyParam: 用于设置key句柄的各项参数。
产生随机数函数:- CryptGenRandom: 用于生成随机数。
数据的加密与解密函数: - CryptEncrypt: 用于使用指定的密钥和算法加密数据。 - CryptDecrypt: 用于解密加密数据。
哈希和数字签名函数: - CryptCreateHash: 用于创建哈希。 - CryptDestroyHash: 用于销毁哈希对象。
- CryptDuplicateHash: 用于复制一个哈希对象。
- CryptGetHashParam: 用于获得哈希对象的参数。
- CryptSetHashParam: 用于设置哈希对象的参数。
- CryptHashData: 用于对数据进行哈希操作。
- CryptSignHash: 用于对哈希对象进行签名。
- CryptVerifySignature: 用于验证哈希签名。
证书和证书库函数:- CertOpenStore: 用于打开证书库。 - CertCloseStore: 用于关闭证书库。
- CertEnumCertificatesInStore: 用于枚举证书库中的证书。
- CertFindCertificateInStore: 用于从证书库中查找指定的证书。
- CertCreateCertificateContext: 用于由证书数据创建证书句柄。
- CertFreeCertificateContext: 用于释放证书句柄。
- CertGetCertificateContextProperty: 用于获得证书句柄属性。
- CertSetCertificateContextProperty: 用于设置证书句柄属性。
- CertGetNameString: 用于从证书中获得主题或颁发者的名称。
PKCS#11 (Cryptoki):
通用目的函数: - C_Initialize: 初始化 Cryptoki。
- C_Finalize: 整理各种适合 Cryptoki 的资源。
- C_GetInfo: 获得关于 Cryptoki 的通用信息。
- C_GetFunctionList: 获得 Cryptoki 库函数的进入点。
槽和令牌管理函数: - C_GetSlotList: 获得系统中槽的名单。 - C_GetSlotInfo: 获得关于特殊槽的信息。
- C_GetTokenInfo: 获得关于特殊令牌的信息。
- C_WaitForSlotEvent: 等待槽事件(如令牌插入、转移等)的发生。
- C_GetMechanismList: 获得由令牌支持的机制的名单。
- C_GetMechanismInfo: 获得关于特殊机制的信息。
- C_InitToken: 初始化一个令牌。
会话管理函数: - C_InitPIN: 初始化普通用户的 PIN。 - C_SetPIN: 改变现在用户的 PIN。
- C_OpenSession: 打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入。
- C_CloseSession: 关闭一个会话。
- C_CloseAllSessions: 用令牌关闭所有的会话。
- C_GetSessionInfo: 获得关于会话的信息。
- C_GetOperationState: 获得会话的加密操作状态。
- C_SetOperationState: 设置会话的加密操作状态。
- C_Login: 注册一个令牌。
对象管理函数:- C_Logout: 从一个令牌注销。 - C_CreateObject: 建立一个对象。
- C_CopyObject: 建立一个对象的拷贝。
- C_DestroyObject: 销毁一个对象。
- C_GetObjectSize: 获取字节中一个对象的大小。
- C_GetAttributeValue: 获取一个对象的属性值。
- C_SetAttributeValue: 改变一个对象的属性值。
- C_FindObjectsInit: 初始化一个对象的搜索操作。
- C_FindObjects: 继续一个对象搜索操作。
- C_FindObjectsFinal: 完成一个对象搜索操作。
加密函数: - C_EncryptInit: 初始化一个加
密操作。
-
C_Encrypt: 加密单部分数据。
-
C_EncryptUpdate: 继续一个多部分加密操作。
-
C_EncryptFinal: 完成一个多部分加密操作。
解密函数: - C_DecryptInit: 初始化一个解密操作。 -
C_Decrypt: 解密单部分加密数据。
-
C_DecryptUpdate: 继续一个多部分解密操作。
-
C_DecryptFinal: 完成一个多部分解密操作。
-
C_DigestInit: 初始化一个消息摘要操作。
-
C_Digest: 摘要单部分数据。
-
C_DigestUpdate: 继续一个多部分摘要操作。
-
C_DigestKey: 摘要一个密钥。
-
C_DigestFinal: 完成一个多部分摘要操作。
签名和MACing: - C_SignInit: 初始化一个签名操作。 -
C_Sign: 签名单部分数据。
-
C_SignUpdate: 继续一个多部分签名操作。
-
C_SignFinal: 完成一个多部分签名操作。
-
C_SignRecoverInit: 初始化一个签名操作,在操作中数据能从签名中恢复。
-
C_SignRecover: 签名单部分数据,在操作中数据能从签名中恢复。
-
C_VerifyInit: 初始化一个鉴定操作。
-
C_Verify: 在单部分数据上鉴定一个签名。
-
C_VerifyUpdate: 继续一个多部分鉴定操作。
-
C_VerifyFinal: 完成一个多部分鉴定操作。
-
C_VerifyRecoverInit: 初始化一个鉴定操作,在操作中数据能从签名中恢复。
-
C_VerifyRecover: 在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复。
-
C_DigestEncryptUpdate: 继续类似的多部分摘要和加密操作。
-
C_DecryptDigestUpdate: 继续类似的多部分解密和摘要操作。
-
C_SignEncryptUpdate: 继续类似的多部分签名和加密操作。
-
C_DecryptVerifyUpdate: 继续类似的多部分解密和鉴定操作。
密钥管理函数:- C_GenerateKey: 产生一个保密密钥。 -
C_GenerateKeyPair: 产生一对公开/私有密钥。
-
C_WrapKey: 封装(即加密)一个密钥。
-
C_UnwrapKey: 解开(即解密)一个封装的密钥。
-
C_DeriveKey: 派生一个密钥。
随机数生成函数: -
C_SeedRandom: 产生种子值。
- C_GenerateRandom: 产生随机数据。
SKF (Software Key Management):
设备管理函数:- SKF_EnumDev: 枚举设备。
- SKF_ConnectDev: 连接设备。
- SKF_DisConnectDev: 断开设备。
- SKF_Login: 用户登录。
- SKF_Logout: 用户登出。
- SKF_CreateApplication: 创建应用。
- SKF_DeleteApplication: 删除应用。
应用管理函数: - SKF_EnumApplication: 枚举应用。 - SKF_OpenApplication: 打开应用。
文件管理函数: - SKF_CloseApplication: 关闭应用。 - SKF_CreateFile: 创建文件。
- SKF_DeleteFile: 删除文件。
- SKF_EnumFiles: 枚举文件。
- SKF_ReadFile: 读取文件。
- SKF_WriteFile: 写入文件。
容器管理函数:- SKF_CreateContainer: 创建容器。 - SKF_DeleteContainer: 删除容器。
- SKF_EnumContainer: 枚举容器。
密码服务: - SKF_GenRandom: 生成随机数。 - SKF_GenRSAKeyPair: 生成 RSA 密钥对。
- SKF_ImportRSAKeyPair: 导入 RSA 密钥对。
- SKF_RSAPubEncrypt: RSA 公钥加密。
- SKF_RSAPriDecrypt: RSA 私钥解密。
- SKF_RSASignData: RSA 签名数据。
- SKF_RSAVerify: RSA 验证签名。
- SKF_RSAPubDerive: RSA 公钥派生。
- SKF_GenECCKeyPair: 生成 ECC 密钥对。
- SKF_ImportECCKeyPair: 导入 ECC 密钥对。
- SKF_ECCSignData: ECC 签名数据。
- SKF_ECCVerify: ECC 验证签名。
异同点:
CryptoAPI提供了在Win32环境下使用的加密和安全服务接口,而PKCS#11和SKF主要是为与密码设备交互提供接口。CryptoAPI主要针对软件级的加密需求,而PKCS#11和SKF则是针对硬件级的安全需求。
PKCS#11提供了更加通用的接口,可以与各种密码设备进行交互,而SKF则更专注于智能密码钥匙的应用,尤其是针对国密算法USB KEY设备。
CryptoAPI和PKCS#11提供了更加完整的加密和解密功能,包括密钥管理、数据加密、数字签名等,而SKF则更侧重于密钥管理和密码服务,以及针对特定硬件设备的支持。
3.以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
图片和内容链接:【金山文档】 1
https://www.kdocs.cn/l/cfhy2k283xde
以上代码链接:
https://github.com/dzzzheartsteel/GM3000