密码引擎-API研究
-
微软的Crypto API
-
RAS公司的PKCS#11标准
-
中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等
1 Crypto API
微软的CryptoAPI是Win32平台下为应用程序开发者提供的数据加密和安全的编码接口。CryptoAPI函数集包含了基本的ASN.1的编码、解码,散列,数据加密和解密,数字证书管理等重要的密码学应用功能。数据的加密、解密支持对称和非对称两类算法。CryptoAPI是所有微软的Win32的应用程序以及第三方厂商应有程序使用的数据加密接口,诸如Internet Explorer、OutLook、Adobe等应用都是基于CryptoAPI开发的。
Crypto API
CryptoAPI本身不实现密码运算相关操作,而是操作系统通过调用CryptoSPI函数接口相应的加密服务提供者函数(CSP)来实现。CryptoAPI函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。但是,实际上有些应用程序只能与特定的CSP协作。CSP与应用程序之间的关系类似于Windows GDI模型。CSP就类似于图形硬件驱动程序。
1.2 Crypto API包含的函数
CryptoAPI体系主要由以下几部分组成:
基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。
1.2.1 基本加密函数
服务提供者函数
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 |
校验一个数字签名 |
1.2.2 证书和证书库函数
这组函数是管理、使用和取得证书、证书撤销列表和证书信任列表。
证书库函数:一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
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 属性 |
1.2.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 |
通过检查证书链来确定它的完整性 |
1.2.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 |
验证一个签名消息 |
1.2.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 包那样解码,并且用指定口令解密 |
2 PKCS#11
加密令牌接口标准PKCS#11由RSA Security制定,定义了加密令牌的本机编程接口,例如硬件加密加速器和智能卡。使用JCA和JCE API的现有应用程序可以使用PKCS#11提供程序访问本机PKCS#11令牌。无需修改应用程序。唯一的要求是正确配置提供程序。
2.1 PKCS#11
在密码系统中,PKCS#11是公钥加密标准(PKCS, Public-Key Cryptography Standards)中的一份子 ,由RSA实验室(RSA Laboratories)发布,它为加密令牌定义了一组平台无关的API ,如硬件安全模块和智能卡。 PKCS#11称为Cyptoki,定义了一套独立于技术的程序设计接口,USBKey安全应用需要实现的接口。
2.2 PKCS#11包含的函数
2.2.1 通用函数
C_Initialize | Cryptoki初始化函数 |
C_Finalize | 结束Cryptoki的操作 |
C_GetInfo | 获取C_Finalize的信息 |
C_GetFunctionList |
获取函数列表指针 |
2.2.2 Slot/Token 管理函数
C_GetSlotList | 获取Slot的列表 |
C_GetSlotInfo | 获取Slot的信息 |
C_GetTokenInfo | 获取TOKEN的信息 |
C_WaitForSlotEvent | 等待Slot的事件发生 |
C_GetMechanismList | 获取机制列表 |
C_GetMechanismInfo | 获取机制信息 |
C_InitToken | 初始化Token |
C_SetPIN | 设定PIN |
C_InitPIN | 初始化PIN |
2.2.3 会话管理函数
C_OpenSession | 打开会话 |
C_CloseSession | 关闭会话 |
C_CloseAllSessions | 关闭所有会话 |
C_GetSessionInfo | 获取会话信息 |
C_GetOperationState | 获取操作状态 |
C_SetOperationState | 设定操作状态 |
C_Login | 登录 |
C_Logout | 退出登录 |
2.2.4 对象管理函数
C_CreateObject | 创建对象 |
C_CopyObject | 拷贝对象 |
C_DestroyObject | 删除对象 |
C_GetObjectSize | 获取对象大小 |
C_GetAttributeValue | 获取属性值 |
C_SetAttributeValue | 设定属性值 |
C_FindObjectInit | 查看对象的初始化操作 |
C_FindObjects | 查找对象 |
C_FindObjectsFinal | 结束查找对象的操作 |
2.2.5 加密函数
C_EncryptInit | 加密初始化 |
C_Encrypt | 加密操作 |
C_EncryptUpdate | 加密操作 |
C_EncryptFinal | 结束加密的操作 |
2.2.6 解密函数
C_DecryptInit | 初始化 |
C_Decrypt | 解密操作 |
C_DecryptUpdate | 解密操作 |
C_DecryptFinal | 结束加密的操作 |
2.2.7 摘要函数
C_DigestInit | 摘要初始化 |
C_Digest | 摘要 |
C_DigestUpdate | 摘要 |
C_DigestKey | 对KEY进行摘要 |
C_DigestFinal | 结束摘要操作 |
2.2.8 签名函数
C_SignInit | 签名初始化 |
C_Sign | 签名 |
C_SignUpdate | 签名 |
C_SignFinal | 结束签名操作 |
C_SignRecoverInit | 可恢复签名的初始化 |
C_SignRecover | 可恢复签名的操作 |
2.2.9 校验函数
C_VerifyInit | 校验初始化 |
C_Verify | 校验 |
C_VerifyUpdate | 校验 |
C_VerifyFinal | 结束校验操作 |
C_VerifyRecoverInit | 可恢复校验操作初始化 |
C_VerifyRecover | 可恢复校验 |
2.2.10 KEY管理函数
C_GenerateKey | 生成KEY |
C_GenerateKeyPair | 生成公私钥对 |
C_WrapKey | 对KEY进行打包 |
C_UnwrapKey | 对KEY进行解包 |
C_DeriveKey |
派生KEY |
2.2.11 随机数产生函数
C_SeedRandom | 设定随机种子 |
C_GenerateRandom | 生成随机数 |
2.2.12 双效加密函数
C_DigestEncryptUpdate |
继续类似的多部分摘要和加密操作 |
C_DecryptDigestUpdate |
继续类似的多部分解密和摘要操作 |
C_SignEncryptUpdate |
继续类似的多部分签名和加密操作 |
C_DecryptVerifyUpdate |
继续类似的多部分解密和鉴定操作 |
2.2.13 并行功能管理函数
C_GetFunctionStatus |
已废弃函数,返回CKR_FUNCTION_NOT_PARALLEL |
C_CancelFunction |
已废弃函数,返回CKR_FUNCTION_NOT_PARALLEL |
3 GMT 0016-2012 智能密码钥匙密码应用接口规范
规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。
适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
3.1 GMT 0016-2012
调用头文件以及接口进行使用
3.2 GMT 0016-2012包含的函数
3.2.1 设备管理类函数
SDF_OpenDevice | 打开设备 |
SDF_CloseDevice | 关闭设备 |
SDF_OpenSession | 创建会话 |
SDF_CloseSession | 关闭会话 |
SDF_GetDeviceInfo | 获取设备信息 |
SDF_GenerateRandom | 产生随机数 |
SDF_GetPrivateKeyAccessRight | 获取私钥使用权限 |
SDF_ReleasePrivateKeyAccessRight | 释放私钥获取权限 |
3.2.2 密钥管理类函数
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_ExchangeDigitEnvelopeIaseOnRSAH | 基于RSA算法的数字信封转换 |
SDF_ExportSignPublicKey_ECC | 导出ECC签名公钥 |
SDF_ExportEncPublicKey_ECC | 导出ECC加密公钥 |
SDF_GenerateKeyPair_ECC | 产生ECC非对称密钥对并输出 |
SDF_GenerateKeyWithIPK_ECC | 生成会话密钥并用内部ECC公钥加密输出 |
SDF_GenerateKeyWithEPK_ECC | 生成会话密钥并用外部ECC公钥加密输出 |
SDF_ImportKeyWithISKECC | 导入会话密钥并用内部 ECC私钥解密 |
SDF_GenerateAgreementDataWithECC | 生成密钥协商参数并输出 |
SDF_GenerateKeyWihECC | 计算会话密钥 |
SDF_GenerateAgreermentDataAndKeyWithECC | 产生协商数据并计算会话密钥 |
SDF_ExchangeDigitEnvelopeBaseOnECC | 基于ECC算法的数字信封转换 |
SDF_GenerateKeyWithKEK | 生成会话密钥并用密钥加密密钥加密输出 |
SDF_ImportKeyWithKEK | SDF_GenerateKey WitlKEK导入会话密钥并用密钥加密密钥解密 |
SDF_DestroyKey | 销毁会话密钥 |
3.2.3 非对称算法运算类函数
SDF_ExternalPublicKeyOperation_RSA | 外部公钥RSA运算 |
SDF_InternalPublicKeyOperation_RSA | 内部公钥RSA运算 |
SDF_InternalPrivateKeyOperation_RSA | 内部私钥RSA运算 |
SDF_ExternalVerify_ECC | 外部密钥ECC验证 |
SDF_InternalSign_ECC | 内部密钥ECC签名 |
SDF_InternalVerify_ECC | 内部密钥ECC验证 |
SDFExternalEncrypt_ECC | 外部密钥EC加密 |
3.2.4 对称算法运算类函数
SDF_ Encrypt | 对称加密 |
SDF_Dccrypt | 对称解密 |
SDF_CalculateMAC | 计算MAC |
3.2.5 杂凑运算类函数
SDF HashInit | 杂凑运算初始化 |
SDF HashUpdate | 多包杂凑运算 |
SDF_HashFinal | 杂凑运算结束 |
3.2.6 用户文件操作类函数
SDF_CreateFile | 创建文件 |
SDF_ReadFile | 读取文件 |
SDF_WriteFile | 写文件 |
SDF_DeleteFile | 删除文件 |
4.以龙脉GM3000Key为例,写出调用不同接口的代码
4.1 调用Crypto API