CryptoAPI体系主要由一下几部分组成:
基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。

1、基本加密函数
CSP是真正实行加密的独立模块,他既可以由软件实现也可以由硬件实现。但是他必须符合CryptoAPI接口的规范。
每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,这样便于CryptoAPI找到对应的CSP。目前已经有9种CSP类型,并且还在增长。下表列出出它们支持的密钥交换算法、签名算法、对称加密算法和Hash算法。
| CSP类型 | 交换算法 | 签名算法 | 对称加密算法 | Hash算法 |
| PROV_RSA_FULL | RSA | RSA | RC2 | MD5 |
| PROV_RSA_SIG | none | RSA | none | MD5 |
| PROV_RSA_SCHANNEL | RSA | RSA | RC4 | MD5 |
| PROV_DSS | DSS | none | DSS | MD5 |
| PROV_DSS_DH | DH | DSS | CYLINK_MEK | MD5 |
| PROV_DH_SCHANNEL | DH | DSS | DES | MD5 |
| 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 包那样解码,并且用指定口令解密 |
2397

被折叠的 条评论
为什么被折叠?



