You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows BCrypt是否支持用公钥解密私钥加密的RSA数据?

BCrypt公钥解密私钥加密数据的问题解答

BCrypt确实不允许用公钥调用BCryptDecrypt来解密私钥加密的数据,这是API的设计限制,同时也符合RSA加密体系的逻辑。

原因说明

在RSA体系中:

  • 公钥加密、私钥解密:用于加密传输,保证数据只能被私钥持有者读取
  • 私钥加密(实际是签名操作)、公钥验证:用于身份认证/数据完整性校验,证明数据来自私钥持有者

BCrypt对这两类操作做了严格区分:BCryptDecrypt仅支持私钥解密公钥加密的数据;而私钥加密的数据(签名),需要用公钥通过BCryptVerifySignature来验证,而非BCryptDecrypt。你用公钥调用BCryptDecrypt属于参数使用错误,因此返回STATUS_INVALID_PARAMETER。

修正后的代码示例

把原来的BCryptDecrypt调用替换为BCryptVerifySignature即可,示例如下:

BCRYPT_ALG_HANDLE bcrypt_alg = nullptr;
BCRYPT_KEY_HANDLE bcrypt_pub_key = nullptr;
NTSTATUS status = 0;

status = BCryptOpenAlgorithmProvider(
    &bcrypt_alg,
    BCRYPT_RSA_ALGORITHM,
    nullptr,
    0);

status = BCryptImportKeyPair(
    bcrypt_alg,
    nullptr,
    BCRYPT_PUBLIC_KEY_BLOB,
    &bcrypt_pub_key,
    reinterpret_cast<unsigned char *>(&rsa_pub_key),
    sizeof(rsa_pub_key),
    0);

// 填充信息需和私钥加密(签名)时保持一致
BCRYPT_PKCS1_PADDING_INFO padding_info = { 0 };
// 假设你持有原始未加密的内容original_data及其长度original_size
status = BCryptVerifySignature(
    bcrypt_pub_key,
    &padding_info,
    (PUCHAR)encrypted, // 私钥加密后的签名数据
    (ULONG)encrypted_size,
    (PUCHAR)original_data,
    (ULONG)original_size,
    BCRYPT_PAD_PKCS1);

if (!BCRYPT_SUCCESS(status)) {
    printf("验签失败,错误码0x%x\n", status);
    return false;
}
// 验签成功则证明数据由对应私钥加密,且未被篡改

如果你的需求是直接从私钥加密的数据中还原原始内容(而非验签),这属于RSA的“逆向使用”场景,BCrypt不支持通过BCryptDecrypt实现,你需要手动实现RSA模幂运算,或者换用其他支持该操作的加密库。

内容的提问来源于stack exchange,提问作者Noah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 06:03:13