加密API研究

学习密码引擎API

Microsoft Crypto API

CryptoAPI 系统体系结构由五个主要功能领域组成:

  • 基本加密函数
  • 证书编码/解码函数
  • 证书存储函数
  • 简化的消息函数
  • 低级别消息函数

CryptoAPI 系统体系结构

其结构如下:
Crypto API Architecture

基本加密函数

  • 用于连接到 \(CSP (Cryptographic Service Provider)\)的上下文函数。 这些函数使应用程序能够按名称选择特定的 \(CSP\),或选择可以提供所需功能类别的特定 \(CSP\)
  • 用于生成和存储加密密钥的密钥生成函数。 包括对更改链接模式、 初始化向量和其他加密功能的完全支持。
  • 用于交换或传输密钥的密钥交换函数。

证书编码/解码函数

  • 用于加密或解密数据的函数,还支持对数据进行哈希处理。

证书存储函数

  • 用于管理数字证书集合的函数。

简化的消息函数

  • 用于加密和解密消息与数据的函数。
  • 用于对消息和数据进行签名的函数。
  • 用于验证所接收消息和相关数据上签名的真实性的函数。

低级别消息函数

  • 用于执行简化消息函数执行的所有任务的函数。 与简化的消息函数相比,低级别消息函数提供更大的灵活性,但需要更多的函数调用。

CryptoAPI提供的功能

隐私

由以下功能区域来执行加密/解密、消息签名和密钥存储任务:

  • 基本加密函数
  • 简化的消息函数
  • 低级别消息函数

身份验证

CryptoAPI 支持通过使用数字证书、证书编码/解码函数和 证书存储 函数进行身份验证。

完整性

CryptoAPI 通过使用消息函数对数据进行签名和验证数字签名,支持完整性。

基本加密函数

基本加密函数提供了开发加密应用程序的最灵活方法。 与 加密服务提供程序 (CSP) 的所有通信都通过这些功能进行。
CSP 是一个独立的模块,用于执行所有加密操作。 使用加密函数的每个应用程序至少需要一个 CSP。 单个应用程序偶尔可以使用多个 CSP。
如果使用了多个 CSP,则可以在 CryptoAPI 加密函数调用中指定要使用的 CSP。 一个 CSP(Microsoft 基础加密提供程序)与 CryptoAPI 捆绑在一起。 如果未指定其他 CSP,则许多 CryptoAPI 函数将此 CSP 用作默认提供程序。
每个 CSP 提供对 CryptoAPI 提供的加密支持的不同实现。 有些提供更强大的加密算法;其他组件包含硬件组件,例如 智能卡。 此外,某些 CSP 有时可以直接与用户通信,例如使用用户的签名私钥执行数字签名时。
基本加密函数位于以下6个组中:

  • 服务提供程序函数
  • 密钥生成和交换函数
  • 对象编码和解码函数
  • 数据加密和解密函数
  • 哈希和数字签名函数

服务提供程序函数

应用程序使用以下服务函数 (CSP) 连接和断开连接 加密服务提供程序 。
image

密钥生成和交换函数

密钥生成和交换功能与其他用户 交换密钥 ,以及创建、配置和销毁 加密密钥。
image

对象编码和解码函数

这些是通用编码和解码函数。 它们用于对 证书、 证书吊销列表 (CRL) 、 证书请求和证书扩展进行编码和解码。
image

数据加密和解密函数

以下函数支持加密和解密操作。 CryptEncrypt 和 CryptDecrypt 在被调用之前需要 加密密钥 。 这是通过使用 CryptGenKey、 CryptDeriveKey 或 CryptImportKey 函数完成的。 加密算法是在创建密钥时指定的。 CryptSetKeyParam 可以设置其他加密参数。
image

哈希和数字签名函数

这些函数计算数据的 哈希 ,还创建和验证 数字签名。 哈希也称为消息摘要。
image

证书和证书存储函数

证书和证书存储函数管理 证书的使用、存储和检索、 证书吊销列表 (CRL) ,以及 证书信任列表 (CTL) 。 这些函数分为以下组:

证书存储函数
证书和证书存储维护函数
证书函数
证书吊销列表函数
证书信任列表函数
扩展属性函数
MakeCert 函数

证书存储函数

随着时间的推移,用户站点可以收集许多证书。 通常,站点具有站点用户的证书,以及描述用户与之通信的个人和实体的其他证书。 对于每个实体,可以有多个证书。 对于每个单独的证书,应该有一个验证证书链,提供一个回退到受信任的 根证书的跟踪。 证书存储 及其相关函数提供存储、检索、枚举、验证和使用存储在证书中的信息的功能。
image

