实验一-密码引擎-3-加密API研究

news/发布时间2024/5/4 3:37:32

一、微软的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密码算法使用规范

image

四、GMT 0018-2012密码设备应用接口规范

GMT 0018-2012 文件查看

接口标准

GMT 0018-2012标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。

规范性引用文件

下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。
其中还包括了对部分术语的规定:

image

使用方式

CryptoAPI

使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。

PKCS#11

image

image

image

GMT 0016-2012 智能密码钥匙密码应用接口规范

image

image

GMT 0018-2012密码设备应用接口规范

image

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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/45276354.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

实验一-密码引擎-加密API的研究

一、任务详情 密码引擎API的主要标准和规范包括: 1 微软的Crypto API 2 RAS公司的PKCS#11标准 3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等 研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同…

小美的数组操作(美团2024届秋招笔试第二场编程真题)

题面核心思想 可以从示例中看出 当 sum / n 能够整除时 我们选择平均数作为众数即可 不能整除时 也就表示着不可能让所有数相同 那么我们可以舍弃掉一个数a 记剩下的数集合为 b 那么当 b 需要 +1 或 -1 后可能会剩下一些数 那么我们可以选择让 a去执行相反操作从而不影响 b 中剩…

树状数组快速入门

树状数组、 Fenwick Tree 或 Binary Indexed Tree ,通常用缩写 BIT 代表。 是一种 “一种基于二进制 lowbit ,用于维护(加法、位运算、max、gcd 的)前缀和的树形数组” 。 可以叫做 一个树状数组 或 一棵 Fenwick Tree 。 重要性质:同时满足即是数组又是树的性质。针对定义…

蓝桥杯2020年C组-试题I-数字三角形(简化版-少一个左右路径差不大于1条件)

1. 题目介绍上图给出了一个数字三角形。 从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。 输入格式 输入的第一行包…

who-wants-to-be-king 1

配置虚拟机 首先进行配置网络适配器,将靶机和kali攻击机放在nat下即可 web渗透 ip扫描 nmap -sP 192.168.11.0/24得到目标机ip 详细扫描 nmap -A 192.168.11.5 -p 0-65535得到22,80端口 访问80端口下载文件,记事本打开,发现一串base64编码解码得到dracarys 猜测为ssh登录密…

ZOMI的AI编译原理2

传统的编译器GCCGCC编译过程和原理 GCC的主要特征是一个可移植的编译器,支持多种硬件平台 跨平台交叉编译 有多种语言前端,用于解析不同的语言 模块化设计,可加入新语言和新CPU架构支持 是开源自由软件,可免费使用GCC的编译流程 GCC的编译过程可以大致分为预处理、编译、汇…