CSP开发基础--CryptoAPI函数简介
来源:互联网 发布:mac rar解压 编辑:程序博客网 时间:2024/05/20 03:07
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 包那样解码,并且用指定口令解密
- CSP开发基础--CryptoAPI函数简介
- CSP开发基础--CryptoAPI函数简介
- CSP开发基础--CryptoAPI函数简介
- CSP开发基础--CryptoAPI函数简介
- CSP开发基础--CSP入门简介
- CSP开发基础--CSP入门简介
- CSP开发基础--CSP入门简介
- CSP开发基础--CSP入门简介
- CSP开发基础--CSP入门简介
- CSP开发基础--CSP入门简介
- CSP开发基础--CSP入门简介
- CSP基础-CSP入门简介
- 转载:公钥、私钥、USBKey、CSP、数字证书和CryptoAPI的简介
- CSP开发基础--CSP开发流程
- CSP开发基础--CSP开发流程
- CSP开发基础--CSP开发流程
- CSP开发基础--数字证书调用CSP过程
- CSP开发基础--数字证书调用CSP过程
- 车载信息系统平台的未来发展
- 外观模式(Facade Pattern)
- jasperreports jrxml文档格式分析(转)
- 未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
- 自定义竖型TabWidget
- CSP开发基础--CryptoAPI函数简介
- 如何修复损坏的MySQL数据表[转]
- 【PHP】 php深复制和浅复制
- PHP mail 发邮件
- Qt creator 设置按键字体颜色
- java中xml的解析
- 简单XML与JSON的读取比较
- InstallShield 中文函数解释
- CEDIT_SetSel()