密码引擎-3-加密API研究

微软的Crypto API

资料查询和学习

  • 微软公司在NT4.0以上版本中提供了一套完整的Crypto API的函数,支持密钥交换,数据加密解密,数字签名,给程序员带来了很大方便,用户在对软件进行保护的时候可以直接利用Crypto API来完成这些工作,比如计算注册码,检查程序的完整性等。在用这些API进行加密解密的时候,只需要知道如何去应用它们,而不必知道它们的底层实现。首先,是Crypto API运行的环境,需要Crypt32.lib,将它加到project->setting->link下面,也可以在程序中用#pragma comment (lib, "crypt32.lib")加入。在程序开头,你要加入两个头文件windows.hWincrypt.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


posted @ 2024-04-08 11:13  gaozheng08  阅读(6)  评论(0编辑  收藏  举报