实验一-密码引擎-加密API研究
一、查找各种标准的原始文档,研究学习
Ⅰ.Crypto API
- Cryptography
- CryptoAPI System Architecture
- Cryptographic Provider Types
- Microsoft Cryptographic Service Providers
- Cryptography API: Next Generation
- wincrypt.h header
Windows Crypto API是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。Crypto API 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7标准格式编码和解码等。
微软加密服务体系包含3层结构和两个接口,分别为应用程序层、操作系统层(OS)、加密服务提供者层(Cryptographic Service Provider,CSP)、CryptoAPI接口和加密服务提供者接口(CSPI)
CryptoAPI函数使用加密服务提供程序(CSP)进行加密和解密,并提供密钥存储和安全性。它是真正实行加密相关服务的独立模块,既可以由软件实现也可以由硬件实现,但是必须符合CryptoAPI接口的规范。
CSP至少由一个动态链接库(DLL)和一个签名文件组成:签名文件是确保CryptoAPI识别CSP所必需的;CryptoAPI会定期验证此签名,以确保检测到对CSP的任何篡改。
同时,每个CSP都有一个名字和一个类型,名字必须唯一的,这样便于CryptoAPI找到对应的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 |

Ⅱ.PKCS#11
我们把Cryptoki 确定为应用程序与各种各样的便携式密码设备(基于智能卡、PCMCIA卡以及智能软盘)间的一种接口。
Cryptoki 的主要目标是一个低级程序接口,该接口将设备的细节抽象化,并把密码设备的通用模型—密码令牌,或简称令牌—提供给应用程序。
Cryptoki的通用模型如下图所示。模型从一个或多个必须执行某些密码操作的应用程序开始,以一个或多个密码设备结束(在密码设备上执行某些或全部操作)。一个用户可涉及也可不涉及一个程序。

Cryptoki 为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行。每个对应于一个物理阅读器或另一个设备接口的槽可包含一个令牌。当一台密码设备存在于阅读器中,一个令牌就存在于该槽中。当然,由于Cryptoki提供槽和令牌的逻辑视图,所以可能有其它的物理译码。多个槽可能共享一个阅读器。问题在于一个系统有相当多的槽,应用程序能连接到这些槽的其中任何一个或全部槽的令牌上。
Cryptoki的令牌逻辑视图是一个能存储对象和能执行密码函数的设备。Cryptoki定义如下三个对象:数据、证书和密钥。数据对象由应用程序定义。一个证书对象存储一个证书。一个密钥对象存储一个密码密钥。密钥可以是一个公共密钥、一个私钥或是一个保密密钥,每个种类的密钥在专用机制中使用其的辅助型。令牌的这种逻辑视图如下图所示:

Ⅲ.GMT 0016-2012
规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。


Ⅳ.GMT 0018-2012
规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。

