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

发布时间 2023-03-28 17:39:30作者: 20201316

1.微软的Crypto API


Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。CryptoAPI 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7 标准格式编码和解码等。利用CryptoAPI,开发者可以给基于Windows的应用程序添加安全服务,包括: ASN.1编码及解码、数据加密/解密、身份论证、数字证书管理,同时支持PKI、对称密码技术等。应用程序开发者直接使用这些安全功能而无须了解其底层实现。

1.1 使用方式

1.1.1 加密密钥
  • 在CryptoAPI中,支持两种类型密钥:会话密钥、公/私密钥对。
  • 会话密钥也称为对称密钥,用于对称加密算法,例如RC2、RC4、DES等。在CryptoAPI中,一般使用CryptGenKey 或 CryptDeriveKey函数产生会话密钥。为了保证密钥的安全性,这些密钥都保存在CSP内部。当然,用户也可以通过CryptExportKey函数把密钥以加密密钥块形式导出到具体应用空间内,以备以后使用或传输给其他用户。
  • 公/私密钥对(包括公钥、私钥)用于非对称加密算法,例如RSA等。非对称加密算法主要用于加解密会话密钥和数字签名。在CryptoAPI中,一般来说,大多数 CSP产生的密钥容器包含两对密钥对,一对用于加密会话密钥,称为交换密钥对,一对用于产生数字签名,称为签名密钥对;但也有些CSP没有存储密钥对,或者存储不止两对密钥对。
  • 在CryptoAPI中,所有的密钥都存储在CSP,CSP负责产生、销毁密钥,并使用它们完成各种密码操作。也可以利用CryptoAPI函数从CSP中导出密钥。
1.1.2 数据编码/解码
  • 通过通信媒介(例如电话线路)传输数据,必须先把数据序列化,即把数据转化为0、1串。在序列化操作中,接到数据的计算机必须能够把数据转化为其原始格式。序列化完成的操作规则称为通信协议,它由软件和数据传输硬件共同完成,其协议一般包含多层。
  • 计算机1应用程序层先传输原文数据到编码/解码层,编码/解码层编码原文数据为计算机字节流,然后发送到硬件层,硬件层把字节流数据转化为0、1串流传输到计算机2。计算机2接到数据后,反向操作,转化0、1串流为计算机字节流,发送到编码/解码层,编码/解码层解码计算机字节流为原文数据。
  • 描述抽象对象的一个普遍方式为:ASN.1(抽象语法标记1),ASN.1在CCITT推荐文件X.208中定义,描述对象转换为0、1串的ASN.1规则称为DER(精确编码规则),在CCITT推荐文档X.509 8.7节定义。CryptoAPI采用的就是这种编码方式,表示数据发送方发送时先把数据抽象为ASN.1对象,然后使用DER编码规则把ASN.1对象转化为可传输的0、1串;接收方接到数据后,利用DER解码规则把0、1串转化为ASN.1对象,然后再把ASN.1对象转化为具体应用支持的数据对象。
1.1.3 数据加/解密
  • 加密较大的数据,CryptoAPI中约定用对称加密算法,这种算法中,在加密和解密过程中都使用同一个对称密钥或会话密钥。CryptoAPI中,通过其封装好的加解密函数来实现数据加解密操作,不同CSP提供不同的加解密算法,但常用的算法,一般CSP都提供。
1.1.4 哈希与数字签名
  • 哈希与数字签名一般用于确定数据的完整性和身份鉴别。CryptoAPI中,通过其封装好的哈希与数字签名函数来实现相关操作。微软提供的CSP产生的数字签名遵循RSA标准(PKCS#6),其他CSP可能遵循其他标准。
1.1.5 证书编码/解码功能
  • 用于加密或解密数据的功能。还包括对哈希数据的支持。有关更多信息,请参见数据加密和解密功能和数据加密和解密。
1.1.6 证书存储功能
  • 用于管理数字证书收集的功能。有关更多信息,请参见数字证书和证书存储功能。
1.1.7摘要算法

CryptAcquireContext

点击查看代码
CryptAcquireContext
x86asm
BOOL CryptAcquireContext (
HCRYPTPROV* phProv,
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
)
  • 摘要运算的第一步要调用CryptAcquireContext方法。实际上,下面介绍的每一个密码运算基本都要先通过调用此方法,设置相应的密码运算参数,并返回相应的CSP句柄,用于后面的运算。
  • phProv是返回的CSP句柄;pszContainer是要使用的密钥是在容器;摘要运算不涉及密钥,所以这里设置为NULL;pszProvider为使用到的CSP的名称,如果设置为NULL,则CryptAcquireContext会调用系统缺省CSP;dwProvType为所使用的CSP的类型,一般这里设置为PROV_RSA_FULL(0x1);dwFlags为标志值,如果是涉及到私钥的运算,如签名或解密,应设置为0,但如果是摘要、加密或验证等不涉及私钥的运算,强烈不建议这里设置成0,而应设置成CRYPT_VERIFYCONTEXT(0xF0000000),就是告诉Windows接下来的密码运算是不会访问私钥的。
    CryptCreateHash
点击查看代码
CryptCreateHash
scss
BOOL CryptCreateHash(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTKEY hKey,
DWORD dwFlags,
HCRYPTHASH *phHash
)
  • 调用此方法生成一个摘要运算的对象。hProv为上一步返回的CSP句柄;Algid为摘要算法,比如可以是CALG_SHA1;hKey和dwFlags都设置成0;phHash为返回的摘要运算对象。返回值同上。
    CryptHashData
点击查看代码
CryptHashData
scss
BOOL CryptHashData(
HCRYPTHASH hHash,
BYTE* pbData,
DWORD dwDataLen,
DWORD dwFlags
)
  • 调用CryptHashData方法进行摘要运算。phHash为上一步返回的摘要运算对象;pbData为原文;dwDataLen为原文长度;dwFlags为0。方法返回值同上。
    CryptGetHashParam
点击查看代码
CryptGetHashParam
scss
BOOL CryptGetHashParam(
HCRYPTHASH hHash,
DWORD dwParam,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwFlags
)
  • 调用CryptGetHashParam可以返回摘要的各种相关数据信息,这里先返回摘要的数据长度。
    dwParam设置为HP_HASHSIZE(0x0004);pbData为返回长度值;pdwDataLen为长度值所占字节数;dwFlags为0。调用成功后,再调用一次CryptGetHashParam方法返回摘要值。这次dwParam设置为HP_HASHVAL(0x0002);按照上一次调用返回的长度值为pbData分配空间,它返回的摘要值。
1.1.8 对称加密

对称加密中常用的方式是根据用户输入的口令加解密文档,即基于口令派生出加解密密钥
CryptAcquireContext
返回CSP句柄,参数设置与摘要运算时一致。
CryptCreateHash
生成摘要运算对象。
CryptHashData
生成摘要。pbData为调用加密功能的上位程序输入的加密口令。
BOOL CryptDeriveKey
派生密钥。
BOOL CryptSetKeyParam
设置密钥参数。
BOOL CryptEncrypt
调用CryptEncrypt进行加密。

1.1.9 对称解密

对称解密与加密相对应,调用顺序和参数设置基本一致。

点击查看代码
x86asm
CryptAcquireContext
CryptCreateHash
CryptHashData
CryptDeriveKey
CryptSetKeyParam
BOOL CryptDecrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen
)
  • pbData输入密文,调用后输出明文;pdwDataLen输入为密文长度,调用后输出明文长度。返回值与CryptEncrypt一致。

