C++中BCryptDecrypt二次调用返回0xc000000d错误求助
C++中第二次调用BCryptDecrypt()返回错误0xc000000d,AES-GCM解密失败
问题描述
在C代码中使用BCrypt进行AES-GCM解密时,第二次调用BCryptDecrypt()会返回错误码0xc000000d(STATUS_INVALID_PARAMETER)。已知代码存在潜在问题,但测试中未触发其他失败点。对比可正常运行的C#版本,调试显示两者缓冲区数据及各步骤返回值均一致,仅C的二次BCryptDecrypt调用失败。
需求明确:仅使用BCrypt库完成解密,通过密文块中的密钥解密AES-GCM加密内容,已有可正常运行的C#实现,不引入OpenSSL等额外库。
测试可用信息
- 密钥处理流程:Base64解码给定密钥字符串,跳过开头5字节的"DPAPI"标识后,调用
CryptUnprotectData()获取实际解密密钥 - Base64编码的AES-GCM密文:
RFBBUEkBAAAA0Iyd3wEV0RGMegDAT8KX6wEAAADeBU2aOO6lQ73DYvrL8hhAAAAAAAIAAAAAABBmAAAAAQAAIAAAALXsSijRcSAV3S8PSvKZXUddV2eE+nv5xtn8JaePfpjrAAAAAA6AAAAAAgAAIAAAAJ96r2xQdEkkXuEaGEcVG24QJSKXG9s14w/yS8gdO/CxMAAAABs64+DTxkrQnkH1e3d0w/tOPIRrB1OBPrw4uxX4Q0AfYv6pyMZKXchhn1qol8bMvUAAAADisCS/m6UBBzMxVLBgpCvQsGIa6hYT/J8NGZuFOqydlstlxLBL2K8tCX550IoHtwuEA8EGJTxMsW6wh/0H3VRn
(注:此为CTF项目密钥,允许解密)
已尝试的解决方法
- 将
std::vector替换为HeapAlloc分配内存 - 调整
BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO结构的参数设置 - 修改
BCryptSetProperty的参数配置 - 参考GitHub上成熟的C++ AES-GCM BCrypt实现
- 使用GPT生成多种代码版本测试
以上方法均未解决问题,请求协助排查错误原因。
内容的提问来源于stack exchange,提问作者Tony Tone
相关产品推荐
相关产品推荐

