微软的Crypto API
资料查询和学习
- 微软公司在NT4.0以上版本中提供了一套完整的Crypto API的函数,支持密钥交换,数据加密解密,数字签名,给程序员带来了很大方便,用户在对软件进行保护的时候可以直接利用Crypto API来完成这些工作,比如计算注册码,检查程序的完整性等。在用这些API进行加密解密的时候,只需要知道如何去应用它们,而不必知道它们的底层实现。首先,是Crypto API运行的环境,需要
Crypt32.lib
,将它加到project->setting->link
下面,也可以在程序中用#pragma comment (lib, "crypt32.lib")
加入。在程序开头,你要加入两个头文件windows.h
和Wincrypt.h
,和一个#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)。
- CryptoAPI的编程模型同Windows系统的图形设备接口 GDI比较类似,其中加密服务提供者CSP等同于图形设备驱动程序 ,加密硬件(可选)等同于图形硬件,其上层的应用程序也类似,都不需要同设备驱动程序和硬件直接打交道。
- CryptoAPI共有五部分组成:简单消息函数(Simplified Message Functions)、低层消息函数(Low-level Message Functions)、基本加密函数(Base Cryptographic Functions)、证书编解码函数(Certificate Encode/Decode Functions)和证书库管理函数(Certificate Store Functions)。其中前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。CSP是真正实行加密的独立模块,可以由软件实现也可以由硬件实现。CSP必须符合CryptoAPI接口的规范。每个CSP都有一个名字和一个类型。每个CSP的名字是唯一的,这样便于CryptoAPI找到对应的CSP。目前已经有9种CSP类型,并且还在增长。
- 9种CSP类型及其支持算法
使用方法总结
生成密钥和密钥容器
- 在进行加密解密的时候,需要一个密钥进行加密,一个密钥进行解密,加密密钥和解密密钥可能相同,也可能不同。于是在我们进行加密解密的开始时,我们首先需要有密钥,按步进行下面三个步骤:
- 获取一个指定的密钥容器,如果不存在,创建一个;
- 如果容器中不存在一个签名密钥对,创建一个;
- 如果容器中不存在一个交换密钥对,创建一个。
获取密钥
- 首先需要获取一个session key,即对话密钥,是对称密钥;当我们已经生成了一个密钥,下面要做的是如何保存,导出,导入一个对话密钥。将一个密钥保存起来,导出,保存到硬盘上。这样,这个密钥就可以在其它应用程序上使用,而不会随着生成密钥程序的关闭而丢失;
进行加密
API函数及分类
基本加密函数
- 服务提供者函数:应用程序使用服务提供者函数来连接和断开一个CSP,主要API如下图:
- 密钥的产生和交换函数:密钥产生函数创建、配置和销毁加密密钥,也用于和其他用户进行交换密钥,主要API如下图所示:
- 编码/解码函数:有一些编码/解码函数,他们可以用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
- 数据加密/解密函数:这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。
- 哈希和数字签名函数:这些函数在应用程序中完成计算哈希、创建和校验数字签名。
证书和证书库函数
- 证书库函数
- 维护函数
- 证书函数
- 证书撤销列表函数
- 证书信任列表函数
- 拓展属性函数
消息函数
- 低级消息函数
- 简化消息函数
证书验证函数
- 使用CTL的函数
- 证书链验证函数
辅助函数
- 数据管理函数
- 数据转化函数
- 增强秘钥用法函数
- 秘钥标识函数
- 证书库回调函数
- OID支持函数
- 远程对象回复函数
- PFX函数
RAS公司的PKCS#11标准
资料查询和学习
- PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。PKCS#11是使用非常普遍的密码设备接口,在实际应用中,国密的密码设备应用接口规范GMT0018与之作用相同,在技术体系架构中处于类似的位置。在密码产品的开发中,按照PKCS#11或者GMT0018接口规范提供相应的接口封装,应用程序无需改动或者微小改动就可以更换底层密码设备。PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。PKCS#11主要是应用于智能卡和HSM。
使用方式总结
Cryptoki模型
Cryptoki:Cryptographic Token Interface Standard 密码令牌接口标准,应用程序与各种各样便携式密码设备间的一种接口。设备的种类和所支持的能力的种类取决于专用的Cryptoki库。该标准只定义库的接口,不定义库的实现,接口实现由设备商提供。Cryptoki主要目标是一个低级程序接口,将设备的细节抽象化,并把密码设备的通用模型-密码令牌提供给应用程序。第二目标是资源共享,单个设备能为一个以上的应用程序共享。Cryptoki为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行,密码设备可以按照某一命令集执行某些密码操作,这些命令通常通过标准的设备驱动程序来实现,Cryptoki的作用就是屏蔽这些硬件的差异。
令牌逻辑视图
Cryptoki定义数据、证书、密钥三个对象。数据对象由应用程序定义。一个证书对象存储一个证书。一个密钥对象存储一个密码密钥。密钥可以使公共密钥、私钥、保密密钥,每种密钥用于特定的机制时都有其子类型。令牌能建立、破坏、操作和搜寻对象,也可以对对象执行加密功能
主要接口函数
通用接口
- 槽和令牌管理
回话管理
对象管理
加密函数
解密函数
消息摘要
签名和MAC
验证签名和MAC
秘钥管理
随机数生成
GMT 0016-2012 智能密码钥匙密码应用接口规范
资料查询和学习
智能密码钥匙实现实现密码运算、密钥管理功能的终端密码设备,一般使用 USB 接口形态。密码算法至少支持公钥密码算法、分组密码算法和杂凑算法。
使用方法总结
主要接口函数
设备管理函数
访问控制函数
应用管理函数
文件管理函数
容器管理函数
密码服务函数
GMT 0018-2012密码设备应用接口规范
资料查询和学习
使用方式总结
主要接口函数
设备管理函数
- 打开设备:SDF_OpenDevice
- 关闭设备:SDF_CloseDevice
- 创建会话:SDF_OpenSession
- 关闭会话:SDF_CloseSession
- 获取设备信息:SDF_GetDeviceInfo
- 产生随机数:SDF_GenerateRandom
- 获取私钥使用权限:SDF_GetPrivateKeyAccessRight
- 释放私钥使用权限:SDF_ReleasePrivateKeyAccessRight
密钥管理函数
- 导出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_ImportKey
- 销毁会话密钥:SDF_DestroyKey
非对称算法函数
- 外部公钥RSA运算:SDF_ExternalPublicKeyOperation_RSA
- 外部私钥RSA运算:SDF_ExternalPrivateKeyOperation_RSA
- 内部公钥RSA运算:SDF_InternalPublicKeyOperation_RSA
- 内部私钥RSA运算:SDF_InternalPrivateKeyOperation_RSA
- 外部密钥ECC签名:SDF_ExternalSign_ECC
- 外部密钥ECC验证:SDF_ExternalVerify_ECC
- 内部密钥ECC签名:SDF_InternalSign_ECC
- 内部密钥ECC验证:SDF_InternalVerify_ECC
- 外部密钥ECC加密:SDF_ExternalEncrypt_ECC
- 外部密钥ECC解密:SDF_ExternalDecrypt_ECC
对称算法函数
- 对称加密:SDF_Encrypt
- 对称解密:SDF_Decrypt
- 计算MAC:SDF_CalculateMAC
杂凑算法函数
- 杂凑运算初始化:SDF_HashInit
- 多包杂凑运算:SDF_HashUpdate
- 杂凑运算结束:SDF_HashFinal
文件操作函数
- 创建文件:SDF_CreateFile
- 读取文件:SDF_ReadFile
- 写文件:SDF_WriteFile
- 删除文件:SDF_DeleteFile
实例运用
Crypto API 接口
代码链接:Download\龙脉密码钥匙驱动实例工具等\mToken-GM3000\csp\samples\CryptAPI\VC\EncryptDecryptFile\EncryptFile.sln
运行截图
创建原文件
加密
结果
SKF接口
代码链接:龙脉密码钥匙驱动实例工具等\mToken-GM3000\skf\samples\windows\EncryptData\EncryptData.sln
运行截图
PKCS#11 接口
代码链接:龙脉密码钥匙驱动实例工具等\mToken-GM3000\pkcs11\windows\samples\PKCStest\PKCStest.sln
DES
DES3
RC2
RC4
RSA
AES