实验一-密码引擎-3-加密API研究
任务详情
密码引擎API的主要标准和规范包括:
1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
内容:
- 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)
- 总结这些API在编程中的使用方式(5分)
- 列出这些API包含的函数,进行分类,并总结它们的异同(10分)
- 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接(10分)
问题回答
查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)
微软的Crypto API
-
资料来源
-
《Microsoft CryptoAPI: A Developer's Guide》
- 作者:Keith Brown
- 出处:Microsoft Press
- 内容:该书介绍了如何使用微软的Crypto API来实现加密和安全相关的功能,包括加密、数字签名、证书管理等方面的内容。
-
《CryptoAPI: Cryptographic API for Windows》
- 作者:Microsoft Corporation
- 出处:Microsoft Developer Network (MSDN)
- 内容:这是微软官方提供的关于Crypto API的技术文档,包括API的使用方法、功能介绍、示例代码等内容。
-
《Understanding Microsoft CryptoAPI》
- 作者:John R. Vacca
- 出处:CRC Press
- 内容:该书深入解析了微软Crypto API的内部机制、安全性、应用场景等方面的内容,适合对加密技术感兴趣的读者。
-
-
研究学习
微软的CryptoAPI是PKI推荐使用的加密 API。其功能是为应用程序开发者提供在Win32环境下使用加密、验证等安全服务时的标准加密接口。CryptoAPI处于应用程序和CSP(cryptographic service provider)之间。
CryptoAPI的编程模型同Windows系统的图形设备接口 GDI比较类似,其中加密服务提供者CSP等同于图形设备驱动程序 ,加密硬件(可选)等同于图形硬件,其上层的应用程序也类似,都不需要同设备驱动程序和硬件直接打交道。
CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
CSP是真正实行加密的独立模块,可以由软件实现也可以由硬件实现。CSP必须符合CryptoAPI接口的规范。
每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,这样便于CryptoAPI找到对应的CSP。目前已经有9种CSP类型,并且还在增长。下表列出出它们支持的密钥交换算法、签名算法、对称加密算法和Hash算法。
CSP类型 交换算法 签名算法 对称加密算法 Hash算法 PROV_RSA_FULL RSA RSA RC2 RC4 MD5 SHA PROV_RSA_SIG none RSA none MD5 SHA PROV_RSA_SCHANNEL RSA RSA RC4 DES Triple DES MD5 SHA PROV_DSS DSS none DSS MD5 SHA PROV_DSS_DH DH DSS CYLINK_MEK MD5 SHA PROV_DH_SCHANNEL DH DSS DES Triple DES MD5 SHA PROV_FORTEZZA KEA DSS Skipjack SHA PROV_MS_EXCHANGE RSA RSA CAST MD5 PROV_SSL RSA RSA Varies Varies 从图中可以看到,每个CSP有一个密钥库,密钥库用于存储密钥。而每个密钥库包括一个或多个密钥容器(Key Containers)。每个密钥容器中含属于一个特定用户的所有密钥对。每个密钥容器被赋予一个唯一的名字。在销毁密钥容器前CSP将永久保存每一个密钥容器,包括保存每个密钥容器中的公/私钥对。
-
参考网址
RAS公司的PKCS#11标准
-
资料来源
-
《PKCS #11 Cryptographic Token Interface Standard》
- 出处:RAS公司官方网站
- 内容:该标准定义了一套应用程序接口(API),用于访问加密设备,如硬件安全模块(HSM)或智能卡。该标准包括对加密操作、密钥管理、证书管理等方面的规范,是公认的加密设备接口标准。
-
《PKCS #11 Overview and Functional Specification Version 3.0》
- 出处:RAS公司官方文档
- 内容:该文档详细介绍了PKCS #11标准的概述、功能规范,包括对加密设备接口、加密操作、密钥管理、会话管理等方面的详细规范。
-
《Understanding PKCS #11: Cryptographic Token Interface Standard》
- 作者:Fred N. Glover
- 出处:Springer出版社
- 内容:该书深入解析了PKCS #11标准的内容,包括其设计原理、实现细节、安全性等方面的内容,适合对加密设备接口标准感兴趣的读者。
-
-
研究学习
在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布,它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。
由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS#11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。
PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。
下面是PKCS#11的架构
- 参考网址
https://ai-science-ape.blog.csdn.net/article/details/124336731
https://ai-science-ape.blog.csdn.net/article/details/124301515
https://ai-science-ape.blog.csdn.net/article/details/124406713
中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
-
资料来源
-
GMT 0016-2012
-
《智能密码钥匙密码应用接口规范(GMT 0016-2012)》
- 出处:中国国家密码管理局官方发布
- 内容:该规范详细定义了智能密码钥匙的密码应用接口标准,包括对密码算法、密钥管理、安全通信、认证协议等方面的规范要求,旨在提高智能密码钥匙的安全性和可靠性。
-
《中国商用密码标准:GMT 0016-2012解读》
- 出处:密码学研究杂志
- 内容:该文章对GMT 0016-2012标准进行解读和分析,介绍了标准的背景、目的、关键内容以及对密码应用接口的影响,有助于深入理解该标准。
-
《智能密码钥匙密码应用接口规范(GMT 0016-2012)实践指南》
- 内容:该指南提供了对GMT 0016-2012标准的实践指导,包括如何在实际应用中遵循标准要求、如何进行密码应用接口的开发和测试等方面的实用建议。
-
-
GMT 0018-2012
-
-
研究学习
-
MGT 0016-2012
本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。
应用由管理员PIN、用户PIN、文件和容器组成,可以存在多个文件和多个容器。
-
MGT 0018-2012
本标准的目标是为公钥密码基础设施应用体系框架下的服务类密码设备制定统一的应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。为该类密码设备的开发、使用及检测提供标准依据和指导,有利于提高该类密码设备的产品化、标准化和系列化水平。
在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机、密码卡、智能密码终端等设备组成,通过该标准规定的密码设备应用接口向通用密码服务层提供基础密码服务,如下图所示:
基础密码服务包括密钥生成、单一的密码运算、文件管理等服务。
本标准采用C语言描述接口函数,无特别说明时,函数中参数的长度单位均为字节数。
-
总结这些API在编程中的使用方式
微软的Crypto API
我们已经在前面提过,每一个CSP都有一个名字和一个类型,并且名字保证唯一。所以可以通过名字和类型得到一个CSP。然面,要想加密肯定需要密钥,那么密钥放哪里呢?对了,就放在密钥容器。(有人会问,密码库有什么用?其实密钥库是在安装CSP的时候已经存在了,他与CSP是相对应的。)但是密钥容器并不是一开始就存在的,需要用户去创建。人面的代码实现以上功能(得到CSP即密码容器)。
我们已经创建了密钥容器,并得到了CSP的句柄。也可以这样理解,我们得到了一个CSP的句柄,并且它被绑定到以UserName 为名的密钥容器上。
那么,以后的加解密等操作,都将在这个CSP上进行。
可以如下删除密钥容器。
CryptAcquireContext(&hCryptProv, userName, NULL, PROV_RSA FULLCRYPT DELETEKEYSET);
RAS公司的PKCS#11标准
在Cryptoki模型中,应用通过集成Cryptoki库来调用密码设备的功能。
Cryptoki库通过slot和token来映射物理密码设备。
Session可以视为在Application和token之间的一个逻辑连接,通过Function访问object和mechanism完成密码相关的功能。
下图展示了一些常用的Cryptoki接口函数的调用过程。在标准文档的示例中,也有不同接口调用流程的示例,后面或稍微展开做一些解释。
-
C_GetFunctionList 获得一个指向 Cryptoki 库的函数指针表的指针。 所获得的指针可以指入 Cryptoki 库所拥有的存储器,在任何情况下,都不要写入该存储器。C_GetFunctionList 是Cryptoki库初始化之前应用可能会调用的唯一的函数。这样可使应用方便、快速地使用共享 Cryptoki 库和同时使用多个Cryptoki 库。
-
C_Initialize初始化Cryptoki库。C_Initialize应当是一个应用所调用的第一个Cryptoki调用。如果几个应用或进程同时使用Cryptoki,则每个应用应当调用C_Initialize,每次调用C_Finalize前,应调用一次C_Initialize。
-
调用C_Finalize表明,用Cryptoki库完成了一个应用。它应当是应用所做的最后一个Cryptoki调用。如果几个应用或进程正在使用Cryptoki,则每个应用应当调用C_Finalize,每次调用C_Finalize前,应调用一次C_Initialize。在两个调用中,应用才能调用其他的Cryptoki功能。
-
C_OpenSession有两个不同的功能:它能建立一个应用调用,以便当一个令牌被插入一个特定页槽时,会通知一个应用,或者会在一个应用和一个特定槽中的令牌之间打开一个对话。
-
C_CloseSession关闭应用和令牌之间的对话,与C_OpenSession 配对使用。当与会话有关的所有操作都执行完后,必须调用C_CloseSession。关闭一个对话时,由该对话建立的所有对话对象都将自动被破坏,即使该应用有其他对话正在“使用”该对象。例如一个函数正在与该对话并行运作,那么该操作将被取消。
-
C_Login将某个用户登录到一个令牌,所有与会话相关的操作都必须在C_Login之后执行。如果调用成功,则根据用户的类型,每个应用对话要么进入R/W SO功能状态,要么R/W User功能状态,或者是R/O User功能状态。
-
C_Logout将用户从令牌中注销,与C_Login成对使用。如果函数调用成功,每个应用程序根据当前的用户类型进入R/W Public Session状态或R/O Public Session状态。
当C_Logout成功执行后,任何返回到专用目标的应用程序句柄就无效了(即使用户以后被返回注册到令牌,那些句柄仍然无效),另外,所有的专用会话目标都被破坏。
如果会话中存在任何激活的密码或目标搜寻操作,并且接着执行C_Logout,那么那些操作可能仍在继续进行,因此,注销前应完成一切已激活的操作。
-
需要注意在Cryptoki库中,所有密码运算操作(加密解密、签名验签、消息摘要)都有一个预置操作。比如在调用C_Encrypt之前必须调用C_EncryptInit来启动。
Cryptoki库一般由密码设备厂商开发,将设备自身的密码功能转换为符合PKCS#11标准的接口。这样当底层的密码设备进行版本更新或者使用其他厂商的产品进行替代时,应用开发商只需要对比自身引用所需接口功能能够满足,就可以通过更新Cryptoki库的方式完成升级。
如果是单机的应用,一般采用设备+驱动+Cryptoki库+应用的集成方式。
现实中更多的是网络应用,应用集成的Cryptoki库需要通过网络接口调用密码设备的功能,此时需要采用安全的通信协议进行通信。
中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
列出这些API包含的函数,进行分类,并总结它们的异同
设备管理类函数
打开设备:SDF_OpenDevice
关闭设备:SDF_CloseDevice
创建会话:SDF_OpenSession
关闭会话:SDF_CloseSession
获取设备信息:SDF_GetDeviceInfo
产生随机数:SDF_GenerateRandom
获取私钥使用权限:SDF_GetPrivateKeyAccessRight
释放私钥使用权限: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私钥解密:SDFJmportKeyWithlSKJECC
生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
计算会话密钥:SDF_GenerateKey WithECC
产生协商数据并计算会话密钥:SDF—GenerateAgreementDataAndKeyWithECC
基于 ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
生成会话密钥并用密钥加密密钥加密输出: SDF_GenerateKeyWithKEK
导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
销毁会话密钥:SDF_DestroyKey
非对称算法运算类函数
外部公钥 RSA 运算:SDF_ExternalPublicKeyOperation_RSA
内部公钥 RSA 运算:SDF_InternalPublicKeyOperation_RSA
内部私钥 RSA 运算:SDF_InternalPrivateKeyOperation_RSA
外部密钥 ECC 验证:SDF_ExternalVerify_ECC
内部密钥 ECC 签名:SDF_InternalSign_ECC
内部密钥 ECC 验证:SDF_InternalVerify_ECC
外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC
对称算法运算类函数
对称加密:SDF_Encrypt
对称解密:SDF_Decrypt
计算MAC:SDF_CalculateMAC
杂凑运算类函数
杂凑运算初始化:SDF_HashInit
多包杂凑运算:SDF_HashUpdate
杂凑运算结束:SDF_HashFinal
比较异同
同:大致流程相似,先连设备,进行设备操作,然后进行密钥管理,然后进行算法运算,且密码算法的大致相似,都初始化,单组操作,多组操作,结束这四步。
异:使用接口不同,Crypto API使用CSP,PKCS#11使用KI,GMT 0016-2012使用SKF,GMT 0018-2012使用SDF。
以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
PKCS#11
SKF
Crypto API