证书和证书存储维护函数

CryptoAPI 提供一组常规证书和证书存储维护功能。
image

证书函数

大多数 证书 函数都有用于处理 CRL 和 CTL 的相关函数。
image

证书吊销列表函数

这些函数管理 证书吊销列表 (CRL) 的存储和检索。
image

证书信任列表函数

image

扩展属性函数

以下函数使用证书、CRL 和 CTL 的扩展属性。
image

MakeCert 函数

image

证书验证函数

使用 CTL 的验证函数

这些函数在验证过程中使用 CTL。 可以在证书信任列表函数和扩展属性函数中找到用于处理 CTL 的其他函数。
image

证书链验证函数

生成证书链是为了提供有关单个证书的信任信息。
image

消息函数

CryptoAPI 消息函数由两组函数组成:低级别消息函数和 简化消息函数。
低级别消息函数创建并直接处理 PKCS #7 消息。 这些函数对 PKCS #7 数据进行编码,以便传输和解码收到的 PKCS #7 数据。 它们还会解密和验证收到的消息的签名。
简化的消息函数处于较高级别,并将多个低级别消息函数和证书函数包装成以特定方式执行特定任务的单个函数。 这些函数减少了完成任务所需的函数调用数,从而简化了 CryptoAPI 的使用。

低级别消息函数

低级别消息函数提供对传输数据进行编码和解码收到的 PKCS #7 消息所需的功能。 还提供了解密和验证已接收消息的签名的功能。 不建议在大多数应用程序中使用这些低级别消息函数。 对于大多数应用程序,首选使用简化的消息函数(将多个低级别消息函数包装到单个函数调用中)
image

简化的消息函数

简化的消息函数 将低级别消息函数包装到单个函数中,以完成指定的任务。
image

辅助函数

数据管理函数

image

数据转换函数

image

增强的键用法函数

以下函数处理增强型 密钥用法 (EKU) 扩展和证书的 EKU 扩展属性。 EKU 扩展和扩展属性指定并限制证书的有效使用。 扩展是证书本身的一部分。 它们由证书的颁发者设置,并且是只读的。 证书扩展属性是与可在应用程序中设置的证书关联的值。
image

键标识符函数

密钥标识符函数允许用户创建、设置、检索或查找密钥标识符或其属性。
密钥标识符是 公钥/私钥对的唯一标识符。 它可以是任何唯一标识符,但通常是编码 CERT_PUBLIC_KEY_INFO 结构的 20 字节 SHA1 哈希。 可以通过证书的CERT_KEY_IDENTIFIER_PROP_ID获取密钥标识符。 密钥标识符允许使用该 密钥对 来加密或解密消息,而无需使用证书。
密钥标识符不与 CRL 或 CTL 相关联。
image

OID 支持函数

image

远程对象检索函数

image

PFX 函数

image

证书服务备份和还原功能

证书服务包括用于备份和还原证书服务数据库的函数。 这些证书服务备份和还原功能包含在 Certadm.dll 中。 与与证书服务关联的其他 API 元素不同,这些函数未封装在可用于调用类方法的对象中。 相反,备份和还原 API 是通过调用 LoadLibrary 将 Certadm.dll 库加载到内存中,然后通过调用 GetProcAddress 来确定函数的地址来调用的。 调用完证书服务备份和还原函数后,调用 FreeLibrary 以从内存中释放 Certadm.dll 资源。
image

回调函数

本节中的回调函数用于注册或安装应用程序定义的 证书存储 提供程序,并通过回调函数提供相关功能。 回调函数由应用程序实现,并由 CryptoAPI 函数调用。 回调函数使应用程序能够在一定程度上控制 CryptoAPI 函数操作数据的方式。
image

目录定义函数

这些函数用于创建目录。 所有这些函数都由 MakeCat 调用。
image

目录函数

image

WinTrust Functions

以下函数用于执行各种信任操作。
image

对象定位器函数

以下回调函数可由自定义提供程序实现,该提供程序将由安全通道 (Schannel) 安全包调用以检索证书。
image

RAS公司的PKCS#11标准

Cryptoki模型

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

主要接口函数

通用接口

image

槽和令牌管理

image

会话管理

image

对象管理

image

加密函数

image

解密函数

image

消息摘要

image

签名和MAC

image

验证签名和MAC

image

