一、任务详情
密码引擎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分)
二、微软的Crypto API
(一)研究学习
CryptoAPI 系统体系结构
Web Crypto API
Web Cryptography API
CSP开发基础--CryptoAPI函数简介
CryptoAPI是应用程序编程接口,使应用程序开发人员能够将身份验证、编码和加密添加到基于Windows的应用程序。
- CryptoAPI 系统体系结构由五个主要功能领域组成:基本加密函数、证书编码/解码函数、证书Microsoft Store函数、简化的消息函数、低级别消息函数。
(1)基本加密函数
- 用于连接到云解决方案提供商的上下文函数。 这些函数使应用程序能够按名称选择特定的云解决方案提供商,或选择可以提供所需功能类的特定云解决方案提供商。
- 用于生成和存储加密密钥的密钥生成函数。 完全支持更改 链接模式、 初始化向量和其他加密功能。 有关详细信息,请参阅密钥生成和Exchange函数。
- 用于交换或传输密钥的密钥交换函数。 有关详细信息,请参阅加密密钥存储和Exchange以及密钥生成和Exchange函数。
(2)证书编码/解码函数
(3)证书Microsoft Store函数
- 用于管理数字证书集合的函数。 有关详细信息,请参阅数字证书和证书Microsoft Store函数。
(4)简化的消息函数
(5)低级别消息函数
每个功能区域在其函数名称中都有一个关键字,指示其功能区域。
功能区域 | 函数名称约定 |
---|---|
基本加密函数 | Crypt |
编码/解码函数 | Crypt |
证书存储函数 | 存储 |
简化的消息函数 | 消息 |
低级别消息函数 | Msg |
应用程序在所有这些领域都使用函数。这些函数组合在一起,组成 CryptoAPI。 基本加密函数将 CSP 用于必要的加密算法以及加密密钥的生成和安全存储。
使用了两种不同类型的加密密钥:会话密钥(用于单个加密/解密)和公钥/私钥对,这些密钥在更永久的基础上使用。
(二)使用方式
使用CryptoAPI编写一个文件保护程序,具有如下功能:
(1)给定明文文件,生成加密文件,同时产生文件的数字签名文件;
(2)给定密文文件,解密出明文文件,并验证签名的正确性。
在不安全的网络上进行安全的数据传输涉及三个方面的要求:信息隐藏,身份鉴别和完整性检验。CryptoAPI除了提供上述三个功能外还提供标准的ASN.1编码、解码,信息解密,数字证书和证书存储区的管理,证书信任列表、吊销列表和证书有效性检查等功能。
1.信息隐藏
信息隐藏的意义是保障信息内容只能被特定的人获取。信息隐藏通常是使用某种形式的密码学方式。数据加密算法能保障信息的安区隐藏和传输。数据加密算法是将明文数据经过一定的变换使其看上去是一组毫无意义的数据。在没有加密密钥的情况下,对于好的加密算法想从密文获取明文信息是不可能的。被加密的数据可以是任意的ASCII编码文本文件,数据库文件,和任意需要进行安全传输的数据。这里,“信息”是指任意的一段数据,“明文”是指任意一段没有被加密的数据,“密文”是指任意一段加密的数据。被加密的数据可以在不安全的通道上进行传输而不伤害其安全性。之后,密文可以被还原成明文。
数据加密和解密的概念是:对数据加密的时候需要一个加密密钥,相当于门上的一把钥匙。解密的时候,需要使用一个解密密钥来解开数据。加密密钥、解密密钥可以相同也可以不相同。
加密密钥必须小心保存,给其它用户的时候也必须通过安全的通道传递。对解密密钥的访问权限必须小心控制,因为拥有解密密钥意味着可以解开所有相应加密密钥加密的信息。
2.身份鉴别
安全通讯的前提是通讯的双方知道对方的身份。身份鉴别的任务就是鉴别一个用户或者实体的真实身份。标识用户身份的文档通常被称为信任状或者凭证。
身份鉴别有时候也用来判定接受的数据就是被发送的数据。如果A向B发送了一段数据,B需要鉴别这段数据就是A发出去的,而不是其它冒充A发出去的。为了满足这类验证的需求,CryptoAPI提供数字签名和校验函数,用来对信息进行鉴别。
因为在计算机网网络上传输的数据与用户之间并没有物理连接,因此对数据进行鉴别的凭证也必须能够在网络上进行传输。这种凭证必须由受信任的凭证发行机构发行。
数字证书就是平常说的证书就是这种凭证,是计算机在网络上进行身份验证的有效凭证。
数字证书是由一个被称为证书机构的信任组织或实体颁发的凭证。它包含与证书对应的用户公钥以及其它一些记录证书主题和用户信息的数据。证书机构只有在验证了证书主题和证书对应的用户公钥的有效性之后才会签发证书。
证书申请者和证书机构之间交换签发证书信息可以使用物理介质,比如软盘,进行传输。通常,这种信息都是在计算机网络上进行完成的。证书机构使用被信任的服务程序处理用户的请求和证书的签发工作。
3.完整性检验
任何通过不安全介质传输的信息都可以被意外或蓄意的修改。在现实世界中,盖章、签名就是用来提供和证明信息完整性的工具。
信息的接收者不但需要确定信息是由谁发送的,还要确定自己收到的信息是发送者发送的信息,而没有任何的变化。要建立数据的完整性检测机制,不仅要发送信息本身,还要发送用来校验数据的信息,这一信息通常被称作哈希值。数据和验证信息都可以与数字签名一起发送来证明其完整性。
(三)API函数
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:
密钥的产生和交换函数:
密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。下面就是主要的一些函数:
编码/解码函数:
有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。以下就是这几个函数:
数据加密/解密函数:
这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
哈希和数字签名函数:
2. 证书和证书库函数
这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。这些函数可以分成一下几组:
证书库函数:
一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
以下就是这些函数:
维护函数:
证书函数:
下列函数是针对于证书的。大多数函数都是处理CRL 和CTL 的。
证书撤销列表函数:
证书信任列表函数:
扩展属性函数:
3. 证书验证函数
证书验证是通过CTL 和证书列表进行的。
使用CTL 的函数:
证书链验证函数:
4. 消息函数
CryptoAPI 消息函数包括两组:低级消息函数和简化消息函数。
低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。
简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。
低级消息函数:
简化消息函数:
5. 辅助函数
数据管理函数
数据转换函数
增强密钥用法函数
密钥标示函数
证书库回调函数
OID支持函数
远程对象恢复函数
PFX 函数
三、RAS公司的PKCS#11标准
(一)研究学习
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。
PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。
PKCS#11主要是应用于智能卡和HSM。
PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。
PKCS密码中间件位于上层应用和底层安全设备之间,应用基于 PKCS#11 标准接口开发各类应用程序。主要包括2个库
- 主API库:提供给应用的PKCS11接口。
- tokenDLL库:由主 API 库调用,完成从上向下到指定设备的套接。
- 安全密码设备:安全服务资源和实施的载体,完成具体安全功能支撑。
PKCS #11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限,而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象,PKCS #11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
PKCS#11创建和支持下列对象:
PKCS#11的对象可根据其生命期长短的不同分成两大类:一类是持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;另一类是会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。
PKCS#11的对象除了生命期长短有分别之外,在访问权限上也有限制。所有的对象都可根据访问权限的不同分成两大类:一类是公开对象,这类对象是任何用户都可以访问的;另一类是私有对象,这一类对象只有身份被验证的用户才有权访问。决定对象的访问限制类型的模板属性是CKA_PRIVATE。
(二)使用方式
1.架构
2.会话状态
3.对象
(三)API函数
PKCS#11的对象可根据其生命期长短的不同分成两大类:
- 持久存储的类对象,这类对象被保存在USB Key的安全存储区域当中,直到应用程序主动删除这些对象;
- 会话对象,这类对象只存在于运行时建立的特定会话(Session对象)当中,一旦会话结束,这类对象也跟着被删除。
决定对象生命期的模板属性是CKA_TOKEN,这是个布尔值,所有的对象都有这一属性。当该值为TRUE时,该对象将被保存到Key内的存储空间,否则,该对象保存在会话空间中,当会话结束后,该对象即销毁。
P11标准颁发了70余条指令。其中部分指令简介如下表:
四、GMT 0016-2012 智能密码钥匙密码应用接口规范
(一)研究学习
接口规范
GMT 0016-2012是国家规定的智能密码钥匙密码应用接口规范,规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。适用于智能密码钥匙产品的研制、使用和检测。
规范性引用文件
下列文件对于本标准的应用是必不可少的。凡是注日期的引用文件。仅所注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范
(二)使用方式
层次关系
智能密码钥匙密码应用接口位于智能密码钥匙应用程序与设备之间,如下图所示。
应用结构
(三)API函数
设备管理系列函数
访问控制系列函数
应用管理系列函数
文件管理系列函数
容器管理系列函数
密码服务系列函数
5.列出这些API包含的函数,进行分类,并总结它们的异同
5.1 微软的Crypto API
5.1.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安装的却省上下文
5.1.2密钥的产生和交换函数
CryptAcquireCertificatePrivateKey对于指定证书上下文得到一个HCRYPTPROV句柄和dwKeySpec
CryptDeriveKey从一个密码中派生一个密钥
CryptDestoryKey销毁密钥
CryptDuplicateKey制作一个密钥和密钥状态的精确复制
CryptExportKey把CSP的密钥做成BLOB 传送到应用程序的内存空间中
CryptGenKey创建一个随机密钥
CryptGenRandom产生一个随机数
CryptGetKeyParam得到密钥的参数
CryptGetUserKey得到一个密钥交换或签名密钥的句柄
CryptImportKey把一个密钥BLOB传送到CSP 中
CryptSetKeyParam指定一个密钥的参数
5.1.3编码/解码函数
CryptDecodeObject对lpszStructType结构进行解码
CryptDecodeObjectEx对lpszStructType结构进行解码,此函数支持内存分配选项
CryptEncodeObject对lpszStructType结构进行编码
CyptEncodeObjectEx对lpszStructType结构进行编码,此函数支持内存分配选项
5.1.4数据加密/解密函数
CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。
CryptSetKeyParam函数可以指定额外的加密参数。
CryptDecrypt使用指定加密密钥来解密一段密文
CryptEncrypt使用指定加密密钥来加密一段明文
CryptProtectData执行对DATA_BLOB结构的加密
CryptUnprotectData执行对DATA_BLOB结构的完整性验证和解密
5.1.5哈希和数字签名函数
CryptCreateHash创建一个空哈希对象
CryptDestoryHash销毁一个哈希对象
CryptDuplicateHash复制一个哈希对象
CryptGetHashParam得到一个哈希对象参数
CryptHashData对一块数据进行哈希,把它加到指定的哈希对象中
CryptHashSessionKey对一个会话密钥进行哈希,把它加到指定的哈希对象中
CryptSetHashParam设置一个哈希对象的参数
CryptSignHash对一个哈希对象进行签名
CryptVerifySignature校验一个数字签名
5.2 RAS公司的PKCS#11标准:
5.2.1CSP连接函数
CPAcquireContext:为应用程序创建一个上下文
CPGetProvParam:返回CSP相关的信息
CPReleaseContext:释放CPAcquireContext创建的上下文
CPSetProvParam :设置CSP的参数操作
5.2.2 CSP密钥生成和交换函数
CPDeriveKey:从一个数据散列中生成一个会话密钥,它保证生成的密钥 互不相同
CPDestroyKey:释放一个密钥句柄,释放后,句柄将无效,密钥将无法再被访问
CPExportKey:从CSP容器中导出密钥
CPGenKey:用来生成密钥或密钥对
CPGenRandom:使用随机数填充一个缓冲
CPGetKeyParam:用来得到加密操作密钥的属性
CPGetUserKey:用来获取CSP容器中的持久密钥对
CPImportKey:从一个blob中导入密钥到CSP容器中
CPSetKeyParam:设置密钥的属性
5.2.3 CSP加解密函数
CPDecrypt:用来解密先前被加密的数据
CPEncrypt:用来加密明文
CSP散列和数字签名函数:
CPCreateHash:初始化并散列输入数据
CPDestroyHash:删除一个散列对象句柄
CPDuplicateHash:创建一个散列对象的拷贝
CPGetHashParam:获取散列对象的计算结果
CPHashData:散列输入的数据
CPSetHashParam:定制一个散列对象的属性
CPSignHash:签名一个散列对象
CPVerifySignature:校验一个数字签名
5.3 GMT 0016-2012
5.3.1 设备管理系列函数
SKF_WaitForDevEvent:等待设备插拔事件
SKF_ CancelWaitForDevEvent:取消等待设备插拔事件
SKF_ EnumDev :枚举设备
SKF_ ConnectDev:连接设备
SKF_ DisconnectDev :断开连接
SKF_ GetDevState:获取设备状态
SKF_ SetLabel:设置设备标签
SKF_ GetDevInfo:获取设备信息
SKF_ LockDev:锁定设备
SKF_ UnlockDev:解锁设备
SKF_Transmit:设备命令传输
5.3.2 访问控制系列函数
SKF_ ChangeDevAuthKey:修改设备认证密钥
SKF_DevAuth:设备认证
SKF_ ChangePIN:修改PIN
SKF_ GetPINInfo:获得PIN码信息
SKF_ VerifyPIN:校验PIN
SKF_ UnblockPIN:解锁PIN
SKF_ ClearSecueState:清除应用安全状态
5.3.3 应用管理系列函数
SKF_ CreateApplication:创建应用
SKF_ EnumApplication:枚举应用
SKF_ DeleteApplication:删除应用
SKF_ OpenApplication:打开应用
SKF_ CloseApplication:关闭应用
5.3.4 文件管理系列函数
SKF_ CreateFile:创建文件
SKF_ DeleteFile :删除文件
SKF_ EnumFiles:枚举文件
SKF_ GetFileInfo:获取文件信息
SKF_ ReadFile:读文件
SKF_ WriteFile :写文件
5.3.5 容器管理系列函数
SKF_CreateContainer:创建容器
SKF_ DeleteContainer:删除容器
SKF_ EnumContainer:枚举容器
SKF_ OpenContainer:打开容器
SKF_ CloseContainer:关闭容器
SKF_ GetContainerType:获得容器类型
SKF_ ImportCertificate:导人数字证书
SKF_ ExportCertificate:导出数字证书
5.3.6 密码服务系列函数
SKF_ GenRandom :生成随机数
SKF_ GenExtRSAKey:生成外部RSA密钥对
SKF_ GenRSAKeyPair:生成RSA签名密钥对
SKF_ ImportRSAKeyPair:导人RSA加密密钥对
SKF_ RSASignDataRSA:签名
SKF_ RSAVerify:RSA验签
SKF_ RSAExportSessionKey:RSA生成并导出会话密钥
SKF_ ExtRSAPubKeyOperation:RSA外来公钥运算
SKF_ ExtRSAPriKeyOperation:RSA外来私钥运算
SKF_ GenECCKeyPair:生成ECC签名密钥对
SKF_ ImportECCKeyPair:导入ECC加密密钥对
SKF_ ECCSignData :ECC签名
SKF_ ECCVerify:ECC验签
SKF_ ECCExportSessionKey:ECC生成并导出会话密钥
SKF_ExtECCEncrypt:ECC外来公钥加密.
SKF_ ExtECCDecrypt:ECC外来私钥解密.
SKF_ ExtECCSign:ECC外来私钥签名.
SKF_ ExtECCVerify :ECC外来公钥验签.
SKF_ GenerateAgreementDataWithECC:ECC生成密钥协商参数并输出
SKF_ GenerateKeyWithECC:ECC计算会话密钥.
SKF_ GenerateAgreementDataAndKeyWithECC:ECC产生协商数据并计算会话密钥
SKF_ExportPablicKey:导出公钥
SKF_ImportSessionKey:导入会话密钥
SKF_ SetSymmKey:明文导人会话密钥
SKF_ EncrypInit:加密初始化
SKF_ Encrypt:单组数据加密
SKF_ EncryptUpdate:多组数据加密
SKF_ EncryptFinal:结束加密
SKF_ Digestlnit:密码杂凑初始化
SKF_Digest:单组数据密码杂凑
SKF_ DigestUpdate:多组数据密码杂凑
SKP_ DigestFinal:结束密码杂凑
SKF_ MacInit:消息鉴别码运算初始化
SKF_ Mac:单组数据消息鉴别码运算
SKF_ MacUpdate:多组数据消息鉴别码运算
SKF_ MacFinal:结束消息鉴别码运算
SKF_ CloseHandle:关闭密码对象句柄
5.4 GMT 0018-2012
5.4.1设备管理
打开设备:SDEOpenDerice
关闭设备:SDF_ Cias eDevice
创建会话:SDF_ OpenSesion
关闭会话: SDF _CloseSession
获取设备信息:SDF _GetDeviceInfo
产生随机数:SDF_enerateRandom
获取私钥使用权限:SDF _GetPrivateKeyAccessRight
释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
5.4.2 密钥管理
导出 RSA签名公钥: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_ ExchangeDigitEnvelopeBaseOnRSA
导出 ECC签名公钥:SDF_ ExportSignPublicKey_ ECC
导出 ECC加密公钥:SDF_ ExportEncPublicKey_ ECC
产生ECC非对称密钥对并输出:SDF_GenerateKeyPair_ ECC
生成会 话密钥并用内部:ECC公钥加密输出:SDF_ GenerateKeyWithIPK_ ECC
生成会话密 钥并用外部:ECC公钥加密输出: SDF_ GenerateKeyWithEPK_ ECC
导人会话密钥并用内部:ECC私钥解密:SDF_ ImportKeyWithISK_ ECC
生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
计算会话密钥:SDF_GenerateKeyWithECC
产生协商数据并计算会话密钥:SDF_ GenerateAgreementDataAndKeyWithECC
基于ECC算法的数字信封转换:SDF_ ExchangeDigitEnvelopeBaseOnECC
生成会话密钥并用密钥加密密钥加密输出:SDF_GenerateKeyWithKEK
导入会话密钥并用密钥加密密钥解密:SDF_ ImportKeyWithKEK
销毁会话密钥:SDF_DestroyKey
5.4.3 非对称算法运算类函数
外部公钥RSA运算:SDF_ ExternalPublicKeyOperation_ RSA
内部公钥RSA运算:SDF_ InternalPublicKeyOperation_ RSA
内部私钥RSA运算:SDF_InternalPrivateKeyOperation_ RSA
外部密钥ECC验证:SDF_ ExternalVerify_ECC
内部密钥ECC签名:SDF_ nternalSign_ ECC
内部密钥ECC验证:SDF_ InternalVerify_ ECC
外部密钥ECC加密:SDF_ ExternalEncrypt_ECC
5.4.4 对称算法运算类函数
对称加密:SDF_Encrypt
对称解密:SDF_Decrypt
计算MAC:SDF_CalculateMAC
5.4.5 杂凑运算类函数
杂凑运算初始化:SDF_HashInit
多包杂凑运算:SDF_HashUpdate
杂凑运算结束:SDF_HashFinal
5.4.6 用户文件操作类函数:
创建文件:SDF_CreatFile
读取文件:SDF_ReadFile
写文件:SDF_WriteFile
删除文件:SDF_DeleteFile
5.5 总结异同
- CryptoAPI 提供了一组函数。这些函数允许应用程序在对用户的敏感私钥数据提供保护时,以灵活的方式对数据进行加密或数字签名。实际的加密操作是由称为加密服务提供程序 (CSP) 的独立模块执行。
- PKCS#11为拥有密码信息(如加密密钥和证书)和执行密码学函数的单用户设备定义了一个应用程序接口(API)。
- Cryptoki定义了密码函数接口,但并未指明设备具体如何实现这些函数。
- 国密涉及到了设备的管理,有设备管理接口还有访问控制函数,其API更侧重于设备。
六、以龙脉GM3000Key为例,写出调用不同接口的代码(Crypto API,PKCS#11,SKF接口),把运行截图加入博客,并提供代码链接
6.1 Crypto API
6.1.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFil
6.1.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts
6.1.3 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify
6.2 PKCS#11
6.2.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos
6.2.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest
DES
RC2
RSA
AES
6.3 SKF
6.3.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\DevAuth