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
相关产品推荐
相关产品推荐