密钥管理

image

随机数生成

image

GMT 0016-2012 智能密码钥匙密码应用接口规范

详细接口调用参考github

设备管理

设备管理主要完成设备的插拔事件处理、枚举设备、连接设备、断开连接、获取设备状态、设置设备
标签、获取设备信息、锁定设备、解锁设备和设备命令传输等操作。
image

访问控制

访问控制主要完成设备认证、PIN码管理和安全状态管理等操作。
image

应用管理

应用管理主要完成应用的创建、枚举、删除、打开、关闭等操作。
image

文件管理

文件管理函数用以满足用户扩展开发的需要,包括创建文件、删除文件、枚举文件、获取文件信息、
文件读写等操作。
image

容器管理

本规范提供的应用管理用于满足各种不同应用的管理,包括创建、删除、枚举、打开和关闭容器的操
作。
image

密码服务

密码服务函数提供对称算法运算、非对称算法运算、密码杂凑运算、密钥管理、消息鉴别码计算等功
能。
image
image

GMT 0018-2012密码设备应用接口规范

详细接口规范参考github

设备管理类函数

image

密钥管理类函数

image
image

非对称算法运算类函数

image

对称算法运算类函数

image

杂凑运算类函数

image

用户文件操作类函数

image

总结使用方式

Crypto API

  1. 初始化加密服务提供程序(CSP):
    使用 CryptAcquireContext 函数初始化加密服务提供程序。你可以选择创建一个新的CSP或者使用现有的CSP。
  2. 生成或获取密钥:
    使用 CryptGenKey 函数生成对称或非对称密钥,或者使用 CryptImportKey 函数导入现有的密钥。
    如果需要,可以使用 CryptGetUserKey 函数获取用户密钥。
  3. 执行加密和解密操作:
    使用 CryptEncrypt 函数对数据进行加密。
    使用 CryptDecrypt 函数对加密的数据进行解密。
  4. 执行签名和验证操作(可选):
    使用 CryptSignHash 函数对哈希值进行签名。
    使用 CryptVerifySignature 函数验证签名的有效性。
  5. 管理证书(可选):
    使用 CertOpenStore 函数打开证书存储,然后可以使用一系列证书管理函数进行证书的添加、删除、查找等操作。

PKCS#11标准

  1. 引入PKCS#11库:首先需要引入PKCS#11库,通常是一个动态链接库(DLL)或者共享对象(SO)。该库由密码设备供应商提供,用于提供与密码设备的通信接口。
  2. 加载PKCS#11库:在应用程序中加载PKCS#11库,并初始化它,以便与密码设备进行通信。
  3. 初始化密码设备:使用PKCS#11库提供的函数初始化密码设备,这可能涉及到认证、PIN码管理等操作。
  4. 管理会话:PKCS#11库通常采用会话管理来管理与密码设备的通信。你可能需要创建、打开、关闭会话来执行各种操作。
  5. 管理对象:密码设备上的各种对象(如密钥、证书等)可以由PKCS#11库进行管理。你可能需要创建、删除、枚举、查找这些对象。
  6. 执行加密和解密操作:使用PKCS#11库提供的函数执行加密和解密操作。通常,你需要指定要使用的密钥和加密算法。
  7. 执行签名和验证操作:如果密码设备支持数字签名功能,你可以使用PKCS#11库执行签名和验证操作。

GMT 0016-2012 智能密码钥匙密码应用接口规范

  1. 引入密码应用接口库:首先需要引入密码应用接口库,该库通常由智能密码钥匙设备的供应商提供,用于提供与设备通信的接口。
  2. 加载密码应用接口库:在应用程序中加载密码应用接口库,并初始化它,以便与智能密码钥匙设备进行通信。
  3. 设备管理:使用密码应用接口库提供的函数管理智能密码钥匙设备,包括插拔事件处理、设备连接、断开连接等操作。
  4. 访问控制:进行设备认证、PIN码管理和安全状态管理等访问控制操作,以确保对设备的安全访问。
  5. 应用管理:管理智能密码钥匙设备上的应用,包括创建、枚举、删除、打开、关闭应用等操作。
  6. 文件管理:对智能密码钥匙设备上的文件进行管理,包括创建文件、删除文件、枚举文件、获取文件信息、文件读写等操作。
  7. 容器管理:管理智能密码钥匙设备上的容器,包括创建、删除、枚举、打开和关闭容器等操作。
  8. 密码服务:使用密码服务函数执行对称算法运算、非对称算法运算、密码杂凑运算、密钥管理、消息鉴别码计算等操作。

