Crypto API
CryptoAPI概述
Windows Crypto API是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。Crypto API 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7标准格式编码和解码等。
Crypto API使用方式
CryptoAPI本身不实现密码运算相关操作,而是操作系统通过调用CryptoSPI函数接口相应的加密服务提供者函数(CSP)来实现。CryptoAPI函数使用“加密服务提供者”(CSP)完成数据加密、解密以及密钥的存储管理、所有的CSP都是相互独立的模块。理论上,CSP应该独立于特定的应用程序,也就是说所有的应用程序可以使用任何一个CSP。但是,实际上有些应用程序只能与特定的CSP协作。CSP与应用程序之间的关系类似于Windows GDI模型。CSP就类似于图形硬件驱动程序。
Crypto API包含的函数
CryptoAPI体系主要由一下几部分组成:基本加密函数、证书编码与解码函数、证书存储函数、简化信息处理函数、底层信息处理函数。
基本加密函数包含了以下几种:服务提供者函数、密钥的产生和交换函数、编码/解码函数、数据加密/解密函数和哈希和数字签名函数。
证书和证书库函数管理、使用和取得证书、证书撤销列表和证书信任列表。
密钥的产生和交换函数:
CryptAcquireCertificatePrivateKey | 对于指定证书上下文得到一个HCRYPTPROV 句柄和dwKeySpec |
---|---|
CryptDeriveKey | 从一个密码中派生一个密钥 |
CryptDestoryKey | 销毁密钥 |
CryptDuplicateKey | 制作一个密钥和密钥状态的精确复制 |
CryptExportKey | 把CSP 的密钥做成BLOB 传送到应用程序的内存空间中 |
CryptGenKey | 创建一个随机密钥 |
CryptGenRandom | 产生一个随机数 |
CryptGetKeyParam | 得到密钥的参数 |
CryptGetUserKey | 得到一个密钥交换或签名密钥的句柄 |
CryptImportKey | 把一个密钥BLOB 传送到CSP中 |
CryptSetKeyParam | 指定一个密钥的参数 |
编码/解码函数:
CryptDecodeObject | 对lpszStructType 结构进行解码 |
---|---|
CryptDecodeObjectEx | 对lpszStructType 结构进行解码,此函数支持内存分配选项 |
CryptEncodeObject | 对lpszStructType 结构进行编码 |
CyptEncodeObjectEx | 对lpszStructType 结构进行编码,此函数支持内存分配选项 |
数据加密/解密函数:
CryptDecrypt | 使用指定加密密钥来解密一段密文 |
---|---|
CryptEncrypt | 使用指定加密密钥来加密一段明文 |
CryptProtectData | 执行对DATA_BLOB 结构的加密 |
CryptUnprotectData | 执行对DATA_BLOB 结构的完整性验证和解密 |
哈希和数字签名函数:
CryptCreateHash | 创建一个空哈希对象 |
---|---|
CryptDestoryHash | 销毁一个哈希对象 |
CryptDuplicateHash | 复制一个哈希对象 |
CryptGetHashParam | 得到一个哈希对象参数 |
CryptHashData | 对一块数据进行哈希,把它加到指定的哈希对象中 |
CryptHashSessionKey | 对一个会话密钥进行哈希,把它加到指定的哈希对象中 |
CryptSetHashParam | 设置一个哈希对象的参数 |
CryptSignHash | 对一个哈希对象进行签名 |
CryptVerifySignature | 校验一个数字签名 |
PKCS #11
PKCS #11概述
PKCS#11是公钥加密标准Public-Key Cryptography Standards中的一份子,由RSA实验室发布。PKCS#11标准定义了与密码令牌的独立于平台的API,API本身命名为Cryptoki,这个API已经发展成为一个通用的加密令牌的抽象层。PKCS#11主要是应用于智能卡和HSM。
PKCS #11使用方式
PKCS#11称为Cyptoki,定义了一套独立于技术的程序设计接口,USBKey安全应用需要实现的接口。 由于没有一个真正的标准加密令牌,这个API已经发展成为一个通用的加密令牌的抽象层。 PKCS #11 API定义最常用的加密对象类型( RSA密钥,X.509证书,DES /三重DES密钥等)和所有需要使用的功能,创建/生成,修改和删除这些对象。注意:pkcs#11只提供了接口的定义, 不包括接口的实现,一般接口的实现是由设备提供商提供的,如usbkey的生产厂商会提供 符合PKCS#11接口标准的API的实现。这样你只要通过接口调用API函数即可实现其功能。
PKCS #11 函数类别以及相关函数:
-
通用:C_Initialize()、C_Finalize()、C_GetInfo() 和 C_GetFunctionList()
-
会话管理:C_OpenSession()、C_CloseSession()、C_GetSessionInfo()、C_CloseAllSessions()、C_Login() 和 C_Logout()
-
插槽和令牌管理:C_GetSlotList()、C_GetSlotInfo()、C_GetMechanismList()、C_GetMechanismInfo() 和 C_SetPIN()
-
加密和解密:C_EncryptInit()、C_Encrypt()、C_EncryptUpdate()、C_EncryptFinal()、C_DecryptInit()、C_Decrypt()、_DecryptUpdate() 和 C_DecryptFinal()
-
消息摘要:C_DigestInit()、C_Digest()、C_DigestKey()、C_DigestUpdate() 和 C_DigestFinal()
-
MAC 的签名和应用:C_Sign()、C_SignInit()、C_SignUpdate()、C_SignFinal()、C_SignRecoverInit() 和 C_SignRecover()
-
签名验证:C_Verify()、C_VerifyInit()、C_VerifyUpdate()、C_VerifyFinal()、C_VerifyRecoverInit() 和 C_VerifyRecover()
-
双重用途加密函数:C_DigestEncryptUpdate()、C_DecryptDigestUpdate()、C_SignEncryptUpdate() 和 C_DecryptVerifyUpdate()
-
随机数生成:C_SeedRandom() 和 C_GenerateRandom()
-
对象管理:C_CreateObject()、C_DestroyObject()、C_CopyObject()、C_FindObjects()、C_FindObjectsInit()、C_FindObjectsFinal()、C_GetAttributeValue() 和 C_SetAttributeValue()
-
密钥管理:C_GenerateKey()、C_GenerateKeyPair() 和 C_DeriveKey()
GMT 0016-2012
GMT 0016-2012 概述
规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。
适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
GMT 0016-2012使用方式
调用头文件以及接口进行使用
GMT 0016-2012包含的函数
设备管理类函数
SDF_OpenDevice | 打开设备 |
---|---|
SDF_CloseDevice | 关闭设备 |
SDF_OpenSession | 创建会话 |
SDF_CloseSession | 关闭会话 |
SDF_GetDeviceInfo | 获取设备信息 |
SDF_GenerateRandom | 产生随机数 |
SDF_GetPrivateKeyAccessRight | 获取私钥使用权限 |
SDF_ReleasePrivateKeyAccessRight | 释放私钥获取权限 |
密钥管理类函数
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_ExchangeDigitEnvelopeIaseOnRSAH | 基于RSA算法的数字信封转换 |
SDF_ExportSignPublicKey_ECC | 导出ECC签名公钥 |
SDF_ExportEncPublicKey_ECC | 导出ECC加密公钥 |
SDF_GenerateKeyPair_ECC | 产生ECC非对称密钥对并输出 |
SDF_GenerateKeyWithIPK_ECC | 生成会话密钥并用内部ECC公钥加密输出 |
SDF_GenerateKeyWithEPK_ECC | 生成会话密钥并用外部ECC公钥加密输出 |
SDF_ImportKeyWithISKECC | 导入会话密钥并用内部 ECC私钥解密 |
SDF_GenerateAgreementDataWithECC | 生成密钥协商参数并输出 |
SDF_GenerateKeyWihECC | 计算会话密钥 |
SDF_GenerateAgreermentDataAndKeyWithECC | 产生协商数据并计算会话密钥 |
SDF_ExchangeDigitEnvelopeBaseOnECC | 基于ECC算法的数字信封转换 |
SDF_GenerateKeyWithKEK | 生成会话密钥并用密钥加密密钥加密输出 |
SDF_ImportKeyWithKEK | SDF_GenerateKey WitlKEK导入会话密钥并用密钥加密密钥解密 |
SDF_DestroyKey | 销毁会话密钥 |
非对称算法运算类函数
SDF_ExternalPublicKeyOperation_RSA | 外部公钥RSA运算 |
---|---|
SDF_InternalPublicKeyOperation_RSA | 内部公钥RSA运算 |
SDF_InternalPrivateKeyOperation_RSA | 内部私钥RSA运算 |
SDF_ExternalVerify_ECC | 外部密钥ECC验证 |
SDF_InternalSign_ECC | 内部密钥ECC签名 |
SDF_InternalVerify_ECC | 内部密钥ECC验证 |
SDFExternalEncrypt_ECC | 外部密钥EC加密 |
对称算法运算类函数
SDF_ Encrypt | 对称加密 |
---|---|
SDF_Dccrypt | 对称解密 |
SDF_CalculateMAC | 计算MAC |
杂凑运算类函数
SDF HashInit | 杂凑运算初始化 |
---|---|
SDF HashUpdate | 多包杂凑运算 |
SDF_HashFinal | 杂凑运算结束 |
用户文件操作类函数
SDF_CreateFile | 创建文件 |
---|---|
SDF_ReadFile | 读取文件 |
SDF_WriteFile | 写文件 |
SDF_DeleteFile | 删除文件 |
GMT 0018-2012
GMT 0018-2012概述
GMT 0018-2012标准规定了公钥密码基础设施应用技术体系下服务类密码设备的应用接口标准。适用于服务类密码设备的研制、使用,以及基于该类密码设备的应用开发,也可用于指导该类密码设备的检测。
规范性引用文件
下列文件对于本文件的应用是必不可少的。凡是注日期的引用文件,仅注日期的版本适用于本文件;凡是不注日期的引用文件,其最新版本(包括所有的修改单)适用于本文件;GM/T 0006密码应用标识规范;GM/T AAAA SM2密码算法使用规范。
其中还包括了对部分术语的规定:
算法标识algorithm identifier | 用于对密码算法进行唯一标识的符号。 |
---|---|
非对称密码算法/公钥密码算法asymmetric cryptographic algorithm/public key cryptograplrithmts | 加解密使用不同密钥的密码算法。 |
解密decipherment/decryption | 加密过程对应的逆过程。 |
设备密钥device key pair | 存储在设备内部的用于设备管理的非对称密钥对,包含签名密钥对和加密密钥对。 |
加密encipherment/encryption | 对数据进行密码变换以产生密文的过程。 |
密钥加密密钥key encryption key ;KEK | 对密钥进行加密保护的密钥。 |
公钥基础设施public key infrastructure;PKI | 用公钥密码技术建立的普遍适用的基础设施,为用户提供证书管理和密钥管理等安全服务。 |
私钥访问控制码private key access password | 用于验证私钥使用权限的口令字。 |
对称密码技术/对称密码体制symmetric cryptographic technique | 原发者和接收者均采用同一秘密密钥进行变换的密码技术(体制)。其中,加密密钥与解密密钥相同,或者一个密钥可以从另一个密钥导出的密码体制。 |
会话密钥session key | 处于层次化密钥结构中的最低层,仅在一次会话中使用的密钥。 |
用户密钥user key | 存储在设备内部的用于应用密码运算的非对称密钥,包含签名密钥对和加密密钥对。 |
GMT 0018-2012使用方式
在公钥密码基础设施应用技术体系框架中,密码设备服务层由密码机,密码卡,智能密码终端等设备组成,通过本标准规定的密码设备应用接口向通用密码服务层提供基础密码服务。基础密码服务包括密钥生成、单一的密码运算、文件管理等的服务。
GMT 0018-2012 函数
设备管理类函数
设备管理类函数包括以下具体函数:
A.打开设备:SDF_OpenDevice
B.关闭设备:SDF_CloseDevice
C.创建会话:SDF_OpenSession
D.关闭会话:SDF_CloseSession
E.获取设备信息:SDF_GetDeviceInfo
F.产生随机数:SDF_GenerateRandom
G.获取私钥使用权限:SDF_GetPrivateKeyAccessRight
H.释放私钥使用权限: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_GenerateKeyWiuhECC
- 产生协商数据并计算会话密钥∶SDF_GenerateAgreementDataAndKeyWithECC
- 基于 ECC算法的数字信封转换∶SDF_ExchangeDigitEnvelopeBaseOnECC
- 生成会话密钥并用密钥加密密钥加密输出∶SDF_GenerateKeyWithKEK
- 导入会话密钥并用密钥加密密钥解密∶SDF_ImportKeyWithKEK
- 销毁会话密钥∶SDF_DestroyKey