首页 > 其他分享 >实验一-密码引擎-3-加密API研究

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

时间:2024-04-14 20:13:57浏览次数:34  
标签:API 加密 函数 证书 SDF 引擎 密钥 上下文

密码引擎API的主要标准和规范包括:
1 微软的Crypto API
2 RAS公司的PKCS#11标准
3 中国商用密码标准:GMT 0016-2012 智能密码钥匙密码应用接口规范,GMT 0018-2012密码设备应用接口规范等

研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链接。
内容:
0 查找各种标准的原始文档,研究学习(至少包含Crypto API,PKCS#11,GMT 0016-2012,GMT 0018-2012)(5分)
1 总结这些API在编程中的使用方式(5分)
2 列出这些API包含的函数,进行分类,并总结它们的异同(10分)
3 以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接(10分)

密码引擎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开发的。

1.1 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

得到密钥的参数

CryptaetUserKey

得到一个密钥交换或签名密钥的句柄

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安全应用需要实现的接口。 由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS#11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。

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为例,写出调用不同接口的代码

CryptoAPI

需要使用x64编译

EncryptDecryptFile

EncrypteFile

DecryptFile


原始C文件和加密后二进制文件和解密出来的文件

EnumCerts
枚举证书

Sign_Verify

PKCS#11

需要使用win32编译
EnumObj

这里登入显示需要输入PIN码,输入Key的密钥就行了。
exportcert

public key object

private key object

GetUSBInfos

PKCSDemo


RSA Sign

RSA Verify

RSA Encrypt

RSA Decrypt

PKCStest


SKF

DevAuth

EncryptData

RemoteUnblock

Signature

代码链接:
https://gitee.com/xintaibengleya/zuoye/tree/master/

标签:API,加密,函数,证书,SDF,引擎,密钥,上下文
From: https://www.cnblogs.com/ljy12392/p/18134597

相关文章

  • 密码引擎-加密API研究
    任务详细密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交......
  • 实验一-密码引擎-3-加密API
    实验一-密码引擎-3-加密API研究任务详情密码引擎API的主要标准和规范包括:微软的CryptoAPIRAS公司的PKCS#11标准中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出......
  • 实验一-密码引擎-3-加密API研究
    密码引擎API的主要标准和规范包括:微软的CryptoAPIRAS公司的PKCS#11标准中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客链接和代码链......
  • Web APIs
    0x01概述API是一些预先定义的函数,提供应用程序与开发人员基于某软件或硬件访问一组例程的能力WebAPIs是W3C组织的标准,是JS独有的部分WebAPI是浏览器提供的一套操作浏览器功能和页面元素的API,即DOM与BOM0x02DOM(1)简介文档对象模型(DocumentObjectModel)是......
  • TextIn合合信息的API使用心得
    在大学生服务外包杯的比赛中,我们组选了A29的赛题,是合合信息公司发布的赛题该赛题的意图是让我们使用它们公司开发的大模型api接口解决现实中的问题,在textin中的api接口中主要包含了以下几个方面的产品1.通用文字识别2.图像处理3.车辆相关识别4.国内票据识别等等我们组开发应用......
  • jy验证码协议加密分析学习记录
    目录流程参考免责声明:分析请求与加密参数register请求获取challenge和gt第一次W值分析第二次提交W分析第二次W明文值分析第三个W值分析验证小坑流程参考免责声明:本文章主要用于技术交流学习,作者不承担任何滥用技术所产生的法律责任。如有侵权,请联系作者删除!分析请求与加......
  • 密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • GRPC - Unit testing Production-Grade APIs
      ......
  • 实验一-密码引擎-3-加密API研究
    任务详情密码引擎API的主要标准和规范包括:1微软的CryptoAPI2RAS公司的PKCS#11标准3中国商用密码标准:GMT0016-2012智能密码钥匙密码应用接口规范,GMT0018-2012密码设备应用接口规范等研究以上API接口,总结他们的异同,并以龙脉GM3000Key为例,写出调用不同接口的代码,提交博客......
  • 密码引擎3
    一、微软的CryptoAPI(一)研究学习CryptoAPI系统体系结构WebCryptoAPIWebCryptographyAPICSP开发基础--CryptoAPI函数简介CryptoAPI是应用程序编程接口,使应用程序开发人员能够将身份验证、编码和加密添加到基于Windows的应用程序。CryptoAPI系统体系结构由五个主要......