目录提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
- 一、任务详情
- 二、查找各种标准的原始文档,研究学习
- 三、总结这些API在编程中的使用方式
- 四、列出这些API包含的函数,进行分类,并总结它们的异同
- 五、以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
一、任务详情
密码引擎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接口),把运行截图加入博客,并提供代码链接(10分)
二、查找各种标准的原始文档,研究学习
1.Crypto API
Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。CryptoAPI 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7 标准格式编码和解码等。现在CryptoAPI的最新版本为2.0版本。
Crypto API学习链接:
https://docs.microsoft.com/en-us/windows/win32/seccrypto/cryptography-functions
CryptoAPI由五个主要功能区域组成:
基本加密函数
用于连接到云解决方案提供商的上下文函数。 这些函数使应用程序能够按名称选择特定的云解决方案提供商,或选择可以提供所需功能类的特定云解决方案提供商。
用于生成和存储加密密钥的密钥生成函数。 完全支持更改 链接模式、 初始化向量和其他加密功能。
用于交换或传输密钥的密钥交换函数。
证书编码/解码函数
用于加密或解密数据的函数。 还支持哈希数据。
证书Microsoft Store函数
用于管理数字证书集合的函数。 有关详细信息,请参阅数字证书和证书Microsoft Store函数。
简化的消息函数
用于加密和解密消息和数据的函数。
用于对消息和数据进行签名的函数。
用于验证已接收消息和相关数据的签名的真实性的函数。
低级别消息函数
用于执行简化消息函数执行的所有任务的函数。低级别消息函数比简化的消息函数更灵活,但需要更多的函数调用。
2.PKCS#11
PKCS#11学习链接:
https://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/os/pkcs11-base-v2.40-os.html
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
PKCS#11主要是应用于智能卡和HSM。
PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
PKCS密码中间件位于上层应用和底层安全设备之间,应用基于 PKCS#11 标准接口开发各类应用程序。
主要包括2个库
主API库:提供给应用的PKCS11接口。
tokenDLL库:由主 API 库调用,完成从上向下到指定设备的套接。
安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。
PKCS#11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限,而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象,PKCS #11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
PKCS#11创建和支持下列对象:
PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。
PKCS#11的对象除了生命期长短有分别之外,在访问权限上也有限制。所有的对象都可根据访问权限的不同分成两大类:一类是公开对象,这类对象是任何用户都可以访问的;另一类是私有对象,这一类对象只有身份被验证的用户才有权访问。决定对象的访问限制类型的模板属性是CKA_PRIVATE。
函数如下:
3.GMT 0016-2012
GMT 0016-2012学习: http://www.gmbz.org.cn/main/viewfile/20180110020423162671.html
接口标准
GMT 0016-2012是国家规定的智能密码钥匙密码应用接口规范,规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。适用于智能密码钥匙产品的研制、使用和检测。
规范性引用文件
下列文件对于本标准的应用是必不可少的。凡是注日期的引用文件。仅所注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范
其中还包括了对部分术语的规定:
函数如下:
设备管理系列函数
访问控制系列函数
应用管理系列函数
文件管理系列函数
容器管理系列函数
密码服务系列函数
4.GMT 0018-2012
GMT 0018-2012学习链接: http://www.gmbz.org.cn/main/viewfile/20180110020642562680.html
接口标准
GMT 0018-2012标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。
其中还包括了对部分术语的规定:
函数与2016相似,这里只列出部分:
设备管理类函数
设备管理类函数包括以下具体函数:
A.打开设备:SDF_OpenDevice
B.关闭设备:SDF_CloseDevice
C.创建会话:SDF_OpenSession
D.关闭会话:SDF_CloseSession
E.获取设备信息:SDF_GetDeviceInfo
F.产生随机数:SDF_GenerateRandom
G.获取私钥使用权限:SDF_GetPrivateKeyAccessRight
H.释放私钥使用权限: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_GenerateKeyWiuhECC
产生协商数据并计算会话密钥∶SDF_GenerateAgreementDataAndKeyWithECC
基于 ECC算法的数字信封转换∶SDF_ExchangeDigitEnvelopeBaseOnECC
生成会话密钥并用密钥加密密钥加密输出∶SDF_GenerateKeyWithKEK
导入会话密钥并用密钥加密密钥解密∶SDF_ImportKeyWithKEK
销毁会话密钥∶SDF_DestroyKey
三、总结这些API在编程中的使用方式
- Crypto API 提供了一系列函数库,开发者可以直接调用这些函数来实现加密解密等操作。
- PKCS#11 提供了一个通用的接口,让开发者可以通过这个接口调用各种不同厂商的密码设备。
- GMT 0016-2012 和 GMT 0018-2012 定义了一套标准的密码设备应用接口规范,开发者可以按照这个规范来编写代码,并调用相应的函数库实现各种操作。
四、列出这些API包含的函数,进行分类,并总结它们的异同
由于这些API设计的函数过多,前文已经总结过了,这里就只挑选部分函数进行展示。
Crypto API:
密钥生成:CryptGenKey()
密钥销毁:CryptDestroyKey()
加密:CryptEncrypt()
解密:CryptDecrypt()
PKCS#11:
初始化:C_Initialize()
签名:C_Sign()
检查机制是否可用:C_MechanismInfo()
对称密钥生成:C_GenerateKey()
密码设备信息获取:C_GetInfo()
GMT 0016-2012:
打开设备:SKF_OpenDevice()
创建会话:SKF_CreateApplication()
身份认证:SKF_Login()
获取设备信息:SKF_GetDeviceInfo()
密钥对生成:SKF_GenRandomKeyPair()
GMT 0018-2012:
设备初始化:SCD_Init()
打开设备:SCD_Open()
读卡:SCD_Read()
写卡:SCD_Write()
密钥生成:SDF_GenerateKey()
总结
Crypto API 和 PKCS#11 都是通用的密码操作接口,提供了一些基本的加解密操作和密钥生成等操作。
GMT 0016-2012 和 GMT 0018-2012 则是更具体的密码设备应用接口规范,定义了更多的操作功能。
具体的函数名称和参数也有所不同,但基本功能类似。