2.RAS公司的PKCS#11标准

  • PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。PKCS#11主要是应用于智能卡和HSM。PKCS#11为使用加密Token的应用程序提供统一的编程接口,独立于设备,屏蔽加密设备的复杂性,应用程序可以方便地更换设备。密码中间件位于上层应用和底层安全设备之间,应用基于 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。

2.1 使用方式

2.1.1 架构

image

2.1.2 会话状态

image

2.1.3 对象

image

2.1.4 机制

image

2.1.5 操作

image

2.1.6 调用流程

image

3.GMT 0016-2012

GMT 0016-2012文件

范围
  • 本规范规定了基于 PKI 密码体系的智能 IC 卡及智能密码钥匙应用接口,给出了应用接口的函数、数据类型、参数的描述和定义。 本规范适用于智能 IC 卡及智能密码钥匙产品的研制、使用和检测。
规范性引用文件
  • 下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些的最新版本。凡是不注日期的引用文件,其最新版本适用于本规范。
缩略语

下列缩略语适用于本规范:
API 应用编程接口(Application Programming Interface)
PKI 公钥基础设施 (Public Key Infrastructure)
PKCS#1 公钥密码使用标准系列规范中的第1部分,定义RSA公开密钥算法加密和签名机制
(the Public-Key Cryptography Standard Part 1)
PKCS#5 公钥密码使用标准系列规范中的第5部分,描述一种利用从口令派生出来的安全密
钥加密字符串的方法(the Public-Key Cryptography Standard Part 5)
PKCS#7 公钥密码使用标准系列规范中的第7部分,定义一种通用的消息语法(the
Public-Key Cryptography Standard Part 7)
PKCS#11 公钥密码使用标准系列规范中的第11部分,为执行密码函数的设备确定了一种程
序设计接口(API) (the Public-Key Cryptography Standard Part 11)
PIN 个人身份识别码(Personal Identification Number)
MAC 消息鉴别码(Message Authentication Code)
ECC 椭圆曲线密码算法(Elliptic Curve Cryptography)ECC 椭圆曲线密码算法(Elliptic Curve Cryptography)

使用方式

  • 智能 IC 卡及智能密码钥匙应用接口位于智能 IC 卡及智能密码钥匙应用程序与设备之间,如图所示。
    image
  • 一个设备中存在设备认证密钥和多个应用,应用之间相互独立。
    image

4.GMT 0018-2012

  • 密码设备应用接口规范是公钥密码基础设施应用体系框架下服务类密码设备统一应用接口标准,通过该接口调用密码设备,向上层提供基础密码服务。

  • 服务类密码设备的开发以及应用开发应遵循此接口规范

  • 符号和缩略语

    • ECC 椭圆曲线算法(Elliptic Curve Cryptography)
    • IPK 内部加密公钥(Internal Public Key)
    • ISK 内部加密私钥(Internal Private Key)
    • EPK 外部加密公钥(External Public Key)
    • KEK 密钥加密密钥(Key Encrypt Key)

使用方式

  • 密码设备服务层由密码机、密码卡、智能密码终端等设备组成,通过密码设备应用接口向通用密码服务层提供基础密码服务。基础密码服务包括密钥生成、单一的密码运算、文件管理等的服密码设备应用接口在公钥密码基础设施应用技术体系中的位置:
    image

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更侧重于设备。

6.代码运行截图

6.1 Crypto API

6.1.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile

image
image
image

6.1.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EnumCerts

image

6.1.3 龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\Sign_Verify

image

6.2 PKCS#11

6.2.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\GetUSBInfos

image

6.2.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest

DES
image
RC2
image
RSA
image
AES
image

6.3 SKF

6.3.1 龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\DevAuth

image

6.3.2 龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\Signature

image