• 密码引擎加密API研究


    密码引擎-加密API研究


    目录


    0 任务详情

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

    1 研究学习原始文档

    1.1 CryptoAPI

    1.2 PKCS#11

    PKCS #11

    1.3 GM/T 0016-2012 智能密码钥匙密码应用接口规范

    1.4 GM/T 0018-2012 密码设备应用接口规范

    2 总结这些API在编程中的使用方式

    2.1 CryptoAPI

    2.1.1 体系结构

    CryptoAPI体系架构共由五大部分组成:

    1. 基本加密函数:用于选择CSP、建立CSP连接、产生密钥、交换及传输密钥等操作
    2. 证书编解码函数:用于数据加密、解密、哈希等操作,创建和校验数字签名操作;实现证书、证书撤销列表、证书请求和证书扩展编码和解码操作。
    3. 证书库管理函数:用于数字证书及证书管理等操作。这组函数用于管理证书、证书撤销列表和证书信任列表的使用、存储、获取等。
    4. 简单的消息函数:用于消息处理,比如消息编解码,消息加解密,数字签名及签名验签等操作。它是把多个底层消息函数包装在一起以完成某个特定任务,方便用户使用。
    5. 底层消息函数:底层消息函数对传输的PKCS#7数据进行编码,对接收到的PKCS#7数据进行解码,并且对接收到的消息进行解码和验证。它可以实现简单消息函数可以实现的所有功能,且提供更大的灵活性,但一般需要更多的函数调用。

    2.1.2 基本功能

    1. 密钥管理

      在CryptoAPI中,支持两种类型的密钥:会话密钥、公私钥对。会话密钥也称为对称密钥,用于对称密钥算法。为了保证密钥的安全性,在CryptoAPI中,这些密钥都保存在CSP内部,用户可以通过CryptExportKey以加密密钥形式导出。公私钥用于非对称加密算法。非对称加密算法主要用于加解密会话密钥和数字签名。在CryptoAPI中,一般来说,大多数CSP产生的密钥容器包含两对密钥对,一对用于加密会话密钥,称为交换密钥对,一对用于产生数字签名,称为签名密钥对。在CryptoAPI中所有的密钥都存储在CSP中,CSP负责密钥的创建,销毁,导入导出等操作。

    2. 数据编解码

      CryptoAPI采用的编码方式为ASN.1,编码规则为DER,表示发送数据时先把数据抽象为ASN.1对象,然后使用DER编码规则把ASN.1对象转化为可传输的0,1串;接收方接收到数据后,利用DER解码规则把0,1串转化为ASN.1对象,然后把ASN.1对象转化为具体应用支持的数据对象。

    3. 数据加解密

      在CryptoAPI中约定加密较大数据块时,采用对称密钥算法。通过其封装好的加解密函数来实现数据加解密操作。

    4. 哈希和数字签名

      哈希和数字签名一般用于数据的完整性校验和身份鉴别。CryptoAPI中,通过其封装好的哈希与数字签名函数来实现相关操作。微软公司提供的CSP产生的数字签名遵循RSA标准(PKCS#6)

    5. 数字证书管理

      数字证书主要用于安全通信中的身份鉴别。CryptoAPI中,对数字证书的使用管理函数分为证书与证书库函数、证书验证函数两大部分。

    2.2 PKCS#11

    PKCS#11是使用非常普遍的密码设备接口,在实际应用中,国密的密码设备应用接口规范GM/T 0018-2012与之作用相同,在技术体系架构中处于类似的位置。PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。PKCS#11主要是应用于智能卡和HSM。

    Cryptoki模型

    Cryptoki:Cryptographic Token Interface Standard 密码令牌接口标准,应用程序与各种各样便携式密码设备间的一种接口。设备的种类和所支持的能力的种类取决于专用的Cryptoki库。该标准只定义库的接口,不定义库的实现,接口实现由设备商提供。Cryptoki主要目标是一个低级程序接口,将设备的细节抽象化,并把密码设备的通用模型-密码令牌提供给应用程序。第二目标是资源共享,单个设备能为一个以上的应用程序共享。Cryptoki为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行,密码设备可以按照某一命令集执行某些密码操作,这些命令通常通过标准的设备驱动程序来实现,Cryptoki的作用就是屏蔽这些硬件的差异。

    img

    2.3 SKF

    针对支持国密算法USB KEY设备的应用,我国颁布一个行业标准《智能密码钥匙应用接口规范》(GM/T 0016-2012)中给出,市面上销售的国密算法的USB KEY设备必须支持这个接口规范。因此,只要根据这个规范开发的应用程序,就可以兼容使用不同厂家及品牌的USB KEY产品。由于此规范中函数名称都以SKF开头,所以我们一般把按照此规范提供的设备开发接口库叫做SKF库或SKF接口。

    智能密码钥匙密码应用接口位于智能密码钥匙应用程序和智能密码钥匙设备驱动之间。

    image-20220422185743129

    一个设备中存在设备认证密钥和多个应用,应用之间相互独立。

    image-20220422190034565

    应用由管理员PIN,用户PIN、文件和容器组成,可以存在多个文件和多个容器。每个应用维护各自的与管理员PIN和用户PIN相关的权限状态。

    image-20220422190101365

    容器中存放加密密钥对、签名密钥对和会话密钥。其中加密密钥对用于保护会话密钥,签名密钥对用于数字签名和验证,会话密钥用于数据加解密和MAC运算。容器中也可以存放与加密密钥对对应的加密数字证书和与签名密钥对对应的签名数字证书。其中,签名密钥对由内部产生,加密密钥对由外部产生并安全导入,会话密钥可由内部产生或者由外部产生并安全导入。

    3 对这些API包含的函数进行分类和对比

    3.1 CryptoAPI

    3.1.1 基本加密函数

    (1)服务提供者函数

    应用程序使用服务提供者函数来连接和断开一个CSP(Cryptographic Service Providers)。

    函数名 函数功能
    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 安装的却省上下文
    (2)密钥的产生和交换函数

    密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。

    函数 功能
    CryptAcquireCertificatePrivateKey 对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec
    CryptDeriveKey 从一个密码中派生一个密钥
    CryptDestoryKey 销毁密钥
    CryptDuplicateKey 制作一个密钥和密钥状态的精确复制
    CryptExportKey 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中
    CryptGenKey 创建一个随机密钥
    CryptGenRandom 产生一个随机数
    CryptGetKeyParam 得到密钥的参数
    CryptGetUserKey 得到一个密钥交换或签名密钥的句柄
    CryptImportKey 把一个密钥BLOB 传送到CSP中
    CryptSetKeyParam 指定一个密钥的参数
    (3)编码/解码函数

    有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。

    函数 函数功能
    CryptDecodeObject 对lpszStructType 结构进行解码
    CryptDecodeObjectEx 对lpszStructType 结构进行解码,此函数支持内存分配选项
    CryptEncodeObject 对lpszStructType 结构进行编码
    CyptEncodeObjectEx 对lpszStructType 结构进行编码,此函数支持内存分配选项
    (4)数据加密/解密函数

    这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。

    函数 功能
    CryptDecrypt 使用指定加密密钥来解密一段密文
    CryptEncrypt 使用指定加密密钥来加密一段明文
    CryptProtectData 执行对DATA_BLOB 结构的加密
    CryptUnprotectData 执行对DATA_BLOB 结构的完整性验证和解密
    (5)哈希和数字签名函数

    这些函数在应用程序中完成计算哈希、创建和校验数字签名。

    函数 功能
    CryptCreateHash 创建一个空哈希对象
    CryptDestoryHash 销毁一个哈希对象
    CryptDuplicateHash 复制一个哈希对象
    CryptGetHashParam 得到一个哈希对象参数
    CryptHashData 对一块数据进行哈希,把它加到指定的哈希对象中
    CryptHashSessionKey 对一个会话密钥进行哈希,把它加到指定的哈希对象中
    CryptSetHashParam 设置一个哈希对象的参数
    CryptSignHash 对一个哈希对象进行签名
    CryptVerifySignature 校验一个数字签名

    3.1.2 证书和证书库函数

    这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。

    (1)证书库函数

    一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。

    函数 功能
    CertAddStoreToCollection 在证书库中增加一个证书
    CertCloseStore 关闭一个证书库句柄
    CertControlStore 如果证书缓冲区和证书本身内容不相符时,允许给应用程序发一个通知
    CertDuplicateStore 通过增加引用计数来复制证书库句柄
    CertEnumPhysicalStore 对于指定系统库枚举物理库
    CertEnumSystemStore 枚举所有可用的系统库
    CertEnumSystemStoreLocation 枚举可用系统库的所有位置
    CertGetStoreProperty 得到一个库的属性
    CertOpenStore 使用指定库类型来打开证书库
    CertOpenSystemStore 打开一个系统证书库
    CertRegisterPhysicalStore 在一个注册系统库里增加一个物理库
    CertRegisterSystemStore 注册一个系统库
    CertRemoveStoreFromCollection 从一个库集合里删除证书库
    CertSaveStore 保存证书库
    CertSetStoreProperty 设置证书属性
    CertUnregisterPhysicalStore 从系统库中删除一个物理库
    CertUnregisterSystemStore 反注册一个指定系统库
    (2)维护函数
    函数 功能
    CertAddSerializeElementToStore 在库中增加一系列证书或CRL
    CertCreateContext 从编码字节中创建指定上下文
    CertEnumSubjectInSortedCTL 在CTL 库中枚举信任主题
    CertFindSubjectInCTL 在CTL 中寻找指定主题
    CertFindSubjectInSortedCTL 在分类CTL 中寻找指定主题
    (3)证书函数

    下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。

    函数 功能
    CertAddCertificateContextToStore 在证书库里增加一个证书上下文
    CertAddCertificateLinkToStore 在证书库里增加一个对不同库里的证书上下文的链接
    CertAddEncodedCertificateToStore 把编码证书转换成证书上下文并且把它加到证书库里
    CertCreateCertificateContext 从编码证书中创建一个证书上下文。但这个上下文并不放到证书库里
    CertCreateSelfSignCertificate 创建一个自签名证书
    CertDeleteCertificateFromStore 从证书库里删除一个证书
    CertDuplicateCertificate 通过增加引用计数来复制证书上下文
    CertEnumCertificateInStore 在证书库里枚举证书上下文
    CertFindCertificateInStore 在证书库里寻找证书上下文
    CertFreeCertificateContext 释放一个证书上下文
    CertGetIssuerCertificateFromStore 在证书库里得到指定主题证书的发行者
    CertGetSubjectCertificateFromStore 获得主题证书的上下文
    CertGetValidUsages 返回所有证书的用法
    CertSerializeCertificateStoreElement 串行化编码证书的证书上下文
    CertVerifySubjectCertificateContext 使用发行者来验证主题证书
    CryptUIDlgViewContext 显示证书、CRL 或CTL
    CryptUIDlgSelectCertificateFromStore 从指定库中显示对话框,可以从中选择证书
    (4)证书撤销列表函数
    函数 功能
    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 和它的属性
    (5)证书信任列表函数
    函数 功能
    CertAddCTLContextToStore 把一个CTL 上下文加入到证书库里
    CertAddCTLLinkToStore 给不同库里的CRL 上下文添加链接
    CertAddEncodedCTLToStore 把编码CTL 转化成CTL 上下文并且把它加到证书库里
    CertCreateCTLContext 从编码CTL 中创建CTL 上下文
    CertDeleteCTLFromStore 从证书库里删除CTL
    CertDuplicateCTLContext 通过增加引用计数来复制CTL 上下文
    CertEnumCTLsInStore 在证书库里枚举CTL 上下文
    CertFindCTLInStore 在证书库里查找CTL 上下文
    CertFreeCTLContext 释放CTL 上下文
    CertSerializeCTLStoreElement 串行化CTL 上下文的编码CTL 和属性
    (6) 扩展属性函数
    函数 功能
    CertEnumCertificateContextProperties 枚举指定证书上下文的属性
    CertEnumCRLContextProperties 枚举指定CRL 上下文的属性
    CertEnumCTLContextProperties 枚举指定CTL 上下文的属性
    CertGetCertificateContextProperty 得到证书属性
    CertGetCRLContextProperty 得到CRL 属性
    CertGetCTLContextProperty 得到CTL 属性
    CertSetCertificateContextProperty 设置证书属性
    CertSetCRLContextProperty 设置CRL 属性
    CertSetCTLContextProperty 设置CTL 属性

    3.1.3 证书验证函数

    证书验证是通过CTL 和证书列表进行的。

    (1)使用CTL的函数
    函数 功能
    CertVerifyCTLUsage 验证CTL 用法
    CryptMsgEncodeAndSignCTL 编码和验证CTL
    CryptMsgGetAndVerifySigner 从一个消息中获得和验证CTL
    CryptMsgSignCTL 对包含CTL 的消息进行签名
    (2)证书链验证函数
    函数 功能
    CertCreateCertificateChainEngine 为应用程序创建一个新的非却省的链引擎
    CertCreateCTLEntryFromCertificateContextProperties 创建一个CTL 入口
    CertDuplicateCertificateChain 通过增加引用计数来复制证书链
    CertFindChainInStore 在证书库里查找证书链
    CertFreeCertificateChain 释放证书链
    CertFreeCertificateChainEngine 释放证书链引擎
    CertGetCertificateChain 从最后一个证书建立一个上下文链表
    CertSetCertificateContextPropertiesFromCTLEntry 通过CTL 入口属性来设置证书上下文的属性
    CertIsValidCRLForCertificate 通过检查CRL 来确定CRL 是否包括指定被撤销的证书
    CertVerifyCertificateChainPolicy 通过检查证书链来确定它的完整性

    3.1.4 消息函数

    CryptoAPI 消息函数包括两组:

    • 低级消息函数
    • 简化消息函数。

    低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。

    (1)低级消息函数
    函数 功能
    CryptMsgCalculateEncodedLength 计算加密消息的长度
    CryptMsgClose 关闭加密消息的句柄
    CryptMsgControl 执行指定的控制函数
    CryptMsgCountersign 标记消息中已存在的签名
    CryptMsgCountersignEncoded 标记已存在的签名
    CryptMsgDuplicate 通过增加引用计数来复制加密消息句柄
    CryptMsgGetParam 对加密消息进行编码或者解码后得到的参数
    CryptMsgOpenToDecode 打开加密消息进行解码
    CryptMsgOpenToEncode 打开加密消息进行编码
    CryptMsgUpdate 更新加密消息的内容
    CryptMsgVerifyCountersignatureEncoded 验证SignerInfo 结构中标记时间
    CryptMsgVerifyCountersignatureEncodedEx 验证SignerInfo 结构中标记时间签名者可以是CERT_PUBLIC_KEY_INFO 结构
    (2) 简化消息函数
    函数 功能
    CryptDecodeMessage 对加密消息进行解码
    CryptDecryptAndVerifyMessageSignature 对指定消息进行解密并且验证签名者
    CryptDecryptMessage 解密指定消息
    CryptEncryptMessage 加密指定消息
    CryptGetMessageCertificates 返回包含消息的证书和CRL 的证书库
    CryptGetMessageSignatureCount 返回签名消息的签名者数量
    CryptHashMessage 创建消息的哈希
    CryptSignAndEncryptMessage 对消息进行签名并且加密
    CryptSignMessage 对消息进行签名
    CryptVerifyDetachedMessageHash 验证包含已解邦定哈希的哈希消息
    CryptVerifyDetachedMessageSignature 验证包含已解邦定签名的签名消息
    CryptVerifyMessageHash 验证一个哈希消息
    CryptVerifyMessageSignature 验证一个签名消息

    3.1.5 辅助函数

    (1)数据管理函数
    函数 功能
    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 的签名进行验证
    (2)数据转换函数
    函数 功能
    CertAlgIdToOID 把CSP 算法标示符转换成OID
    CertGetNameString 得到证书的主题或颁发者名称并且把它转换成字符串
    CertNameToStr 把证书名称BLOB 转换成字符串
    CertOIDToAlgId 把OID 转换成CSP 算法表示符
    CertRDNValueToStr 把名称值转换成字符串
    CertStrToName 把字符串转换成编码证书名称
    CryptBinaryToString 把二进制序列转换成字符串
    CryptFormatObject 格式化编码数据,返回Unicode 字符串
    CryptStringToBinary 把格式化的字符串转换成二进制序列
    (3)增强密钥用法函数
    函数 功能
    CertAddEnhancedKeyUsageIdentifier 在证书EKU 属性中增加一个用法标示符
    CertGetEnhancedKeyUsage 获得证书的EKU 扩展或属性信息
    CertRemoveEnhancedKeyUsageIdentifier 从证书EKU 扩展属性中删除用法标示符OID
    CertSetEnhancedKeyUsage 设置证书的EKU 属性
    (4)密钥标示函数
    函数 功能
    CryptCreateKeyIdentifierFromCSP 创建CSP 公钥的密钥标示符
    CryptEnumKeyIdentifierProperties 枚举标示符和其属性
    CryptGetKeyIdentifierProperty 从指定密钥标示符中获得指定属性
    CryptSetKeyIdentifierProperty 设置指定密钥标示符的属性
    (5)证书库回调函数
    函数 功能
    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 属性

    具体函数和功能参考:CryptoAPI

    3.2 PKCS#11

    3.2.1 通用接口

    函数 描述
    C_Initialize 初始化 Cryptoki
    C_Finalize 整理各种适合 Cryptoki的资源
    C_GetInfo 获得关于Cryptoki的通用信息
    C_GetFunctionList 获得Cryptoki 库函数的进入点

    3.2.2 槽和令牌管理函数

    函数 功能
    C_GetSlotList 获得系统中槽的名单
    C_GetSlotInfo 获得关于特殊槽的信息
    C_GetTokenInfo 获得关于特殊令牌的信息
    C_WaitForSlotEvent 等待槽事件(令牌插入,转移等) 的发生
    C_GetMechanismList 获得由令牌支持的机制的名单
    C_GetMechanismInfo 获得关于特殊机制的信息
    C_InitToken 初始化一个令牌
    C_InitPIN 初始化普通用户的 PIN
    C_SetPIN 改变现在用户的PIN

    3.2.3 会话管理函数

    函数 功能
    C_OpenSession 打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入
    C_CloseSession 关闭一个会话
    C_CloseAllSessions 用令牌关闭所有的会话
    C_GetSessionInfo 获得关于会话的信息
    C_GetOperationState 获得会话的加密操作状态
    C_SetOperationState 设置会话的加密操作状态
    C_Login 注册一个令牌
    C_Logout 从一个令牌注销

    3.2.3 对象管理函数

    C_CreateObject 建立一个对象
    C_CopyObject 建立一个对象的拷贝
    C_DestroyObject 销毁一个对象
    C_GetObjectSize 获取字节中一个对象的大小
    C_GetAttributeValue 获取一个对象的属性值
    C_SetAttributeValue 改变一个对象的属性值
    C_FindObjectsInit 初始化一个对象的搜索操作
    C_FindObjects 继续一个对象搜索操作
    C_FindObjectsFinal 完成一个对象搜索操作

    3.2.4 加密和解密函数

    函数 功能
    C_EncryptInit 初始化一个加密操作
    C_Encrypt 加密单部分数据
    C_EncryptUpdate 继续一个多部分加密操作
    C_EncryptFinal 完成一个多部分加密操作
    C_DecryptInit 初始化一个解密操作
    C_Decrypt 解密单部分加密数据
    C_DecryptUpdate 继续一个多部分解密操作
    C_DecryptFinal 完成一个多部分解密操作

    3.2.5 消息摘要函数

    函数
    C_DigestInit 初始化一个消息摘要操作
    C_Digest 摘要单部分数据
    C_DigestUpdate 继续一个多部分摘要操作
    C_DigestKey 摘要一个密钥
    C_DigestFinal 完成一个多部分摘要操作

    3.2.5 签名和验签函数

    函数 功能
    C_SignInit 初始化一个签名操作
    C_Sign 签名单部分数据
    C_SignUpdate 继续一个多部分签名操作
    C_SignFinal 完成一个多部分签名操作
    C_SignRecoverInit 初始化一个签名操作,在操作中数据能从签名中恢复
    C_SignRecover 签名单部分数据,在操作中数据能从签名中恢复
    C_VerifyInit 初始化一个鉴定操作
    C_Verify 在单部分数据上鉴定一个签名
    C_VerifyUpdate 继续一个多部分鉴定操作
    C_VerifyFinal 完成一个多部分鉴定操作
    C_VerifyRecoverInit 初始化一个鉴定操作,在操作中数据能从签名中恢复
    C_VerifyRecover 在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复

    3.2.6 双重目的的加密

    函数 功能
    C_DigestEncryptUpdate 继续类似的多部分摘要和加密操作
    C_DecryptDigestUpdate 继续类似的多部分解密和摘要操作
    C_SignEncryptUpdate 继续类似的多部分签名和加密操作
    C_DecryptVerifyUpdate 继续类似的多部分解密和鉴定操作

    3.2.7 密钥管理函数

    函数 功能
    C_GenerateKey 产生一个保密密钥
    C_GenerateKeyPair 产生一个公共/私钥对
    C_WrapKey 加密一个密钥
    C_UnwrapKey 解密一个密钥
    C_DeriveKey 从基础密钥派生一个密钥

    3.2.8 随机数生成函数

    函数 功能
    C_SeedRandom 把一个附加种子材料加入随机数字生成器
    C_GenerateRandom 生成随机数据

    具体函数内容和功能参考:PKCS#11

    3.3 SFK

    3.3.1 设备管理系列函数

    函数名称 功能
    SKF_WaitForDevEvent 等待设备插拔事件
    SKF_CanceIWaitForDevEvent 取消等待设备插拔事件
    SKF_EnumDev 枚举设备
    SKF_ConnectDev 连接设备
    SKF_DisconnectDev 断开连接
    SKF_GetDevState 获取设备状态
    SKF_SetLabeI 设置设备标签
    SKF_GetDevInfo 获取设备信息
    SKF_LockDev 锁定设备
    SKF_UnIockDev 解锁设备
    SKF_Transmit 设备命令传输

    3.3.2 访问控制系列函数

    函数名称 功能
    SKF_ChangeDevAuthKey 修改设备认证密钥
    SKF_DevAuth 设备认证
    SKF_ChangePIN 修改 PIN
    SKF_GetPINInfo 获得 PIN码信息
    SKF_VerifyPIN 校验 PIN
    SKF_UnbIockPIN 解锁 PIN
    SKF_CIearSecueState 清除应用安全状态

    3.3.3 应用管理系列函数

    函数名称 功 能
    SKF_CreateApplication 创建应用
    SKF_EnumApplication 枚举应用
    SKF_DeleteApplication 删除应用
    SKF_OpenApplication 打开应用
    SKF_CloseApplication 关闭应用

    3.3.4 文件管理系列函数

    函数名称 功能
    SKF_CreateFiIe 创建文件
    SKF_DeIeteFiIe 删除文件
    SKF_EnumFiIes 枚举文件
    SKF_GetFiIeInfo 获取文件信息
    SKF_ReadFiIe 读文件
    SKF_WriteFiIe 写文件

    3.3.5 容器管理系列函数

    函数名称 功能
    SKF_CreateContainer 创建容器
    SKF_DeIeteContainer 删除容器
    SKF_EnumContainer 枚举容器
    SKF_OpenContainer 打开容器
    SKF_CIoseContainer 关闭容器
    SKF_GetContainerType 获得容器类型
    SKF_ImportCertificate 导人数字证书
    SKF_ExportCertificate 导出数字证书

    3.3.6 密码服务系列函数

    函数名称 功 能
    SKF_GenRandom 生成随机数
    SKF_GenExtRsAKey 生成外部 RsA密钥对
    SKF_GenRsAKeyPair 生成 RsA签名密钥对
    SKF_ImportRsAKeyPair 导人 RsA加密密钥对
    SKF_RsAsignData RsA签名
    SKF_RsAVerify RsA验签
    SKF_Rs/Dxportse*s*ionKey Rs/生成并导出会话密钥
    SKF_DxtRs/PubKeyOperation Rs/外来公钥运算
    SKF_DxtRs/PriKeyOperation Rs/外来私钥运算
    SKF_GenDAAKeyPair 生成 DAA签名密钥对
    SKF_ImportDAAKeyPair 导人 DAA加密密钥对
    SKF_DAAsignCata DAA签名
    SKF_DAAVerify DAA验签
    SKF_DAADxportse*s*ionKey DAA生成并导出会话密钥
    SKF_DxtDAADncrypt DAA外来公钥加密
    SKF_DxtDAACecrypt DAA外来私钥解密
    SKF_DxtDAAsign DAA外来私钥签名
    SKF_DxtDAAVerify DAA外来公钥验签
    SKF_Generate/gr*e*mentCataWithDAA DAA生成密钥协商参数并输出
    SKF_GenerateKeyWithDAA DAA计算会话密钥
    SKF_Generate/gr*e*mentCata/ndKeyWithDAA DAA产生协商数据并计算会话密钥
    SKF_DxportPubIicKey 导出公钥
    SKF_Importse*s*ionKey 导人会话密钥
    SKF_setsymmKey 明文导人会话密钥
    SKF_DncryptInit 加密初始化
    SKF_Dncrypt 单组数据加密
    SKF_DncryptUpdate 多组数据加密
    SKF_DncryptFinaI 结束加密
    SKF_CecryptInit 解密初始化
    SKF_Cecrypt 单组数据解密
    SKF_CecryptUpdate 多组数据解密
    SKF_CecryptFinaI 结束解密
    SKF_CigestInit 密码杂凑初始化
    SKF_Cigest 单组数据密码杂凑
    SKF_CigestUpdate 多组数据密码杂凑
    SKF_CigestFinaI 结束密码杂凑
    SKF_MacInit 消息鉴别码运算初始化
    SKF_Mac 单组数据消息鉴别码运算
    SKF_MacUpdate 多组数据消息鉴别码运算
    SKF_MacFinaI 结束消息鉴别码运算
    SKF_AIoseHandIe 关闭密码对象句柄

    4 接口调用(以龙脉GM3000Key为例)

    4.1 Crypto API

    代码链接:Gitee

    image-20220505214654825 image-20220505214728531

    4.2 PKCS#11

    代码和编译脚本:Gitee

    image-20220505211238032

    4.3 SFK

    代码链接和编译脚本:Gitee

    image-20220505212741410 image-20220505213040738
  • 相关阅读:
    死磕 java线程系列之自己动手写一个线程池(续)
    Spring Boot (十): Spring Boot Admin 监控 Spring Boot 应用
    opencv之为图像添加边界
    协作,才能更好的中断线程
    Java并发——线程池Executor框架
    神经网络dropout
    xgboost
    物体检测-毕业设计项目回顾
    计算机网络-TCP连接
    gbdt推导和代码
  • 原文地址:https://www.cnblogs.com/lxy2019/p/16226571.html
Copyright © 2020-2023  润新知