加密API研究
学习密码引擎API
Microsoft Crypto API
CryptoAPI 系统体系结构由五个主要功能领域组成:
- 基本加密函数
- 证书编码/解码函数
- 证书存储函数
- 简化的消息函数
- 低级别消息函数
CryptoAPI 系统体系结构
其结构如下:
基本加密函数
- 用于连接到 \(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) 连接和断开连接 加密服务提供程序 。
密钥生成和交换函数
密钥生成和交换功能与其他用户 交换密钥 ,以及创建、配置和销毁 加密密钥。
对象编码和解码函数
这些是通用编码和解码函数。 它们用于对 证书、 证书吊销列表 (CRL) 、 证书请求和证书扩展进行编码和解码。
数据加密和解密函数
以下函数支持加密和解密操作。 CryptEncrypt 和 CryptDecrypt 在被调用之前需要 加密密钥 。 这是通过使用 CryptGenKey、 CryptDeriveKey 或 CryptImportKey 函数完成的。 加密算法是在创建密钥时指定的。 CryptSetKeyParam 可以设置其他加密参数。
哈希和数字签名函数
这些函数计算数据的 哈希 ,还创建和验证 数字签名。 哈希也称为消息摘要。
证书和证书存储函数
证书和证书存储函数管理 证书的使用、存储和检索、 证书吊销列表 (CRL) ,以及 证书信任列表 (CTL) 。 这些函数分为以下组:
证书存储函数
证书和证书存储维护函数
证书函数
证书吊销列表函数
证书信任列表函数
扩展属性函数
MakeCert 函数
证书存储函数
随着时间的推移,用户站点可以收集许多证书。 通常,站点具有站点用户的证书,以及描述用户与之通信的个人和实体的其他证书。 对于每个实体,可以有多个证书。 对于每个单独的证书,应该有一个验证证书链,提供一个回退到受信任的 根证书的跟踪。 证书存储 及其相关函数提供存储、检索、枚举、验证和使用存储在证书中的信息的功能。
证书和证书存储维护函数
CryptoAPI 提供一组常规证书和证书存储维护功能。
证书函数
大多数 证书 函数都有用于处理 CRL 和 CTL 的相关函数。
证书吊销列表函数
这些函数管理 证书吊销列表 (CRL) 的存储和检索。
证书信任列表函数
扩展属性函数
以下函数使用证书、CRL 和 CTL 的扩展属性。
MakeCert 函数
证书验证函数
使用 CTL 的验证函数
这些函数在验证过程中使用 CTL。 可以在证书信任列表函数和扩展属性函数中找到用于处理 CTL 的其他函数。
证书链验证函数
生成证书链是为了提供有关单个证书的信任信息。
消息函数
CryptoAPI 消息函数由两组函数组成:低级别消息函数和 简化消息函数。
低级别消息函数创建并直接处理 PKCS #7 消息。 这些函数对 PKCS #7 数据进行编码,以便传输和解码收到的 PKCS #7 数据。 它们还会解密和验证收到的消息的签名。
简化的消息函数处于较高级别,并将多个低级别消息函数和证书函数包装成以特定方式执行特定任务的单个函数。 这些函数减少了完成任务所需的函数调用数,从而简化了 CryptoAPI 的使用。
低级别消息函数
低级别消息函数提供对传输数据进行编码和解码收到的 PKCS #7 消息所需的功能。 还提供了解密和验证已接收消息的签名的功能。 不建议在大多数应用程序中使用这些低级别消息函数。 对于大多数应用程序,首选使用简化的消息函数(将多个低级别消息函数包装到单个函数调用中)
简化的消息函数
简化的消息函数 将低级别消息函数包装到单个函数中,以完成指定的任务。
辅助函数
数据管理函数
数据转换函数
增强的键用法函数
以下函数处理增强型 密钥用法 (EKU) 扩展和证书的 EKU 扩展属性。 EKU 扩展和扩展属性指定并限制证书的有效使用。 扩展是证书本身的一部分。 它们由证书的颁发者设置,并且是只读的。 证书扩展属性是与可在应用程序中设置的证书关联的值。
键标识符函数
密钥标识符函数允许用户创建、设置、检索或查找密钥标识符或其属性。
密钥标识符是 公钥/私钥对的唯一标识符。 它可以是任何唯一标识符,但通常是编码 CERT_PUBLIC_KEY_INFO 结构的 20 字节 SHA1 哈希。 可以通过证书的CERT_KEY_IDENTIFIER_PROP_ID获取密钥标识符。 密钥标识符允许使用该 密钥对 来加密或解密消息,而无需使用证书。
密钥标识符不与 CRL 或 CTL 相关联。
OID 支持函数
远程对象检索函数
PFX 函数
证书服务备份和还原功能
证书服务包括用于备份和还原证书服务数据库的函数。 这些证书服务备份和还原功能包含在 Certadm.dll 中。 与与证书服务关联的其他 API 元素不同,这些函数未封装在可用于调用类方法的对象中。 相反,备份和还原 API 是通过调用 LoadLibrary 将 Certadm.dll 库加载到内存中,然后通过调用 GetProcAddress 来确定函数的地址来调用的。 调用完证书服务备份和还原函数后,调用 FreeLibrary 以从内存中释放 Certadm.dll 资源。
回调函数
本节中的回调函数用于注册或安装应用程序定义的 证书存储 提供程序,并通过回调函数提供相关功能。 回调函数由应用程序实现,并由 CryptoAPI 函数调用。 回调函数使应用程序能够在一定程度上控制 CryptoAPI 函数操作数据的方式。
目录定义函数
这些函数用于创建目录。 所有这些函数都由 MakeCat 调用。
目录函数
WinTrust Functions
以下函数用于执行各种信任操作。
对象定位器函数
以下回调函数可由自定义提供程序实现,该提供程序将由安全通道 (Schannel) 安全包调用以检索证书。
RAS公司的PKCS#11标准
Cryptoki模型
Cryptoki:Cryptographic Token Interface Standard 密码令牌接口标准,应用程序与各种各样便携式密码设备间的一种接口。
设备的种类和所支持的能力的种类取决于专用的Cryptoki库。该标准只定义库的接口,不定义库的实现,接口实现由设备商提供。
Cryptoki主要目标是一个低级程序接口,将设备的细节抽象化,并把密码设备的通用模型-密码令牌提供给应用程序。第二目标是资源共享,单个设备能为一个以上的应用程序共享。
Cryptoki为一个或多个密码设备提供一个接口,这些设备通过大量的槽在系统中运行,密码设备可以按照某一命令集执行某些密码操作,这些命令通常通过标准的设备驱动程序来实现,Cryptoki的作用就是屏蔽这些硬件的差异。
主要接口函数
通用接口
槽和令牌管理
会话管理
对象管理
加密函数
解密函数
消息摘要
签名和MAC
验证签名和MAC
密钥管理
随机数生成
GMT 0016-2012 智能密码钥匙密码应用接口规范
详细接口调用参考github
设备管理
设备管理主要完成设备的插拔事件处理、枚举设备、连接设备、断开连接、获取设备状态、设置设备
标签、获取设备信息、锁定设备、解锁设备和设备命令传输等操作。
访问控制
访问控制主要完成设备认证、PIN码管理和安全状态管理等操作。
应用管理
应用管理主要完成应用的创建、枚举、删除、打开、关闭等操作。
文件管理
文件管理函数用以满足用户扩展开发的需要,包括创建文件、删除文件、枚举文件、获取文件信息、
文件读写等操作。
容器管理
本规范提供的应用管理用于满足各种不同应用的管理,包括创建、删除、枚举、打开和关闭容器的操
作。
密码服务
密码服务函数提供对称算法运算、非对称算法运算、密码杂凑运算、密钥管理、消息鉴别码计算等功
能。
GMT 0018-2012密码设备应用接口规范
详细接口规范参考github
设备管理类函数
密钥管理类函数
非对称算法运算类函数
对称算法运算类函数
杂凑运算类函数
用户文件操作类函数
总结使用方式
Crypto API
- 初始化加密服务提供程序(CSP):
使用 CryptAcquireContext 函数初始化加密服务提供程序。你可以选择创建一个新的CSP或者使用现有的CSP。 - 生成或获取密钥:
使用 CryptGenKey 函数生成对称或非对称密钥,或者使用 CryptImportKey 函数导入现有的密钥。
如果需要,可以使用 CryptGetUserKey 函数获取用户密钥。 - 执行加密和解密操作:
使用 CryptEncrypt 函数对数据进行加密。
使用 CryptDecrypt 函数对加密的数据进行解密。 - 执行签名和验证操作(可选):
使用 CryptSignHash 函数对哈希值进行签名。
使用 CryptVerifySignature 函数验证签名的有效性。 - 管理证书(可选):
使用 CertOpenStore 函数打开证书存储,然后可以使用一系列证书管理函数进行证书的添加、删除、查找等操作。
PKCS#11标准
- 引入PKCS#11库:首先需要引入PKCS#11库,通常是一个动态链接库(DLL)或者共享对象(SO)。该库由密码设备供应商提供,用于提供与密码设备的通信接口。
- 加载PKCS#11库:在应用程序中加载PKCS#11库,并初始化它,以便与密码设备进行通信。
- 初始化密码设备:使用PKCS#11库提供的函数初始化密码设备,这可能涉及到认证、PIN码管理等操作。
- 管理会话:PKCS#11库通常采用会话管理来管理与密码设备的通信。你可能需要创建、打开、关闭会话来执行各种操作。
- 管理对象:密码设备上的各种对象(如密钥、证书等)可以由PKCS#11库进行管理。你可能需要创建、删除、枚举、查找这些对象。
- 执行加密和解密操作:使用PKCS#11库提供的函数执行加密和解密操作。通常,你需要指定要使用的密钥和加密算法。
- 执行签名和验证操作:如果密码设备支持数字签名功能,你可以使用PKCS#11库执行签名和验证操作。
GMT 0016-2012 智能密码钥匙密码应用接口规范
- 引入密码应用接口库:首先需要引入密码应用接口库,该库通常由智能密码钥匙设备的供应商提供,用于提供与设备通信的接口。
- 加载密码应用接口库:在应用程序中加载密码应用接口库,并初始化它,以便与智能密码钥匙设备进行通信。
- 设备管理:使用密码应用接口库提供的函数管理智能密码钥匙设备,包括插拔事件处理、设备连接、断开连接等操作。
- 访问控制:进行设备认证、PIN码管理和安全状态管理等访问控制操作,以确保对设备的安全访问。
- 应用管理:管理智能密码钥匙设备上的应用,包括创建、枚举、删除、打开、关闭应用等操作。
- 文件管理:对智能密码钥匙设备上的文件进行管理,包括创建文件、删除文件、枚举文件、获取文件信息、文件读写等操作。
- 容器管理:管理智能密码钥匙设备上的容器,包括创建、删除、枚举、打开和关闭容器等操作。
- 密码服务:使用密码服务函数执行对称算法运算、非对称算法运算、密码杂凑运算、密钥管理、消息鉴别码计算等操作。
GMT 0018-2012密码设备应用接口规范
- 引入密码设备应用接口库:首先需要引入密码设备应用接口库,该库通常由密码设备的供应商提供,用于提供与设备通信的接口。
- 加载密码设备应用接口库:在应用程序中加载密码设备应用接口库,并初始化它,以便与密码设备进行通信。
- 设备管理:使用密码设备应用接口库提供的函数管理密码设备,包括设备的连接、断开连接、设备状态查询等操作。
- 密钥管理:使用密码设备应用接口库提供的函数进行密钥的创建、导入、导出、销毁等操作。
- 非对称算法运算:使用密码设备应用接口库提供的函数进行非对称算法的加密、解密、签名、验签等操作。
- 对称算法运算:使用密码设备应用接口库提供的函数进行对称算法的加密、解密等操作。
- 杂凑运算:使用密码设备应用接口库提供的函数进行消息的杂凑运算。
- 用户文件操作:使用密码设备应用接口库提供的函数对设备上的文件进行管理,包括文件的创建、删除、读取、写入等操作。
列表、总结异同
列表与分类在上述的学习密码引擎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
encryptTest
signatureTest
Windows调用实例
csp
EncryptDecryptFile
加密
解密
EnumCerts
Sign_Verify
pkcs11
PKCSDemo
需要处理项目文件中的NEWLINE。
现在已经登录成功了
RSA Sign and verify
RSA Encrypt and Decrypt
PKCSTest
DES
DES3
RC2
RC4
RSA
AES
测试均成功。