二、总结这些API在编程中的使用方式
Ⅰ.Crypto API
CryptoAPI的编程模型同Windows系统的图形设备接口 GDI比较类似,其中加密服务提供者CSP等同于图形设备驱动程序 ,加密硬件(可选)等同于图形硬件,其上层的应用程序也类似,都不需要同设备驱动程序和硬件直接打交道。
CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
Ⅱ.PKCS#11
前文已经进行介绍
Ⅲ.GMT 0016-2012
智能 IC 卡及智能密码钥匙应用接口位于智能 IC 卡及智能密码钥匙应用程序与设备之间,一个设备中存在设备认证密钥和多个应用,应用之间相互独立。
Ⅳ.GMT 0018-2012
密码设备服务层由密码机、密码卡、智能密码终端等设备组成,通过密码设备应用接口向通用密码服务层提供基础密码服务。基础密码服务包括密钥生成、单一的密码运算、文件管理等的服密码设备应用接口。
三、列出这些API包含的函数,进行分类,并总结它们的异同
3.1 CryptoAPI
3.1.1 基本加密函数
(1)服务提供者函数
应用程序使用服务提供者函数来连接和断开一个CSP(Cryptographic Service Providers)。
| 函数名 | 函数功能 |
|---|---|
| CryptAcquireContext | 获得指定CSP 的密钥容器的句柄 |
| CryptContextAddRef | 对HCRYPTPROV 句柄增加一个应用计数 |
| CryptEnumProviders | 枚举当前计算机中的CSP |
| CryptEnumProviderTypes | 枚举CSP 的类型 |
| CryptGetDefaultProvider | 对于指定CSP 类型的却省CSP |
| CryptGetProvParam | 得到一个CSP 的属性 |
| CryptInstallDefaultContext | 安装先前得到的HCRYPTPROV 上下文作为当前却省的上下文 |
| CryptReleaseContext | 释放由CryptAcquireContext 得到的句柄 |
| CryptSetProvider|CryptSetProviderEx | 为指定CSP 类型指定一个却省的CSP |
| CryptSetProvParam | 指定一个CSP 的属性 |
| CryptUninstallDefaultContext | 删除先前由CryptInstallDefaultContext 安装的却省上下文 |
(2)密钥的产生和交换函数
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。
| 函数 | 功能 |
|---|---|
| CryptAcquireCertificatePrivateKey | 对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec |
| CryptDeriveKey | 从一个密码中派生一个密钥 |
| CryptDestoryKey | 销毁密钥 |
| CryptDuplicateKey | 制作一个密钥和密钥状态的精确复制 |
| CryptExportKey | 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中 |
| CryptGenKey | 创建一个随机密钥 |
| CryptGenRandom | 产生一个随机数 |
| CryptGetKeyParam | 得到密钥的参数 |
| CryptGetUserKey | 得到一个密钥交换或签名密钥的句柄 |
| CryptImportKey | 把一个密钥BLOB 传送到CSP中 |
| CryptSetKeyParam | 指定一个密钥的参数 |
(3)编码/解码函数
有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
| 函数 | 函数功能 |
|---|---|
| CryptDecodeObject | 对lpszStructType 结构进行解码 |
| CryptDecodeObjectEx | 对lpszStructType 结构进行解码,此函数支持内存分配选项 |
| CryptEncodeObject | 对lpszStructType 结构进行编码 |
| CyptEncodeObjectEx | 对lpszStructType 结构进行编码,此函数支持内存分配选项 |
(4)数据加密/解密函数
这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
| 函数 | 功能 |
|---|---|
| CryptDecrypt | 使用指定加密密钥来解密一段密文 |
| CryptEncrypt | 使用指定加密密钥来加密一段明文 |
| CryptProtectData | 执行对DATA_BLOB 结构的加密 |
| CryptUnprotectData | 执行对DATA_BLOB 结构的完整性验证和解密 |
(5)哈希和数字签名函数
这些函数在应用程序中完成计算哈希、创建和校验数字签名。
| 函数 | 功能 |
|---|---|
| CryptCreateHash | 创建一个空哈希对象 |
| CryptDestoryHash | 销毁一个哈希对象 |
| CryptDuplicateHash | 复制一个哈希对象 |
| CryptGetHashParam | 得到一个哈希对象参数 |
| CryptHashData | 对一块数据进行哈希,把它加到指定的哈希对象中 |
| CryptHashSessionKey | 对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
| CryptSetHashParam | 设置一个哈希对象的参数 |
| CryptSignHash | 对一个哈希对象进行签名 |
| CryptVerifySignature | 校验一个数字签名 |
3.1.2 证书和证书库函数
这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。
(1)证书库函数
一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
| 函数 | 功能 |
|---|---|
| CertAddStoreToCollection | 在证书库中增加一个证书 |
| CertCloseStore | 关闭一个证书库句柄 |
| CertControlStore | 如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知 |
| CertDuplicateStore | 通过增加引用计数来复制证书库句柄 |
| CertEnumPhysicalStore | 对于指定系统库枚举物理库 |
| CertEnumSystemStore | 枚举所有可用的系统库 |
| CertEnumSystemStoreLocation | 枚举可用系统库的所有位置 |
| CertGetStoreProperty | 得到一个库的属性 |
| CertOpenStore | 使用指定库类型来打开证书库 |
| CertOpenSystemStore | 打开一个系统证书库 |
| CertRegisterPhysicalStore | 在一个注册系统库里增加一个物理库 |
| CertRegisterSystemStore | 注册一个系统库 |
| CertRemoveStoreFromCollection | 从一个库集合里删除证书库 |
| CertSaveStore | 保存证书库 |
| CertSetStoreProperty | 设置证书属性 |
| CertUnregisterPhysicalStore | 从系统库中删除一个物理库 |
| CertUnregisterSystemStore | 反注册一个指定系统库 |
(2)维护函数
| 函数 | 功能 |
|---|---|
| CertAddSerializeElementToStore | 在库中增加一系列证书或CRL |
| CertCreateContext | 从编码字节中创建指定上下文 |
| CertEnumSubjectInSortedCTL | 在CTL 库中枚举信任主题 |
| CertFindSubjectInCTL | 在CTL 中寻找指定主题 |
| CertFindSubjectInSortedCTL | 在分类CTL 中寻找指定主题 |
(3)证书函数
下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。
| 函数 | 功能 |
|---|---|
| CertAddCertificateContextToStore | 在证书库里增加一个证书上下文 |
| CertAddCertificateLinkToStore | 在证书库里增加一个对不同库里的证书上下文的链接 |
| CertAddEncodedCertificateToStore | 把编码证书转换成证书上下文并且把它加到证书库里 |
| CertCreateCertificateContext | 从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里 |
| CertCreateSelfSignCertificate | 创建一个自签名证书 |
| CertDeleteCertificateFromStore | 从证书库里删除一个证书 |
| CertDuplicateCertificate | 通过增加引用计数来复制证书上下文 |
| CertEnumCertificateInStore | 在证书库里枚举证书上下文 |
| CertFindCertificateInStore | 在证书库里寻找证书上下文 |
| CertFreeCertificateContext | 释放一个证书上下文 |
| CertGetIssuerCertificateFromStore | 在证书库里得到指定主题证书的发行者 |
| CertGetSubjectCertificateFromStore | 获得主题证书的上下文 |
| CertGetValidUsages | 返回所有证书的用法 |
| CertSerializeCertificateStoreElement | 串行化编码证书的证书上下文 |
| CertVerifySubjectCertificateContext | 使用发行者来验证主题证书 |
| CryptUIDlgViewContext | 显示证书、CRL 或CTL |
| CryptUIDlgSelectCertificateFromStore | 从指定库中显示对话框,可以从中选择证书 |
(4)证书撤销列表函数
| 函数 | 功能 |
|---|---|
| CertAddCRLContextToStore | 在证书库里增加一个CRL 上下文 |
| CertAddCRLLinkToStore | 在不同的库里增加一个CRL 上下文链接 |
| CertAddEncodedCRLToStore | 把编码CRL 转化成CRL 上下文然后把它加入到证书库中 |
| CertCreateCRLContext | 从编码CRL 中创建CRL 句柄,但不把它加到库中 |
| CertDeleteCRLFromStore | 从证书库里删除一个CRL |
| CertDuplicateCRLContext | 通过增加引用计数来复制CRL 上下文 |
| CertEnumCRLsInStore | 枚举库里的CRL 句柄 |
| CertFindCertificateInCRL | 从指定证书里寻找CRL 列表 |
| CertFindCRLInStore | 在库里寻找CRL 上下文 |
| CertFreeCRLContext | 释放CRL 上下文 |
| CertGetCRLFromStore | 从库里得到CRL 上下文句柄 |
| CertSerializeCRLStoreElement | 串行化CRL 上下文的编码CRL 和它的属性 |
(5)证书信任列表函数
| 函数 | 功能 |
|---|---|
| CertAddCTLContextToStore | 把一个CTL 上下文加入到证书库里 |
| CertAddCTLLinkToStore | 给不同库里的CRL 上下文添加链接 |
| CertAddEncodedCTLToStore | 把编码CTL 转化成CTL 上下文并且把它加到证书库里 |
| CertCreateCTLContext | 从编码CTL 中创建CTL 上下文 |
| CertDeleteCTLFromStore | 从证书库里删除CTL |
| CertDuplicateCTLContext | 通过增加引用计数来复制CTL 上下文 |
| CertEnumCTLsInStore | 在证书库里枚举CTL 上下文 |
| CertFindCTLInStore | 在证书库里查找CTL 上下文 |
| CertFreeCTLContext | 释放CTL 上下文 |
| CertSerializeCTLStoreElement | 串行化CTL 上下文的编码CTL 和属性 |
(6) 扩展属性函数
| 函数 | 功能 |
|---|---|
| CertEnumCertificateContextProperties | 枚举指定证书上下文的属性 |
| CertEnumCRLContextProperties | 枚举指定CRL 上下文的属性 |
| CertEnumCTLContextProperties | 枚举指定CTL 上下文的属性 |
| CertGetCertificateContextProperty | 得到证书属性 |
| CertGetCRLContextProperty | 得到CRL 属性 |
| CertGetCTLContextProperty | 得到CTL 属性 |
| CertSetCertificateContextProperty | 设置证书属性 |
| CertSetCRLContextProperty | 设置CRL 属性 |
| CertSetCTLContextProperty | 设置CTL 属性 |
3.1.3 证书验证函数
证书验证是通过CTL 和证书列表进行的。
(1)使用CTL的函数
| 函数 | 功能 |
|---|---|
| CertVerifyCTLUsage | 验证CTL 用法 |
| CryptMsgEncodeAndSignCTL | 编码和验证CTL |
| CryptMsgGetAndVerifySigner | 从一个消息中获得和验证CTL |
| CryptMsgSignCTL | 对包含CTL 的消息进行签名 |
(2)证书链验证函数
| 函数 | 功能 |
|---|---|
| CertCreateCertificateChainEngine | 为应用程序创建一个新的非却省的链引擎 |
| CertCreateCTLEntryFromCertificateContextProperties | 创建一个CTL 入口 |
| CertDuplicateCertificateChain | 通过增加引用计数来复制证书链 |
| CertFindChainInStore | 在证书库里查找证书链 |
| CertFreeCertificateChain | 释放证书链 |
| CertFreeCertificateChainEngine | 释放证书链引擎 |
| CertGetCertificateChain | 从最后一个证书建立一个上下文链表 |
| CertSetCertificateContextPropertiesFromCTLEntry | 通过CTL 入口属性来设置证书上下文的属性 |
| CertIsValidCRLForCertificate | 通过检查CRL 来确定CRL 是否包括指定被撤销的证书 |
| CertVerifyCertificateChainPolicy | 通过检查证书链来确定它的完整性 |
3.1.4 消息函数
CryptoAPI 消息函数包括两组:
- 低级消息函数
- 简化消息函数。
低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。
(1)低级消息函数
| 函数 | 功能 |
|---|---|
| CryptMsgCalculateEncodedLength | 计算加密消息的长度 |
| CryptMsgClose | 关闭加密消息的句柄 |
| CryptMsgControl | 执行指定的控制函数 |
| CryptMsgCountersign | 标记消息中已存在的签名 |
| CryptMsgCountersignEncoded | 标记已存在的签名 |
| CryptMsgDuplicate | 通过增加引用计数来复制加密消息句柄 |
| CryptMsgGetParam | 对加密消息进行编码或者解码后得到的参数 |
| CryptMsgOpenToDecode | 打开加密消息进行解码 |
| CryptMsgOpenToEncode | 打开加密消息进行编码 |
| CryptMsgUpdate | 更新加密消息的内容 |
| CryptMsgVerifyCountersignatureEncoded | 验证SignerInfo 结构中标记时间 |
| CryptMsgVerifyCountersignatureEncodedEx | 验证SignerInfo 结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO 结构 |
(2) 简化消息函数
| 函数 | 功能 |
|---|---|
| CryptDecodeMessage | 对加密消息进行解码 |
| CryptDecryptAndVerifyMessageSignature | 对指定消息进行解密并且验证签名者 |
| CryptDecryptMessage | 解密指定消息 |
| CryptEncryptMessage | 加密指定消息 |
| CryptGetMessageCertificates | 返回包含消息的证书和CRL 的证书库 |
| CryptGetMessageSignatureCount | 返回签名消息的签名者数量 |
| CryptHashMessage | 创建消息的哈希 |
| CryptSignAndEncryptMessage | 对消息进行签名并且加密 |
| CryptSignMessage | 对消息进行签名 |
| CryptVerifyDetachedMessageHash | 验证包含已解邦定哈希的哈希消息 |
| CryptVerifyDetachedMessageSignature | 验证包含已解邦定签名的签名消息 |
| CryptVerifyMessageHash | 验证一个哈希消息 |
| CryptVerifyMessageSignature | 验证一个签名消息 |
3.1.5 辅助函数
(1)数据管理函数
| 函数 | 功能 |
|---|---|
| CertCompareCertificate | 比较两个证书是否相同 |
| CertCompareCertificateName | 通过比较两个证书名称来决定他们是否相同 |
| CertCompareIntegerBlob | 比较两个整数BLOB |
| CertComparePublicKeyInfo | 通过比较两个证书公钥来决定他们是否相同 |
| CertFindAttribute | 通过OID 来查找属性 |
| CertFindExtension | 通过OID 来查找扩展 |
| CertFindRDNAttr | 通过OID 来查找RDN 属性 |
| CertGetIntendedKeyUsage | 从证书中取得相关密钥用法 |
| CertGetPublicKeyLength | 从公钥BLOB 中取得公钥/私钥长度 |
| CertIsRDNAttrsInCertificateName | 通过指定RDN 数组属性比较证书名称属性来决定证书是否已包含了所有属性 |
| CertVerifyCRLRevocation | 验证主题证书是否在CRL 中 |
| CertVerifyCRLTimeValidity | 验证CRL 的有效时间 |
| CertVerifyRevocation | 验证主题证书是否在CRL 中 |
| CertVerifyTimeValidity | 验证CRL 的有效时间 |
| CertVerifyValidityNesting | 验证主题时间的有效性是否在发行者有效时间内 |
| CryptExportPublicKeyInfo | 导出公钥信息 |
| CryptExportPublicKeyInfoEx | 导出公钥信息(用户可以指定算法) |
| CryptFindCertificateKeyProvInfo | 枚举CSP 和它的密钥容器来查找对应于公钥的相应私钥 |
| CryptFindLocalizedName | 查找指定名字的局部化名称 |
| CryptHashCertificate | 哈希证书内容 |
| CryptHashPublicKeyInfo | 计算公钥信息的哈希 |
| CryptHashToBeSigned | 计算签名内容的信息哈希值 |
| CryptImportPublicKeyInfo | 把公钥信息导入CSP 并且返回它的句柄 |
| CryptImportPublicKeyInfoEx | 把公钥信息导入CSP 并且返回它的句柄 |
| CryptMemAlloc | 分配内存 |
| CryptMemFree | 释放内存 |
| CryptMemRealloc | 重新分配内存 |
| CryptQueryObject | 得到BLOB 或文件的内容信息 |
| CryptSignAndEncodeCertificate | 对信息进行签名并且编码 |
| CryptSignCertificate | 对证书进行签名 |
| CryptVerifyCertificateSignature | 使用公钥信息对主题证书或CRL 的签名进行验证 |
| CryptVerifyCertificateSignatureEx | 使用公钥信息对主题证书或CRL 的签名进行验证 |
(2)数据转换函数
| 函数 | 功能 |
|---|---|
| CertAlgIdToOID | 把CSP 算法标示符转换成OID |
| CertGetNameString | 得到证书的主题或颁发者名称并且把它转换成字符串 |
| CertNameToStr | 把证书名称BLOB 转换成字符串 |
| CertOIDToAlgId | 把OID 转换成CSP 算法表示符 |
| CertRDNValueToStr | 把名称值转换成字符串 |
| CertStrToName | 把字符串转换成编码证书名称 |
| CryptBinaryToString | 把二进制序列转换成字符串 |
| CryptFormatObject | 格式化编码数据,返回Unicode 字符串 |
| CryptStringToBinary | 把格式化的字符串转换成二进制序列 |
(3)增强密钥用法函数
| 函数 | 功能 |
|---|---|
| CertAddEnhancedKeyUsageIdentifier | 在证书EKU 属性中增加一个用法标示符 |
| CertGetEnhancedKeyUsage | 获得证书的EKU 扩展或属性信息 |
| CertRemoveEnhancedKeyUsageIdentifier | 从证书EKU 扩展属性中删除用法标示符OID |
| CertSetEnhancedKeyUsage | 设置证书的EKU 属性 |
(4)密钥标示函数
| 函数 | 功能 |
|---|---|
| CryptCreateKeyIdentifierFromCSP | 创建CSP 公钥的密钥标示符 |
| CryptEnumKeyIdentifierProperties | 枚举标示符和其属性 |
| CryptGetKeyIdentifierProperty | 从指定密钥标示符中获得指定属性 |
| CryptSetKeyIdentifierProperty | 设置指定密钥标示符的属性 |
(5)证书库回调函数
| 函数 | 功能 |
|---|---|
| CertDllOpenStoreProv | 定义库提供者打开函数 |
| CertStoreProvCloseCallback | 决定当证书库引用计数为0 时将发生的动作 |
| CertStoreProvDeleteCertCallback | 决定当从证书库中删除一个证书之前的动作 |
| CertStoreProvDeleteCRLCallback | 决定当从证书库中删除一个CRL 之前的动作 |
| CertStoreProvReadCertCallback | 保留 |
| CertStoreProvReadCRLCallback | 保留 |
| CertStoreProvSetCertPropertyCallback | 决定在CertSetCertificateContextProperty 和CertGetCertificateContext 调用之前的动作 |
| CertStoreProvSetCRLPropertyCallback | 决定在CertSetCRLContextProperty 和CertGetCRLContextProperty 调用之前的动作 |
| CertStoreProvWriteCertCallback | 决定在证书库中加入一个证书前的动作 |
| CertStoreProvWriteCRLCallback | 决定在证书库中加入一个CRL 前的动作 |
| CertStoreProvReadCTL | 读CSP 的CTL 上下文 |
| CertStoreProvWriteCTL | 决定CTL 是否可被加入到证书库中 |
| CertStoreProvDeleteCTL | 决定CTL 是否可被删除 |
| CertStoreProvSetCTLProperty | 决定是否可以设置CTL 的属性 |
| CertStoreProvControl | 当缓冲库和存储库不同时,通知应用程序 |
| CertStoreProvFindCert | 在证书库中查找下一个证书 |
| CertStoreProvFreeFindCert | 释放前一个找到的证书上下文 |
| CertStoreProvGetCertProperty | 得到指定的证书属性 |
| CertStoreProvFindCRL | 查找第一个或下一个匹配的CRL |
| CertStoreProvFreeFindCRL | 释放前一个找到的CRL 上下文 |
| CertStoreProvGetCRLProperty | 得到指定CRL 属性 |
| CertStoreProvFindCTL | 查找第一个或下一个匹配的CTL |
| CertStoreProvFreeFindCTL | 释放前一个找到的CTL 上下文 |
| CertStoreProvGetCTLProperty | 得到指定CTL 属性 |
具体函数和功能参考:CryptoAPI
3.2 PKCS#11
3.2.1 通用接口
| 函数 | 描述 |
|---|---|
| C_Initialize | 初始化 Cryptoki |
| C_Finalize | 整理各种适合 Cryptoki的资源 |
| C_GetInfo | 获得关于Cryptoki的通用信息 |
| C_GetFunctionList | 获得Cryptoki 库函数的进入点 |
3.2.2 槽和令牌管理函数
| 函数 | 功能 |
|---|---|
| C_GetSlotList | 获得系统中槽的名单 |
| C_GetSlotInfo | 获得关于特殊槽的信息 |
| C_GetTokenInfo | 获得关于特殊令牌的信息 |
| C_WaitForSlotEvent | 等待槽事件(令牌插入,转移等) 的发生 |
| C_GetMechanismList | 获得由令牌支持的机制的名单 |
| C_GetMechanismInfo | 获得关于特殊机制的信息 |
| C_InitToken | 初始化一个令牌 |
| C_InitPIN | 初始化普通用户的 PIN |
| C_SetPIN | 改变现在用户的PIN |
3.2.3 会话管理函数
| 函数 | 功能 |
|---|---|
| C_OpenSession | 打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入 |
| C_CloseSession | 关闭一个会话 |
| C_CloseAllSessions | 用令牌关闭所有的会话 |
| C_GetSessionInfo | 获得关于会话的信息 |
| C_GetOperationState | 获得会话的加密操作状态 |
| C_SetOperationState | 设置会话的加密操作状态 |
| C_Login | 注册一个令牌 |
| C_Logout | 从一个令牌注销 |
3.2.3 对象管理函数
| C_CreateObject | 建立一个对象 |
|---|---|
| C_CopyObject | 建立一个对象的拷贝 |
| C_DestroyObject | 销毁一个对象 |
| C_GetObjectSize | 获取字节中一个对象的大小 |
| C_GetAttributeValue | 获取一个对象的属性值 |
| C_SetAttributeValue | 改变一个对象的属性值 |
| C_FindObjectsInit | 初始化一个对象的搜索操作 |
| C_FindObjects | 继续一个对象搜索操作 |
| C_FindObjectsFinal | 完成一个对象搜索操作 |
3.2.4 加密和解密函数
| 函数 | 功能 |
|---|---|
| C_EncryptInit | 初始化一个加密操作 |
| C_Encrypt | 加密单部分数据 |
| C_EncryptUpdate | 继续一个多部分加密操作 |
| C_EncryptFinal | 完成一个多部分加密操作 |
| C_DecryptInit | 初始化一个解密操作 |
| C_Decrypt | 解密单部分加密数据 |
| C_DecryptUpdate | 继续一个多部分解密操作 |
| C_DecryptFinal | 完成一个多部分解密操作 |
3.2.5 消息摘要函数
| 函数 | |
|---|---|
| C_DigestInit | 初始化一个消息摘要操作 |
| C_Digest | 摘要单部分数据 |
| C_DigestUpdate | 继续一个多部分摘要操作 |
| C_DigestKey | 摘要一个密钥 |
| C_DigestFinal | 完成一个多部分摘要操作 |
3.2.5 签名和验签函数
| 函数 | 功能 |
|---|---|
| C_SignInit | 初始化一个签名操作 |
| C_Sign | 签名单部分数据 |
| C_SignUpdate | 继续一个多部分签名操作 |
| C_SignFinal | 完成一个多部分签名操作 |
| C_SignRecoverInit | 初始化一个签名操作,在操作中数据能从签名中恢复 |
| C_SignRecover | 签名单部分数据,在操作中数据能从签名中恢复 |
| C_VerifyInit | 初始化一个鉴定操作 |
| C_Verify | 在单部分数据上鉴定一个签名 |
| C_VerifyUpdate | 继续一个多部分鉴定操作 |
| C_VerifyFinal | 完成一个多部分鉴定操作 |
| C_VerifyRecoverInit | 初始化一个鉴定操作,在操作中数据能从签名中恢复 |
| C_VerifyRecover | 在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复 |
3.2.6 双重目的的加密
| 函数 | 功能 |
|---|---|
| C_DigestEncryptUpdate | 继续类似的多部分摘要和加密操作 |
| C_DecryptDigestUpdate | 继续类似的多部分解密和摘要操作 |
| C_SignEncryptUpdate | 继续类似的多部分签名和加密操作 |
| C_DecryptVerifyUpdate | 继续类似的多部分解密和鉴定操作 |
3.2.7 密钥管理函数
| 函数 | 功能 |
|---|---|
| C_GenerateKey | 产生一个保密密钥 |
| C_GenerateKeyPair | 产生一个公共/私钥对 |
| C_WrapKey | 加密一个密钥 |
| C_UnwrapKey | 解密一个密钥 |
| C_DeriveKey | 从基础密钥派生一个密钥 |
3.2.8 随机数生成函数
| 函数 | 功能 |
|---|---|
| C_SeedRandom | 把一个附加种子材料加入随机数字生成器 |
| C_GenerateRandom | 生成随机数据 |
具体函数内容和功能参考:PKCS#11
3.3 SFK
3.3.1 设备管理系列函数
| 函数名称 | 功能 |
|---|---|
| SKF_WaitForDevEvent | 等待设备插拔事件 |
| SKF_CanceIWaitForDevEvent | 取消等待设备插拔事件 |
| SKF_EnumDev | 枚举设备 |
| SKF_ConnectDev | 连接设备 |
| SKF_DisconnectDev | 断开连接 |
| SKF_GetDevState | 获取设备状态 |
| SKF_SetLabeI | 设置设备标签 |
| SKF_GetDevInfo | 获取设备信息 |
| SKF_LockDev | 锁定设备 |
| SKF_UnIockDev | 解锁设备 |
| SKF_Transmit | 设备命令传输 |
3.3.2 访问控制系列函数
| 函数名称 | 功能 |
|---|---|
| SKF_ChangeDevAuthKey | 修改设备认证密钥 |
| SKF_DevAuth | 设备认证 |
| SKF_ChangePIN | 修改 PIN |
| SKF_GetPINInfo | 获得 PIN码信息 |
| SKF_VerifyPIN | 校验 PIN |
| SKF_UnbIockPIN | 解锁 PIN |
| SKF_CIearSecueState | 清除应用安全状态 |
3.3.3 应用管理系列函数
| 函数名称 | 功 能 |
|---|---|
| SKF_CreateApplication | 创建应用 |
| SKF_EnumApplication | 枚举应用 |
| SKF_DeleteApplication | 删除应用 |
| SKF_OpenApplication | 打开应用 |
| SKF_CloseApplication | 关闭应用 |
3.3.4 文件管理系列函数
| 函数名称 | 功能 |
|---|---|
| SKF_CreateFiIe | 创建文件 |
| SKF_DeIeteFiIe | 删除文件 |
| SKF_EnumFiIes | 枚举文件 |
| SKF_GetFiIeInfo | 获取文件信息 |
| SKF_ReadFiIe | 读文件 |
| SKF_WriteFiIe | 写文件 |
3.3.5 容器管理系列函数
| 函数名称 | 功能 |
|---|---|
| SKF_CreateContainer | 创建容器 |
| SKF_DeIeteContainer | 删除容器 |
| SKF_EnumContainer | 枚举容器 |
| SKF_OpenContainer | 打开容器 |
| SKF_CIoseContainer | 关闭容器 |
| SKF_GetContainerType | 获得容器类型 |
| SKF_ImportCertificate | 导人数字证书 |
| SKF_ExportCertificate | 导出数字证书 |
3.3.6 密码服务系列函数
| 函数名称 | 功 能 |
|---|---|
| SKF_GenRandom | 生成随机数 |
| SKF_GenExtRsAKey | 生成外部 RsA密钥对 |
| SKF_GenRsAKeyPair | 生成 RsA签名密钥对 |
| SKF_ImportRsAKeyPair | 导人 RsA加密密钥对 |
| SKF_RsAsignData | RsA签名 |
| SKF_RsAVerify | RsA验签 |
| SKF_Rs/DxportsesionKey | Rs/生成并导出会话密钥 |
| SKF_DxtRs/PubKeyOperation | Rs/外来公钥运算 |
| SKF_DxtRs/PriKeyOperation | Rs/外来私钥运算 |
| SKF_GenDAAKeyPair | 生成 DAA签名密钥对 |
| SKF_ImportDAAKeyPair | 导人 DAA加密密钥对 |
| SKF_DAAsignCata | DAA签名 |
| SKF_DAAVerify | DAA验签 |
| SKF_DAADxportsesionKey | DAA生成并导出会话密钥 |
| SKF_DxtDAADncrypt | DAA外来公钥加密 |
| SKF_DxtDAACecrypt | DAA外来私钥解密 |
| SKF_DxtDAAsign | DAA外来私钥签名 |
| SKF_DxtDAAVerify | DAA外来公钥验签 |
| SKF_Generate/grementCataWithDAA | DAA生成密钥协商参数并输出 |
| SKF_GenerateKeyWithDAA | DAA计算会话密钥 |
| SKF_Generate/grementCata/ndKeyWithDAA | DAA产生协商数据并计算会话密钥 |
| SKF_DxportPubIicKey | 导出公钥 |
| SKF_ImportsesionKey | 导人会话密钥 |
| SKF_setsymmKey | 明文导人会话密钥 |
| SKF_DncryptInit | 加密初始化 |
| SKF_Dncrypt | 单组数据加密 |
| SKF_DncryptUpdate | 多组数据加密 |
| SKF_DncryptFinaI | 结束加密 |
| SKF_CecryptInit | 解密初始化 |
| SKF_Cecrypt | 单组数据解密 |
| SKF_CecryptUpdate | 多组数据解密 |
| SKF_CecryptFinaI | 结束解密 |
| SKF_CigestInit | 密码杂凑初始化 |
| SKF_Cigest | 单组数据密码杂凑 |
| SKF_CigestUpdate | 多组数据密码杂凑 |
| SKF_CigestFinaI | 结束密码杂凑 |
| SKF_MacInit | 消息鉴别码运算初始化 |
| SKF_Mac | 单组数据消息鉴别码运算 |
| SKF_MacUpdate | 多组数据消息鉴别码运算 |
| SKF_MacFinaI | 结束消息鉴别码运算 |
| SKF_AIoseHandIe | 关闭密码对象句柄 |
四、调用不同接口的代码
4.1Crypto API
4.1.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile

4.1.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts

4.1.3 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify


4.2 PKCS#11
4.2.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos

4.2.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest
DES

RC2

RSA

AES

4.3 SKF
4.3.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\DevAuth


浙公网安备 33010602011771号