BCryptOpenAlgorithmProvider
基本概念
BCryptOpenAlgorithmProvider是Windows系统中BCrypt (Cryptography Next Generation, CNG)接口的核心函数,作用是:
打开指定加密算法的 “算法提供程序” 句柄(类似于获取算法的操作入口);
后续可通过该句柄调用加密、解密、哈希、签名等具体加密操作;
支持指定算法实现的提供商(如微软默认的MS_PRIMITIVE_PROVIDER),也可留空使用系统默认提供商。
基本语法
1 | NTSTATUS BCryptOpenAlgorithmProvider( |
返回值
成功:STATUS_SUCCESS(值为 0);
失败:返回NTSTATUS错误码(如STATUS_INVALID_PARAMETER表示参数错误)。
数据类型BCRYPT_ALG_HANDLE:
1 | typedef void *PVOID; |
将 “无类型指针” 命名为BCRYPT_ALG_HANDLE(BCrypt 算法句柄),作为CNG API中 “算法提供程序句柄” 的类型标识。
BCryptGetProperty
基本概念
BCryptGetProperty是BCrypt (CNG) 接口的核心辅助函数,作用是:
读取通过BCryptOpenAlgorithmProvider打开的算法句柄、密钥句柄或哈希句柄的属性;
比如获取算法支持的最大密钥长度、哈希输出长度、算法名称等关键信息;
支持 “先查询属性长度→再读取属性值” 的两步式读取,也可直接尝试读取(新手推荐两步式,避免缓冲区大小不足)。
基本语法
1 | NTSTATUS BCryptGetProperty( |
返回值
成功:STATUS_SUCCESS(值为 0);
失败:常见错误码如STATUS_BUFFER_TOO_SMALL(缓冲区不足)、STATUS_INVALID_PARAMETER(参数错误)。
BCryptCreateHash
基本概念
BCryptCreateHash是BCrypt (CNG) 接口中哈希计算的关键函数,主要作用:
基于BCryptOpenAlgorithmProvider打开的哈希算法句柄(如 SHA256),创建一个哈希对象句柄;
该哈希对象是后续写入数据(BCryptHashData)、获取最终哈希值(BCryptFinishHash)的核心载体;
支持传入密钥(如HMAC场景),普通哈希(如SHA256)可传NULL跳过密钥。
基本语法
1 | NTSTATUS BCryptCreateHash( |
返回值
成功:STATUS_SUCCESS(值为 0);
失败:常见错误码如STATUS_INVALID_HANDLE(无效算法句柄)、STATUS_INVALID_PARAMETER(参数错误)。
BCryptHashData
基本概念
BCryptHashData是Windows CNG接口中向已创建的哈希对象写入数据的函数,核心作用:
接收一段数据(如文件读取的缓冲区、字符串等),将其 “喂给” 通过BCryptCreateHash创建的哈希对象;
支持分段写入(多次调用),适合大文件 / 数据流的哈希计算(比如你之前代码中循环读取文件并调用该函数);
数据写入后,哈希对象会在内部累加计算哈希值,直到调用BCryptFinishHash完成最终计算。
基本语法
1 | NTSTATUS BCryptHashData( |
返回值
成功:STATUS_SUCCESS(值为 0);
失败:常见错误码:STATUS_INVALID_HANDLE:hHash 是无效句柄(未创建 / 已释放);STATUS_INVALID_PARAMETER:参数为空(如pbInput=NULL 但 cbInput>0);STATUS_BUFFER_TOO_SMALL:极少出现,通常是参数错误导致。
BCryptFinishHash
基本概念
BCryptFinishHash是Windows CNG接口中哈希计算的最终步骤函数,核心作用:
对已通过BCryptHashData写入所有数据的哈希对象,执行最后的哈希计算(如补位、最终摘要生成);
将计算完成的最终哈希值写入指定的缓冲区;
调用后,该哈希对象进入 “完成状态”,无法再通过BCryptHashData写入新数据(如需重新计算,需销毁并重建哈希对象)。
基本语法
1 | NTSTATUS BCryptFinishHash( |
返回值
成功:STATUS_SUCCESS(值为 0);
失败:常见错误码:STATUS_INVALID_HANDLE:hHash无效(未创建 / 已释放 / 已完成);STATUS_INVALID_PARAMETER:缓冲区为空(pbOutput=NULL)或长度不匹配;STATUS_BUFFER_TOO_SMALL:cbOutput小于算法的哈希输出长度(如 SHA256 传 30 字节);STATUS_HASH_STATE_INVALID:哈希对象已调用过BCryptFinishHash,无法重复调用。
简单示例
计算字符串的SHA256哈希值
1 |
|
通过BCryptOpenAlgorithmProvider创建的BCRYPT_ALG_HANDLE,必须通过BCryptCloseAlgorithmProvider释放;
通过BCryptCreateHash创建的BCRYPT_HASH_HANDLE,必须通过BCryptDestroyHash释放;
对比
1 | 功能 CryptoAPI(MD5/SHA1) CNG API(SHA256) |
