一、微软的Crypto API
CryptoAPI 系统体系结构
Web Crypto API
CSP开发基础--CryptoAPI函数简介
Crypto API结构
基本加密函数
- 用于连接到 CSP 的_上下文函数_。 这些函数使应用程序能够按名称选择特定的 CSP,或选择可以提供所需功能类别的特定 CSP。
- 用于生成和存储加密密钥的密钥生成函数。 包括对更改 链接模式、 初始化向量和其他加密功能的完全支持。 有关详细信息,请参阅 密钥生成和交换函数。
- 用于交换或传输密钥的密钥交换_函数_。 有关详细信息,请参阅 加密密钥存储和交换 以及 密钥生成和交换函数。
证书编码/解码函数
用于加密或解密数据的函数。 还支持 对数据进行哈希处理 。 有关详细信息,请参阅 数据加密和解密函数 和数据 加密和解密。
证书存储函数
用于管理数字证书集合的函数。 有关详细信息,请参阅 数字证书 和 证书存储函数。
简化的消息函数
- 用于加密和解密消息与数据的函数。
- 用于对消息和数据进行签名的函数。
- 用于验证所接收消息和相关数据上签名的真实性的函数。
- 有关详细信息,请参阅 简化的消息 和 简化的消息函数
低级别消息函数
用于执行简化消息函数执行的所有任务的函数。 与简化的消息函数相比,低级别消息函数提供更大的灵活性,但需要更多的函数调用。 有关详细信息,请参阅 低级别消息 和 低级别消息函数。
CPS加密过程
CryptoAPI 函数使用 加密服务提供商 (CSP) 执行加密和解密,并提供密钥存储和安全性。 这些 CSP 是独立的模块。 理想情况下,CSP 将写入到独立于特定应用程序,以便任何应用程序都使用各种 CSP 运行。 但是,实际上,某些应用程序具有需要自定义云解决方案提供商的特定要求。 这与 Windows GDI 模型进行比较。 CSP 类似于图形设备驱动程序。
系统中密钥的保护质量是云解决方案提供商而不是整个系统的设计参数。 这样,应用程序就可以在不修改的情况下在各种安全上下文中运行。
访问应用程序必须仔细限制加密内部。 这有助于进行安全且可移植的应用程序开发。
以下三个设计规则适用:
- 应用程序无法直接访问密钥材料。 由于所有键控材料都是在云解决方案提供商内生成的,应用程序通过不透明句柄使用,因此应用程序或其关联的 DLL 没有泄露键控材料或从不良随机来源选择键控材料的风险。
- 应用程序无法指定加密操作的详细信息。 云解决方案提供商接口允许应用程序选择加密或签名算法,但每个加密操作的实现由云解决方案提供商完成。
- 应用程序不会处理用户 凭据 或其他用户身份验证数据。 用户身份验证由云解决方案提供商完成;因此,具有高级身份验证功能(如生物识别输入)的未来 CSP 将正常运行,而无需更改应用程序身份验证模型。
至少,云解决方案提供商由动态链接库 (DLL) 和签名文件组成。 签名文件是确保 CryptoAPI 识别云解决方案提供商所必需的。 CryptoAPI 定期验证此签名,以确保检测到任何篡改云解决方案提供商。
某些 CSP 可以在通过本地 RPC 调用的地址分隔服务或通过系统设备驱动程序调用的硬件中实现其功能的一小部分。 隔离地址分隔服务或硬件中的全局密钥状态和中央加密操作,使密钥和操作安全,防止在应用程序数据空间内篡改。
应用程序利用特定于特定云解决方案提供商的属性是不明智的。 例如,通过 CryptoAPI) 提供的 Microsoft 基础加密提供程序 (支持 40 位会话密钥和 512 位公钥。 操作这些密钥的应用程序必须避免假设存储这些密钥所需的内存量,因为如果使用其他云解决方案提供商,应用程序可能会失败。 编写良好的应用程序必须适用于各种 CSP。
有关可用于 CryptoAPI 的加密提供程序类型和预定义 CSP 的详细信息,请参阅 加密提供程序类型和Microsoft 加密服务提供程序。
使用任何加密 API 的应用程序调用的第一个 CryptoAPI 函数是 CryptAcquireContext 函数。 此函数返回特定 CSP 的句柄,其中包括 CSP 中特定 密钥容器 的规范。 此密钥容器是专门请求的密钥容器,或者是当前登录用户的默认密钥容器。
CryptAcquireContext 还可以创建新的密钥容器。 有关详细信息,请参阅 示例 C 程序:创建密钥容器和生成密钥 和 示例 C 程序:使用 CryptAcquireContext。
(CSP) 的加密服务提供程序 具有名称和类型。 例如,操作系统当前附带的其中一个 CSP 的名称是 Microsoft 基础加密提供程序。 它是 PROV_RSA_FULL 类型提供程序。 每个提供程序的名称都是唯一的;提供程序类型不是。
当应用程序调用 CryptAcquireContext 以获取 CSP 句柄时,它会指定提供程序类型和提供程序名称(可选)。 如果同时指定了类型和名称,则函数会使用匹配的提供程序类型和提供程序名称加载 CSP。 函数返回 CSP 的句柄,该句柄提供对 CSP 和 CSP 中 密钥容器 的访问权限。
当应用程序调用 CryptAcquireContext 并指定提供程序类型但没有提供程序名称时,函数会查找命名提供程序,首先检查与登录用户关联的默认命名提供程序的列表,如果失败,则从与计算机关联的默认命名提供程序列表中查找。 确定提供程序名称后, CryptAcquireContext 函数将搜索该提供程序的 CSP,加载它并返回其句柄。
使用完 CSP 句柄后,通过调用 CryptReleaseContext 函数将其释放。
二、RAS公司的PKCS#11标准
PKCS#11
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。
三、GMT 0016-2012 智能密码钥匙密码应用接口规范
GM/T 0016-2012 文件查看
接口规范
GMT 0016-2012是国家规定的智能密码钥匙密码应用接口规范,规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。适用于智能密码钥匙产品的研制、使用和检测。
规范性引用文件
下列文件对于本标准的应用是必不可少的。凡是注日期的引用文件。仅所注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范
四、GMT 0018-2012密码设备应用接口规范
GMT 0018-2012 文件查看
接口标准
GMT 0018-2012标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。
其中还包括了对部分术语的规定:
使用方式
CryptoAPI
使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
PKCS#11
GMT 0016-2012 智能密码钥匙密码应用接口规范
GMT 0018-2012密码设备应用接口规范
API函数
CryptoAPI
1、基本加密函数
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 的通讯都是通过这些函数。
一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作。
如果使用多于一个以上的CSP,在加密函数调用中就要指定所需的CSP。微软基本加密提供者(Microsoft Base Cryptographic Provider),是缺省绑定到CryptoAPI 里的。如果没有指定其他CSP 时,这个CSP 就是却省的。
每一个CSP 对CryptoAPI 提供了一套不同的实现。一些提供了更加强大的加密算法,而其他一些CSP 包含了对硬件的支持,比如智能卡。另外,一些CSP 偶尔和使用者直接通讯,比如数字签名就使用了用户的签名私钥。
基本加密函数包含了以下几种:
服务提供者函数:
应用程序使用服务提供者函数来连接和断开一个CSP。下面就是主要的API:
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 安装的却省上下文 |
密钥的产生和交换函数:
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面就是主要的一些函数:
CryptAcquireCertificatePrivateKey | 对于指定证书上下文得到一个HCRYPTPROV 句柄和dwKeySpec |
---|---|
CryptDeriveKey | 从一个密码中派生一个密钥 |
CryptDestoryKey | 销毁密钥 |
CryptDuplicateKey | 制作一个密钥和密钥状态的精确复制 |
CryptExportKey | 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中 |
CryptGenKey | 创建一个随机密钥 |
CryptGenRandom | 产生一个随机数 |
CryptGetKeyParam | 得到密钥的参数 |
CryptGetUserKey | 得到一个密钥交换或签名密钥的句柄 |
CryptImportKey | 把一个密钥BLOB 传送到CSP中 |
CryptSetKeyParam | 指定一个密钥的参数 |
编码/解码函数:
有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。以下就是这几个函数:
CryptDecodeObject | 对lpszStructType 结构进行解码 |
---|---|
CryptDecodeObjectEx | 对lpszStructType 结构进行解码,此函数支持内存分配选项 |
CryptEncodeObject | 对lpszStructType 结构进行编码 |
CyptEncodeObjectEx | 对lpszStructType 结构进行编码,此函数支持内存分配选项 |
数据加密/解密函数:
这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
CryptDecrypt | 使用指定加密密钥来解密一段密文 |
---|---|
CryptEncrypt | 使用指定加密密钥来加密一段明文 |
CryptProtectData | 执行对DATA_BLOB 结构的加密 |
CryptUnprotectData | 执行对DATA_BLOB 结构的完整性验证和解密 |
哈希和数字签名函数:
这些函数在应用程序中完成计算哈希、创建和校验数字签名。
CryptCreateHash | 创建一个空哈希对象 |
---|---|
CryptDestoryHash | 销毁一个哈希对象 |
CryptDuplicateHash | 复制一个哈希对象 |
CryptGetHashParam | 得到一个哈希对象参数 |
CryptHashData | 对一块数据进行哈希,把它加到指定的哈希对象中 |
CryptHashSessionKey | 对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
CryptSetHashParam | 设置一个哈希对象的参数 |
CryptSignHash | 对一个哈希对象进行签名 |
CryptVerifySignature | 校验一个数字签名 |
2、证书和证书库函数
这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。这些函数可以分成一下几组:
证书库函数:
一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
以下就是这些函数:
CertAddStoreToCollection | 在证书库中增加一个证书 |
---|---|
CertCloseStore | 关闭一个证书库句柄 |
CertControlStore | 如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知 |
CertDuplicateStore | 通过增加引用计数来复制证书库句柄 |
CertEnumPhysicalStore | 对于指定系统库枚举物理库 |
CertEnumSystemStore | 枚举所有可用的系统库 |
CertEnumSystemStoreLocation | 枚举可用系统库的所有位置 |
CertGetStoreProperty | 得到一个库的属性 |
CertOpenStore | 使用指定库类型来打开证书库 |
CertOpenSystemStore | 打开一个系统证书库 |
CertRegisterPhysicalStore | 在一个注册系统库里增加一个物理库 |
CertRegisterSystemStore | 注册一个系统库 |
CertRemoveStoreFromCollection | 从一个库集合里删除证书库 |
CertSaveStore | 保存证书库 |
CertSetStoreProperty | 设置证书属性 |
CertUnregisterPhysicalStore | 从系统库中删除一个物理库 |
CertUnregisterSystemStore | 反注册一个指定系统库 |
维护函数:
CryptoAPI 提供了证书和证书库函数如下:
CertAddSerializeElementToStore | 在库中增加一系列证书或CRL |
---|---|
CertCreateContext | 从编码字节中创建指定上下文 |
CertEnumSubjectInSortedCTL | 在CTL 库中枚举信任主题 |
CertFindSubjectInCTL | 在CTL 中寻找指定主题 |
CertFindSubjectInSortedCTL | 在分类CTL 中寻找指定主题 |
证书函数:
下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。
CertAddCertificateContextToStore | 在证书库里增加一个证书上下文 |
---|---|
CertAddCertificateLinkToStore | 在证书库里增加一个对不同库里的证书上下文的链接 |
CertAddEncodedCertificateToStore | 把编码证书转换成证书上下文并且把它加到证书库里 |
CertCreateCertificateContext | 从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里 |
CertCreateSelfSignCertificate | 创建一个自签名证书 |
CertDeleteCertificateFromStore | 从证书库里删除一个证书 |
CertDuplicateCertificate | 通过增加引用计数来复制证书上下文 |
CertEnumCertificateInStore | 在证书库里枚举证书上下文 |
CertFindCertificateInStore | 在证书库里寻找证书上下文 |
CertFreeCertificateContext | 释放一个证书上下文 |
CertGetIssuerCertificateFromStore | 在证书库里得到指定主题证书的发行者 |
CertGetSubjectCertificateFromStore | 获得主题证书的上下文 |
CertGetValidUsages | 返回所有证书的用法 |
CertSerializeCertificateStoreElement | 串行化编码证书的证书上下文 |
CertVerifySubjectCertificateContext | 使用发行者来验证主题证书 |
CryptUIDlgViewContext | 显示证书、CRL 或CTL |
CryptUIDlgSelectCertificateFromStore | 从指定库中显示对话框,可以从中选择证书 |
证书撤销列表函数:
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 和它的属性 |
证书信任列表函数:
CertAddCTLContextToStore | 把一个CTL 上下文加入到证书库里 |
---|---|
CertAddCTLLinkToStore | 给不同库里的CRL 上下文添加链接 |
CertAddEncodedCTLToStore | 把编码CTL 转化成CTL 上下文并且把它加到证书库里 |
CertCreateCTLContext | 从编码CTL 中创建CTL 上下文 |
CertDeleteCTLFromStore | 从证书库里删除CTL |
CertDuplicateCTLContext | 通过增加引用计数来复制CTL 上下文 |
CertEnumCTLsInStore | 在证书库里枚举CTL 上下文 |
CertFindCTLInStore | 在证书库里查找CTL 上下文 |
CertFreeCTLContext | 释放CTL 上下文 |
CertSerializeCTLStoreElement | 串行化CTL 上下文的编码CTL 和属性 |
扩展属性函数:
CertEnumCertificateContextProperties | 枚举指定证书上下文的属性 |
---|---|
CertEnumCRLContextProperties | 枚举指定CRL 上下文的属性 |
CertEnumCTLContextProperties | 枚举指定CTL 上下文的属性 |
CertGetCertificateContextProperty | 得到证书属性 |
CertGetCRLContextProperty | 得到CRL 属性 |
CertGetCTLContextProperty | 得到CTL 属性 |
CertSetCertificateContextProperty | 设置证书属性 |
CertSetCRLContextProperty | 设置CRL 属性 |
CertSetCTLContextProperty | 设置CTL 属性 |
3、证书验证函数
证书验证是通过CTL 和证书列表进行的。
使用CTL 的函数:
CertVerifyCTLUsage | 验证CTL 用法 |
---|---|
CryptMsgEncodeAndSignCTL | 编码和验证CTL |
CryptMsgGetAndVerifySigner | 从一个消息中获得和验证CTL |
CryptMsgSignCTL | 对包含CTL 的消息进行签名 |
证书链验证函数:
CertCreateCertificateChainEngine | 为应用程序创建一个新的非却省的链引擎 |
---|---|
CertCreateCTLEntryFromCertificateContextProperties | 创建一个CTL 入口 |
CertDuplicateCertificateChain | 通过增加引用计数来复制证书链 |
CertFindChainInStore | 在证书库里查找证书链 |
CertFreeCertificateChain | 释放证书链 |
CertFreeCertificateChainEngine | 释放证书链引擎 |
CertGetCertificateChain | 从最后一个证书建立一个上下文链表 |
CertSetCertificateContextPropertiesFromCTLEntry | 通过CTL 入口属性来设置证书上下文的属性 |
CertIsValidCRLForCertificate | 通过检查CRL 来确定CRL 是否包括指定被撤销的证书 |
CertVerifyCertificateChainPolicy | 通过检查证书链来确定它的完整性 |
4、消息函数
CryptoAPI 消息函数包括两组:低级消息函数和简化消息函数。
低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。
简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。
低级消息函数:
CryptMsgCalculateEncodedLength | 计算加密消息的长度 |
---|---|
CryptMsgClose | 关闭加密消息的句柄 |
CryptMsgControl | 执行指定的控制函数 |
CryptMsgCountersign | 标记消息中已存在的签名 |
CryptMsgCountersignEncoded | 标记已存在的签名 |
CryptMsgDuplicate | 通过增加引用计数来复制加密消息句柄 |
CryptMsgGetParam | 对加密消息进行编码或者解码后得到的参数 |
CryptMsgOpenToDecode | 打开加密消息进行解码 |
CryptMsgOpenToEncode | 打开加密消息进行编码 |
CryptMsgUpdate | 更新加密消息的内容 |
CryptMsgVerifyCountersignatureEncoded | 验证SignerInfo 结构中标记时间 |
CryptMsgVerifyCountersignatureEncodedEx | 验证SignerInfo 结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO 结构 |
简化消息函数:
CryptDecodeMessage | 对加密消息进行解码 |
---|---|
CryptDecryptAndVerifyMessageSignature | 对指定消息进行解密并且验证签名者 |
CryptDecryptMessage | 解密指定消息 |
CryptEncryptMessage | 加密指定消息 |
CryptGetMessageCertificates | 返回包含消息的证书和CRL 的证书库 |
CryptGetMessageSignatureCount | 返回签名消息的签名者数量 |
CryptHashMessage | 创建消息的哈希 |
CryptSignAndEncryptMessage | 对消息进行签名并且加密 |
CryptSignMessage | 对消息进行签名 |
CryptVerifyDetachedMessageHash | 验证包含已解邦定哈希的哈希消息 |
CryptVerifyDetachedMessageSignature | 验证包含已解邦定签名的签名消息 |
CryptVerifyMessageHash | 验证一个哈希消息 |
CryptVerifyMessageSignature | 验证一个签名消息 |
5、辅助函数
数据管理函数
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 的签名进行验证 |
数据转换函数
CertAlgIdToOID | 把CSP 算法标示符转换成OID |
---|---|
CertGetNameString | 得到证书的主题或颁发者名称并且把它转换成字符串 |
CertNameToStr | 把证书名称BLOB 转换成字符串 |
CertOIDToAlgId | 把OID 转换成CSP 算法表示符 |
CertRDNValueToStr | 把名称值转换成字符串 |
CertStrToName | 把字符串转换成编码证书名称 |
CryptBinaryToString | 把二进制序列转换成字符串 |
CryptFormatObject | 格式化编码数据,返回Unicode 字符串 |
CryptStringToBinary | 把格式化的字符串转换成二进制序列 |
增强密钥用法函数
CertAddEnhancedKeyUsageIdentifier | 在证书EKU 属性中增加一个用法标示符 |
---|---|
CertGetEnhancedKeyUsage | 获得证书的EKU 扩展或属性信息 |
CertRemoveEnhancedKeyUsageIdentifier | 从证书EKU 扩展属性中删除用法标示符OID |
CertSetEnhancedKeyUsage | 设置证书的EKU 属性 |
密钥标示函数
CryptCreateKeyIdentifierFromCSP | 创建CSP 公钥的密钥标示符 |
---|---|
CryptEnumKeyIdentifierProperties | 枚举标示符和其属性 |
CryptGetKeyIdentifierProperty | 从指定密钥标示符中获得指定属性 |
CryptSetKeyIdentifierProperty | 设置指定密钥标示符的属性 |
证书库回调函数
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 属性 |
OID支持函数
CryptEnumOIDFuction | 枚举由编码类型、函数名和OID 指定注册的OID 函数 |
---|---|
CryptEnumOIDInfo | 枚举注册的OID 信息 |
CryptEnumOIDInfo | 使用指定的密钥和组查找OID 信息 |
CryptFreeOIDFuctionAddress | 释放OID 函数地址句柄 |
CryptGetDefaultOIDDllList | 对于指定的函数结合和类型获得却省注册的DLL 入口 |
CryptGetDefaultOIDFuctionAddress | 获得已安装的第一次或下一个却省函数或者加载包含却省函数的DLL |
CryptGetOIDFuctionAddress | 搜索匹配指定编码类型和OID 函数列表,如果没有找到,就查找注册表 |
CryptGetOIDFuctionValue | 获得指定编码类型、函数名称和OID 的值 |
CryptInitOIDFuctionSet | 初始化OID 函数集合的句柄 |
CryptInstallOIDFuctionAddress | 安装可调用的OID 函数地址集合 |
CryptRegisterDefaultOIDFuction | 注册包含却省函数的DLL |
CryptRegisterOIDFuction | 注册包含指定函数的DLL |
CryptRegisterOIDInfo | 注册由CRYPT_OID_INFO 指定的OID 信息 |
CryptSetOIDFuctionValue | 设置编码类型、函数名称等的值 |
CryptUnregisterDefaultOIDFunction | 卸载包含却省函数的DLL |
CryptUnregisterOIDFuction | 卸载包含函数的DLL |
CryptUnregisterOIDInfo | 卸载指定OID 的信息 |
远程对象恢复函数
CryptGetObjectUrl | 从证书、CTL 或CRL 中取得远程对象的URL |
---|---|
CryptRetrieveObjectByUrl | 由URL 指定位置恢复PKI 对象 |
PFX 函数
PFXExportCertStore | 从证书库中导出证书或证书和私钥 |
---|---|
PFXExportCertStoreEx | 从证书库中导出证书或证书和私钥 |
PFXImportCertStore | 从PFX BLOB 导入到指定证书库 |
PFXIsPFXBlob | 把外层BLOB 像pfx 包那样解码 |
PFXVerifyPassword | 把外层BLOB 像pfx 包那样解码,并且用指定口令解密 |
PKCS#11
通用接口
2、槽和令牌管理
3、会话管理
4、对象管理
5、加密函数
6、解密函数
7、消息摘要
8、签名和MAC
9、验证签名和MAC
10、密钥管理
11、随机数生成
GMT 0016-2012 智能密码钥匙密码应用接口规范
设备管理系列函数
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/1.png)
访问控制系列函数
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/2.png)
应用管理系列函数
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/3.png)
文件管理系列函数
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/4.png)
容器管理系列函数
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/5.png)
密码服务系列函数
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/6.png)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/api/7.png)
GMT 0018-2012密码设备应用接口规范
设备管理类函数
设备管理类函数包括以下具体函数:
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
五、以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口)
(一)SKF接口
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/skf1.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/skf2.PNG)
(二)Crypto API
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/cryptoapi1.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/cryptoapi2.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/cryptoapi3.PNG)
Enumcert
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/Enum.PNG)
(三)PKCS#11
DES
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/DES.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/DES2.PNG)
DES3
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/DES3.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/DES32.PNG)
RC2
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/RC2.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/RC22.PNG)
AES
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/AES.PNG)
![](file:///C:/Users/lenovo/Desktop/nnd/%E5%AF%86%E7%A0%81%E5%B7%A5%E7%A8%8B/%E5%8A%A0%E5%AF%86api/AES2.PNG)