Crypto API
简介
- Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。
使用方式
- Crypto API 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7标准格式编码和解码等。
函数
-
CryptoAPI共有五部分组成:简单消息函数、低层消息函数、基本加密函数、证书编解码函数和证书库管理函数。前三者可用于对敏感信息进行加密或签名处理,可保证网络传输信心的私有性;后两者通过对证书的使用,可保证网络信息交流中的认证性。
-
基本加密函数:为开发加密应用程序提供了足够灵活的空间。所有CSP 的通讯都是通过这些函数。一个CSP 是实现所有加密操作的独立模块。在每一个应用程序中至少需要提供一个CSP来完成所需的加密操作。如果使用多于一个以上的CSP,在加密函数调用中就要指定所需的CSP。基本加密函数包含了以下几种:
-
服务提供者函数:应用程序使用服务提供者函数来连接和断开一个CSP。
-
密钥的产生和交换函数:密钥产生函数创建、配置和销毁加密密钥。他们也用于和其他用户进行交换密钥。
-
编码/解码函数:用来对证书、证书撤销列表、证书请求和证书扩展进行编码和解码。
-
数据加密/解密函数:这些函数支持数据的加密/解密操作。CryptEncrypt 和CryptDecrypt 要求在被调用前指定一个密钥。这个密钥可以由CryptGenKey、CryptDeriveKey 或CryptImportKey 产生。创建密钥时要指定加密算法。CryptSetKeyParam 函数可以指定额外的加密参数。
-
哈希和数字签名函数:这些函数在应用程序中完成计算哈希、创建和校验数字签名。
-
-
证书和证书库函数:这组函数管理、使用和取得证书、证书撤销列表和证书信任列表。这些函数可以分成一下几组:
-
证书库函数:一个用户站点可以收集许多证书。这些证书是为这个站点的用户所使用的,证书描述了这个用户的具体身份。对于每个人,可能有一个以上的证书。证书库和其相关的函数提供了对库获得、枚举、验证和使用证书库里的信息。
-
维护函数
-
证书撤销列表函数
-
证书信任列表函数
-
扩展属性函数
-
-
证书验证函数:证书验证是通过CTL 和证书列表进行的。
- 证书链验证函数
-
消息函数:CryptoAPI 消息函数包括两组——低级消息函数和简化消息函数。
-
低级消息函数直接和PKCS#7 消息工作。这些函数对传输的PKCS#7 数据进行编码,对接收到的PKCS#7 数据进行解码,并且对接收到的消息进行解密和验证。
-
简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。这些函数在完成一个任务时,减少了函数调用的数量,因此简化了CryptoAPI的使用。
-
PKCS#11
简介
- PKCS#11(简称P11)是针对密码设备的接口指令标准。P11模型中重要的概念之一是slot,也称为槽。一个slot为一个密码设备对象。某个打开的slot会话称之为session。Session之间存在不同的验证权限。而同一个slot的不同的session之间存在操作的互相影响性,同时在某些状况下,权限会发生同步。另外一个重要的概念是对象。P11中支持几种重要的对象,如公钥、私钥、对称密钥,数据对象等。
使用方式
- 提供了与加密令牌(如智能卡)交互的标准接口。
- 可以用于访问加密令牌中的密钥、进行加密、解密等操作。
- 在编程中,需要首先初始化 PKCS#11 模块,然后通过相应的函数进行密钥管理、加密操作等。
函数
GMT 0016-2012
简介
- GMT 0016-2012是国家规定的智能密码钥匙密码应用接口规范,规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口的函数、数据类型、参数的定义和设备的安全要求。适用于智能密码钥匙产品的研制、使用和检测。
使用方式
函数
- 设备管理系列函数:
- 访问控制系列函数
- 应用管理函数
- 容器管理系列函数
- 密码服务系列函数
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私钥解密:SDFJmportKeyWithlSKJECC
-
生成密钥协商参数并输出:SDF_GenerateAgreementDataWithECC
-
计算会话密钥:SDF_GenerateKey WithECC
-
产生协商数据并计算会话密钥:SDF—GenerateAgreementDataAndKeyWithECC
-
基于 ECC算法的数字信封转换:SDF_ExchangeDigitEnvelopeBaseOnECC
-
生成会话密钥并用密钥加密密钥加密输出: SDF_GenerateKeyWithKEK
-
导入会话密钥并用密钥加密密钥解密:SDF_ImportKeyWithKEK
-
销毁会话密钥:SDF_DestroyKey
-
-
非对称算法运算类函数
-
内部公钥 RSA 运算:SDF_ExternalPublicKeyOperation_RSA
-
内部公钥 RSA 运算:SDF_InternalPublicKeyOperation_RSA
-
内部私钥 RSA 运算:SDF_InternalPrivateKeyOperation_RSA
-
外部密钥 ECC 验证:SDF_ExternalVerify_ECC
-
内部密钥 ECC 签名:SDF_InternalSign_ECC
-
内部密钥 ECC 验证:SDF_InternalVerify_ECC
-
外部密钥 ECC 加密:SDF_ExternalEncrypt_ECC
-
-
对称算法运算类函数
-
对称加密:SDF_Encrypt
-
对称解密:SDF_Decrypt
-
计算MAC:SDF_CalculateMAC
-
-
杂凑运算类函数
-
杂凑运算初始化:SDF_HashInit
-
多包杂凑运算:SDF_HashUpdate
-
杂凑运算结束:SDF_HashFinal
-
异同
-
异同点:
-
Crypto API 和 PKCS#11 是通用的加密标准,提供了加密、解密、签名、验证等功能,而 GMT 0016-2012 和 GMT 0018-2012 则是针对具体算法的标准,分别定义了 ECDSA 数字签名和椭圆曲线加密的规范。
-
PKCS#11 主要用于与加密令牌交互,而 Crypto API 则是用于通用的加密操作。
-
GMT 0016-2012 和 GMT 0018-2012 都是基于椭圆曲线密码学的标准,但一个用于数字签名,一个用于加密。
-