Windows CryptoAPI是Microsoft 公司提出的安全加密应用服务框架,也是PKI推荐使用的加密 API。它提供了在Win32 环境下使用认证、编码、加密和签名等安全服务时的标准加密接口,用于增强应用程序的安全性与可控性。应用开发者可以在不了解复杂的加密机制和加密算法的情况下,简便、快速地开发出标准、通用和易于扩展的安全加密应用程序。CryptoAPI 提供的功能主要有:密钥管理、数据加密和解密、数字签名和验证、证书管理、可信根证书管理、数据编码和解码、数字证书编码和解码、PKCS#7 标准格式编码和解码等。
利用CryptoAPI,开发者可以给基于Windows的应用程序添加安全服务,包括: ASN.1编码及解码、数据加密/解密、身份论证、数字证书管理,同时支持PKI、对称密码技术等。应用程序开发者直接使用这些安全功能而无须了解其底层实现。
1. 加密密钥
密钥是密码体系操作的中心,它们必须安全保存,任何人获得某个密钥则对此密钥有关的任何数据都拥有了访问的权限。例如,某人得到了加密某文件的密钥,则他就可以解密此文件了。再比如,获取了对某消息签名的密钥,则可以伪造数字签名。
在CryptoAPI中,支持两种类型密钥:会话密钥、公/私密钥对。
会话密钥也称为对称密钥,用于对称加密算法,例如RC2、RC4、DES等。在CryptoAPI中,一般使用CryptGenKey 或 CryptDeriveKey函数产生会话密钥。为了保证密钥的安全性,这些密钥都保存在CSP内部。当然,用户也可以通过CryptExportKey函数把密钥以加密密钥块形式导出到具体应用空间内,以备以后使用或传输给其他用户。
公/私密钥对(包括公钥、私钥)用于非对称加密算法,例如RSA等。非对称加密算法主要用于加解密会话密钥和数字签名。在CryptoAPI中,一般来说,大多数 CSP产生的密钥容器包含两对密钥对,一对用于加密会话密钥,称为交换密钥对,一对用于产生数字签名,称为签名密钥对;但也有些CSP没有存储密钥对,或者存储不止两对密钥对。
在CryptoAPI中,所有的密钥都存储在CSP,CSP负责产生、销毁密钥,并使用它们完成各种密码操作。也可以利用CryptoAPI函数从CSP中导出密钥。
2. 数据编码/解码
通过通信媒介(例如电话线路)传输数据,必须先把数据序列化,即把数据转化为0、1串。在序列化操作中,接到数据的计算机必须能够把数据转化为其原始格式。序列化完成的操作规则称为通信协议,它由软件和数据传输硬件共同完成,其协议一般包含多层,图3-3为一个简化了的通信协议层。
下图表示:计算机1应用程序层先传输原文数据到编码/解码层,编码/解码层编码原文数据为计算机字节流,然后发送到硬件层,硬件层把字节流数据转化为0、1串流传输到计算机2。计算机2接到数据后,反向操作,转化0、1串流为计算机字节流,发送到编码/解码层,编码/解码层解码计算机字节流为原文数据。
一种可接受的软件设计原理是使用抽象化,即根据问题或对象的一般参数来描述,而不是要描述解决问题的所有细节或对象的所有细节。利用抽象化,设计者说明软件对象的特定性质而不必关心其具体实现,它简化了说明文档。抽象化是大多数现代软件规范的特点,并且多数通信协议都包含一些列的抽象化。
简化通信协议层
描述抽象对象的一个普遍方式为:ASN.1(抽象语法标记1),ASN.1在CCITT推荐文件X.208中定义,描述对象转换为0、1串的ASN.1规则称为DER(精确编码规则),在CCITT推荐文档X.509 8.7节定义。CryptoAPI采用的就是这种编码方式,表示数据发送方发送时先把数据抽象为ASN.1对象,然后使用DER编码规则把ASN.1对象转化为可传输的0、1串;接收方接到数据后,利用DER解码规则把0、1串转化为ASN.1对象,然后再把ASN.1对象转化为具体应用支持的数据对象。
3. 数据加/解密
把明文转化为密文的过程称为加密,反之把密文转化为明文的过程称为解密。加密较大的数据,CryptoAPI中约定用对称加密算法,这种算法中,在加密和解密过程中都使用同一个对称密钥或会话密钥。CryptoAPI中,通过其封装好的加解密函数来实现数据加解密操作,不同CSP提供不同的加解密算法,但常用的算法,一般CSP都提供。
4. 哈希与数字签名
哈希与数字签名一般用于确定数据的完整性和身份鉴别。CryptoAPI中,通过其封装好的哈希与数字签名函数来实现相关操作。微软提供的CSP产生的数字签名遵循RSA标准(PKCS#6),其他CSP可能遵循其他标准。
5. 数字证书
数字证书主要用于安全通信中的身份鉴别。CryptoAPI中,对数字证书的使用管理分为证书与证书库函数、证书验证函数。
6. 数字消息
任何被编码的数据都可称为消息,它是发送给其他人或实体(或从其他人或实体接收到)的编码数据,包括数字证书。在CryptoAPI环境中,消息一般会被签名或加密,或者同时被签名和加密。在CryptoAPI2.0版本中,消息处理函数一般分为两类:底层消息函数,简单消息函数。低级消息函数直接和PKCS#7 消息工作,简化消息函数是比较高级的函数,是对几个低级消息函数和证书函数的封装,用来执行指定任务。
BOOL CryptAcquireContext (
HCRYPTPROV* phProv,
LPCTSTR pszContainer,
LPCTSTR pszProvider,
DWORD dwProvType,
DWORD dwFlags
)
BOOL CryptCreateHash(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTKEY hKey,
DWORD dwFlags,
HCRYPTHASH *phHash
)
BOOL CryptHashData(
HCRYPTHASH hHash,
BYTE* pbData,
DWORD dwDataLen,
DWORD dwFlags
)
4. CryptGetHashParam
BOOL CryptGetHashParam(
HCRYPTHASH hHash,
DWORD dwParam,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwFlags
)
对称加密中常用的方式是根据用户输入的口令加解密文档,即基于口令派生出加解密密钥
1. CryptAcquireContext
2. CryptCreateHash
3. CryptHashData
4. BOOL CryptDeriveKey(
HCRYPTPROV hProv,
ALG_ID Algid,
HCRYPTHASH hBaseData,
DWORD dwFlags,
HCRYPTKEY* phKey
)
5. BOOL CryptSetKeyParam(
HCRYPTKEY hKey,
DWORD dwParam,
BYTE* pbData,
DWORD dwFlags
)
6. BOOL CryptEncrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen,
DWORD dwBufLen);
对称解密与加密相对应,调用顺序和参数设置基本一致。
CryptAcquireContext
CryptCreateHash
CryptHashData
CryptDeriveKey
CryptSetKeyParam
BOOL CryptDecrypt(
HCRYPTKEY hKey,
HCRYPTHASH hHash,
BOOL Final,
DWORD dwFlags,
BYTE *pbData,
DWORD *pdwDataLen
)
CryptoAPI参考原文链接:https://blog.csdn.net/weixin_45303938/article/details/107366169
对象 |
说明 |
CKO_DATA |
应用程序定义的对象。对象的数据结构可由应用程序任意定义,但是数据意义的解释由应用程序负责。 |
CKO_SECRET_KEY |
对称加密算法使用的密钥。 |
CKO_CERTIFICATE |
X.509 |
CKO_PUBLIC_KEY |
RSA |
CKO_PRIVATE_KEY |
RSA |
CKO_MECHANISM |
算法对象 |
PKCS#11的对象可根据其生命期长短的不同分成两大类:
PKCS#11的对象除了生命期长短有分别之外,在访问权限上也有限制。所有的对象都可根据访问权限的不同分成两大类:
接口类型 |
函数名称 |
描述 |
通用接口函数 |
C_Initialize |
初始化 Cryptoki |
C_Finalize |
整理各种适合 Cryptoki的资源 |
|
C_GetInfo |
获得关于Cryptoki的通用信息 |
|
C_GetFunctionList |
获得Cryptoki 库函数的进入点 |
|
槽和令牌管理函数 |
C_GetSlotList |
获得系统中槽的名单 |
C_GetSlotInfo |
获得关于特殊槽的信息 |
|
C_GetTokenInfo |
获得关于特殊令牌的信息 |
|
C_WaitForSlotEvent |
等待槽事件(令牌插入,转移等) 的发生 |
|
C_GetMechanismList |
获得由令牌支持的机制的名单 |
|
C_GetMechanismInfo |
获得关于特殊机制的信息 |
|
C_InitToken |
初始化一个令牌 |
|
C_InitPIN |
初始化普通用户的 PIN |
|
C_SetPIN |
改变现在用户的PIN |
|
会话管理函数 |
C_OpenSession |
打开一个应用程序和特殊令牌之间的连接或安装一个应用程序呼叫返回令牌插入 |
C_CloseSession |
关闭一个会话 |
|
C_CloseAllSessions |
用令牌关闭所有的会话 |
|
C_GetSessionInfo |
获得关于会话的信息 |
|
C_GetOperationState |
获得会话的加密操作状态 |
|
C_SetOperationState |
设置会话的加密操作状态 |
|
C_Login |
注册一个令牌 |
|
C_Logout |
从一个令牌注销 |
|
对象管理函数 |
C_CreateObject |
建立一个对象 |
C_CopyObject |
建立一个对象的拷贝 |
|
C_DestroyObject |
销毁一个对象 |
|
C_GetObjectSize |
获取字节中一个对象的大小 |
|
C_GetAttributeValue |
获取一个对象的属性值 |
|
C_SetAttributeValue |
改变一个对象的属性值 |
|
C_FindObjectsInit |
初始化一个对象的搜索操作 |
|
C_FindObjects |
继续一个对象搜索操作 |
|
C_FindObjectsFinal |
完成一个对象搜索操作 |
|
加密函数 |
C_EncryptInit |
初始化一个加密操作 |
C_Encrypt |
加密单部分数据 |
|
C_EncryptUpdate |
继续一个多部分加密操作 |
|
C_EncryptFinal |
完成一个多部分加密操作 |
|
解密函数 |
C_DecryptInit |
初始化一个解密操作 |
C_Decrypt |
解密单部分加密数据 |
|
C_DecryptUpdate |
继续一个多部分解密操作 |
|
C_DecryptFinal |
完成一个多部分解密操作 |
|
消息解密函数 |
C_DigestInit |
初始化一个消息摘要操作 |
C_Digest |
摘要单部分数据 |
|
C_DigestUpdate |
继续一个多部分摘要操作 |
|
C_DigestKey |
摘要一个密钥 |
|
C_DigestFinal |
完成一个多部分摘要操作 |
|
签名和消息鉴别函数 |
C_SignInit |
初始化一个签名操作 |
C_Sign |
签名单部分数据 |
|
C_SignUpdate |
继续一个多部分签名操作 |
|
C_SignFinal |
完成一个多部分签名操作 |
|
C_SignRecoverInit |
初始化一个签名操作,在操作中数据能从签名中恢复 |
|
C_SignRecover |
签名单部分数据,在操作中数据能从签名中恢复 |
|
签名鉴定消息鉴别函数 |
C_VerifyInit |
初始化一个鉴定操作 |
C_Verify |
在单部分数据上鉴定一个签名 |
|
C_VerifyUpdate |
继续一个多部分鉴定操作 |
|
C_VerifyFinal |
完成一个多部分鉴定操作 |
|
C_VerifyRecoverInit |
初始化一个鉴定操作,在操作中数据能从签名中恢复 |
|
C_VerifyRecover |
在单部分数据上鉴定一个签名,在操作中数据能从签名中恢复 |
|
双效加密函数 |
C_DigestEncryptUpdate |
继续类似的多部分摘要和加密操作 |
C_DecryptDigestUpdate |
继续类似的多部分解密和摘要操作 |
|
C_SignEncryptUpdate |
继续类似的多部分签名和加密操作 |
|
C_DecryptVerifyUpdate |
继续类似的多部分解密和鉴定操作 |
|
密钥管理函数 |
C_GenerateKey |
产生一个保密密钥 |
C_GenerateKeyPair |
产生一个公共/私钥对 |
|
C_WrapKey |
加密一个密钥 |
|
C_UnwrapKey |
解密一个密钥 |
|
C_DeriveKey |
从基础密钥派生一个密钥 |
|
随机数生成函数 |
C_SeedRandom |
把一个附加种子材料加入随机数字生成器 |
C_GenerateRandom |
生成随机数 |
|
并行功能管理函数 |
C_GetFunctionStatus |
已废弃函数,返回CKR_FUNCTION_NOT_PARALLEL |
C_CancelFunction |
已废弃函数,返回CKR_FUNCTION_NOT_PARALLEL |
参考链接:PKCS#11
本标准规定了基于PKI密码体制的智能密码钥匙密码应用接口,描述了密码应用接口函数、数据类型、参数的定义和设备安全要求。
适用于智能密码钥匙产品的研制、使用和检测。
API | 应用编程接口(Application Programing Interface) |
PKI | 公钥基础设施(Public Key Infrastructure) |
PKCS#1 | |
PKCS#5 | |
PIN | |
MAC |
原文:https://www.cnblogs.com/Mark19/p/14698319.html