密码引擎API的主要标准和规范包括:
- 微软的Crypto API
- RSA公司的PKCS#11标准
- 中国商用密码标准:GM/T 0016-2012 智能密码钥匙密码应用接口规范,GM/T 0018-2012密码设备应用接口规范等
一、Crypto API
Crypto API作为一部分 Microsoft Windows 提供的应用程序编程接口(API) ,提供了一组允许应用程序在对用户的敏感私钥数据提供保护时,以灵活的方式对数据进行加密或数字签名的函数,而实际的加密操作是由称为加密服务提供程序 (CSP) 的独立模块执行。
Crypto API函数使用“加密服务提供者”(CSP) 完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。CSP与应用程序之间的关系类似于Windows GDI模型,CSP就类似于图形硬件驱动程序。
Crypto API使用两种密钥:会话密钥与公共/私人密钥对。会话密钥使用相同的加密和解密密钥,这种算法较快,但必须保证密钥的安全传递。公共/私人密钥对使用一个公共密钥和一个私人密钥,私人密钥只有专人才能使用,公共密钥可以广泛传播。如果密钥对中的一个用于加密,另一个一定用于解密。公共/私人密钥对算法很慢,一般只用于加密小批数据,例如用于加密会话密钥。
Crypto API支持两种基本的编码方法:流式编码和块编码。流式编码在明码文本的每一位上创建编码位,速度较快,但安全性较低。块编码在一个完整的块上(一般为64位)工作,需要使用填充的方法对要编码的数据进行舍入,以组成多个完整的块。这种算法速度较慢,但更安全。
Crypto API运行的环境。
首先需要Crypt32.lib,将它加到project->setting->link下面,当然你也可以在程序中用#pragma comment (lib, "crypt32.lib")加入。
在程序开头,你要加入两个头文件 windows.h 和 Wincrypt.h,和一个#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
Crypto API函数
基本加密函数
|
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 |
服务提供者函数:
|
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 结构进行编码,此函数支持内存分配选项 |
数据加密/解密函数:
|
CryptDecrypt |
使用指定加密密钥来解密一段密文 |
|
CryptEncrypt |
使用指定加密密钥来加密一段明文 |
|
CryptProtectData |
执行对DATA_BLOB 结构的加密 |
|
CryptUnprotectData |
执行对DATA_BLOB 结构的完整性验证和解密 |
哈希和数字签名函数:
|
CryptCreateHash |
创建一个空哈希对象 |
|
CryptDestoryHash |
销毁一个哈希对象 |
|
CryptDuplicateHash |
复制一个哈希对象 |
|
CryptGetHashParam |
得到一个哈希对象参数 |
|
CryptHashData |
对一块数据进行哈希,把它加到指定的哈希对象中 |
|
CryptHashSessionKey |
对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
|
CryptSetHashParam |
设置一个哈希对象的参数 |
|
CryptSignHash |
对一个哈希对象进行签名 |
|
CryptVerifySignature |
校验一个数字签名 |
证书和证书库函数:
|
CertAddStoreToCollection |
在证书库中增加一个证书 |
|
CertCloseStore |
关闭一个证书库句柄 |
|
CertControlStore |
如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知 |
|
CertDuplicateStore |
通过增加引用计数来复制证书库句柄 |
|
CertEnumPhysicalStore |
对于指定系统库枚举物理库 |
|
CertEnumSystemStore |
枚举所有可用的系统库 |
|
CertEnumSystemStoreLocation |
枚举可用系统库的所有位置 |
|
CertGetStoreProperty |
得到一个库的属性 |
|
CertOpenStore |
使用指定库类型来打开证书库 |
|
CertOpenSystemStore |
打开一个系统证书库 |
|
CertRegisterPhysicalStore |
在一个注册系统库里增加一个物理库 |
|
CertRegisterSystemStore |
注册一个系统库 |
|
CertRemoveStoreFromCollection |
从一个库集合里删除证书库 |
|
CertSaveStore |
保存证书库 |
|
CertSetStoreProperty |
设置证书属性 |
|
CertUnregisterPhysicalStore |
从系统库中删除一个物理库 |
|
CertUnregisterSystemStore |
反注册一个指定系统库 |
维护函数:
|
CertAddSerializeElementToStore |
在库中增加一系列证书或CRL |
|
CertCreateContext |
从编码字节中创建指定上下文 |
|
CertEnumSubjectInSortedCTL |
在CTL 库中枚举信任主题 |
|
CertFindSubjectInCTL |
在CTL 中寻找指定主题 |
|
CertFindSubjectInSortedCTL |
在分类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
PKCS# 11标准定义了与密码令牌(如硬件安全模块(HSM)和智能卡)的独立于平台的API,API定义了最常用的加密对像类型(RSA密钥,X.509证书,DES / 三重DES密钥等)以及使用,创建/生成,修改和删除这些对象所需的所有功能。
PKCS# 11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的。
插入Usbkey,使用11这个端口,只能导出公钥和证书,在加密解密,签名验证的过程,都是在usbkey内部进行操作,然后将结果导出到外部。
PKCS#11函数类:
CKF_ENCRYPT:加密类
CKF_DECRYPT:解密类
CKF_DIGEST:摘要类
CKF_SIGN:签名类
CKF_SIGN_RECOVER:可恢复签名类
CKF_VERIFY:验证类
CKF_VERIFY_RECOVER:可恢复验证类
CKF_GENERATE:密钥产生
CKF_GENERATE_KEY_PAIR:密钥对产生
CKF_WRAP:密钥封装
CKF_UNWRAP:密钥解封
CKF_DERIVE:密钥派生
各类函数

三、GM/T 0016-2012 智能密码钥匙密码应用接口规范
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数数据类型、参数的定义和设备的安全要求。
本标准适用于智能密码钥匙产品的研制、使用和检测。
智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间,如下图所示。

设备管理系列函数:

应用管理系列函数:

容器管理系列函数:

密码服务系列函数:


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

密钥管理类函数:


非对称算法运算类函数

对称算法运算类函数

杂凑运算类函数

用户文件操作类函数

差异:Crypto API与PKCS#11
CryptoAPI是通过容器来组织密钥。一个容器可以存放两个RSA密钥对,一个用于签名验证,一个用于加解密。此外每个用户在加密对话其间还会随机产生许多会话密钥。
PKCS#11没有容器概念,它对密钥数据的保存和组织主要通过对象。p11定义了三种对象类型:数据对象,证书对象和密钥对象。
在CryptoAPI中的证书和证书库函数对应着PKCS#11中槽和令牌管理函数,其中CryptoAPI中多了证书库回调函数,可以进行返回操作。
同的地方:
肯定要有最基本的加解密函数,以及签名和验证函数,以及证书的管理函数、密钥管理函数、信息处理函数。