gpt4 book ai didi

winapi - CryptAcquireContext() 失败并返回代码 0x8009000B NTE_BAD_KEY_STATE - 但用户密码没有改变

转载 作者:行者123 更新时间:2023-12-04 13:48:40 28 4
gpt4 key购买 nike

我公司有一个用 vb6 编译的程序,需要先验证加密的许可证代码,然后才能使用该软件。最近,一位客户打电话说许可证代码无法验证并且程序被锁定。经过一番调查,我发现代码在调用 CryptAcquireContext 时失败,错误代码为 0x8009000B (NTE_BAD_KEY_STATE)。 CryptAcquireContext 的 Microsoft 支持页面指出此错误意味着“自私钥加密后用户密码已更改”

客户最近电脑出现问题,于是安装了新的固态硬盘,重新安装了Win7。但是,他确信他的用户密码没有更改,服务器密码也没有更改(用户计算机包含指向服务器上可执行文件的快捷方式,没有其他用户遇到此问题)。在搜索了一些 Microsoft 论坛后,很明显其他人也遇到了这个错误(也有相同的密码),并且在每种情况下它都是非常零星的,并且通常是使用相同程序的机器系统中的一台计算机所独有的。我审查的每一个案例都导致了死胡同;微软对这个错误非常无助,我已经用尽了我在谷歌上的研究能力。

这是失败的代码片段。我为我在这个特定领域缺乏知识而道歉,我们的程序用于加密/解密的类来自一个开源项目(cCrypt 类模块 - 凯文威尔逊)

If CryptAcquireContext(lngCryptProv, 0, p_CSP_String, p_CSP_Type, 0) = 0 Then

' If there is no default key container then create one using Flags field'

CheckGetLastError Err.LastDllError, Return_ErrNum, Return_ErrDesc, "CryptAcquireContext", False

If Return_ErrNum = -2146893802 Then
Return_ErrNum = 0
Return_ErrDesc = ""

If CryptAcquireContext(lngCryptProv, 0, p_CSP_String, p_CSP_Type, CRYPT_NEWKEYSET) = 0 Then

CheckGetLastError Err.LastDllError, Return_ErrNum, Return_ErrDesc, "CryptAcquireContext", False
Exit Function

End If
Else
Exit Function
End If
End If

这是对 CryptAcquireContext 的第一次调用失败。我尝试绕过第一个调用并直接转到带有 CRYPT_NEWKEYSET 标志的第二个调用,但该调用也失败了。

如果有人能对这个问题有所了解,我将不胜感激。提前致谢!

附注。这是微软论坛上的一个很好的例子,有人在没有更改密码的情况下遇到了同样的问题,微软代表最终停止回复(可以为您提供一些额外的信息):

https://groups.google.com/forum/#!topic/microsoft.public.platformsdk.security/XhzsN9HQWjk

最佳答案

我通过将 CryptAcquireContext (0) 中的最后一个参数更改为 CRYPT_VERIFYCONTEXT 标志来解决此问题。现在似乎工作正常!

关于winapi - CryptAcquireContext() 失败并返回代码 0x8009000B NTE_BAD_KEY_STATE - 但用户密码没有改变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29996467/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com