GMT 0018-2012密码设备应用接口规范

  1. 引入密码设备应用接口库:首先需要引入密码设备应用接口库,该库通常由密码设备的供应商提供,用于提供与设备通信的接口。
  2. 加载密码设备应用接口库:在应用程序中加载密码设备应用接口库,并初始化它,以便与密码设备进行通信。
  3. 设备管理:使用密码设备应用接口库提供的函数管理密码设备,包括设备的连接、断开连接、设备状态查询等操作。
  4. 密钥管理:使用密码设备应用接口库提供的函数进行密钥的创建、导入、导出、销毁等操作。
  5. 非对称算法运算:使用密码设备应用接口库提供的函数进行非对称算法的加密、解密、签名、验签等操作。
  6. 对称算法运算:使用密码设备应用接口库提供的函数进行对称算法的加密、解密等操作。
  7. 杂凑运算:使用密码设备应用接口库提供的函数进行消息的杂凑运算。
  8. 用户文件操作:使用密码设备应用接口库提供的函数对设备上的文件进行管理,包括文件的创建、删除、读取、写入等操作。

列表、总结异同

列表与分类在上述的学习密码引擎API中已经展示,接下来总结异同。

功能特点

微软的Crypto API

提供与操作系统集成的加密和解密功能。
适用于Windows操作系统环境。
提供了丰富的加密算法和功能集,如基本加密函数、证书编码/解码函数、证书存储函数等。

RAS公司的PKCS#11标准

提供了一种与密码设备进行通信的标准接口。
可在不同的操作系统和平台上使用。
是一种通用的密码设备接口标准,提供了跨平台的兼容性。
适用于各种类型的密码设备,如智能卡、USB加密锁等。

GMT 0016-2012 智能密码钥匙密码应用接口规范

用于智能密码钥匙的接口规范。
包括设备管理、密钥管理、算法运算、文件操作等功能。
主要面向智能密码钥匙等特定类型的密码设备。
提供了一套专门的接口,以满足智能密码钥匙的需求。

GMT 0018-2012密码设备应用接口规范

用于各种类型密码设备的接口规范。
包括设备管理、密钥管理、算法运算、文件操作等功能。
更通用,适用于不同类型的密码设备,如智能密码钥匙、USB加密锁等。
提供了一套通用的接口,以满足不同类型密码设备的需求。

异同

共同点

  • 提供接口规范:所有这些标准和规范都旨在提供一套标准化的接口,以便应用程序可以与密码设备进行通信和交互。
  • 包含功能模块:它们都包含了设备管理、密钥管理、算法运算、文件操作等功能模块,以满足密码设备应用的各种需求。

不同点

  • 适用范围:
    微软的Crypto API和RAS公司的PKCS#11标准是通用的密码设备接口标准,可以在不同的操作系统和平台上使用。
    GMT 0016-2012 智能密码钥匙密码应用接口规范和GMT 0018-2012密码设备应用接口规范则更具体,分别适用于智能密码钥匙和各种类型的密码设备。
  • 标准制定机构:
    微软的Crypto API由Microsoft制定和实现。
    RAS公司的PKCS#11标准由RSA Security Inc.制定。
    GMT 0016-2012和GMT 0018-2012是中国国家密码管理局颁布的密码设备接口规范。
  • 兼容性和普适性:
    PKCS#11标准是一种通用标准,具有跨平台的兼容性,可以适用于各种类型的密码设备。
    GMT 0016-2012和GMT 0018-2012更加针对特定类型的密码设备,提供了更具体的功能和接口,但可能缺乏跨平台的兼容性。

调用接口实例

以下展示了调用各种API的实例,代码为解压包附带,不予展示。

ubuntu调用实例

skf

deviceAuth

image

encryptTest

image

signatureTest

image

Windows调用实例

csp

EncryptDecryptFile

加密

image
image

解密

image
image

EnumCerts

image

Sign_Verify

image

pkcs11

PKCSDemo

需要处理项目文件中的NEWLINE。
image
现在已经登录成功了

RSA Sign and verify

image

RSA Encrypt and Decrypt

image

PKCSTest

DES

image

DES3

image

RC2

image

RC4

image

RSA

image

AES

image
测试均成功。

skf

deviceAuth

image

EncryptData

image

Remoteunblock

image

Signature

image

posted @ 2024-04-09 20:00  20211120  阅读(18)  评论(0编辑  收藏  举报