gpt4 book ai didi

c# - CryptoAPI AcquireContext 无法检索 key 容器

转载 作者:行者123 更新时间:2023-12-02 05:08:10 25 4
gpt4 key购买 nike

我正在将一个旧的 VB6 应用程序移植到 .NET,但从昨天下午开始我就遇到了一些 CryptoAPI 调用的问题。

特别是我无法检索已定义的 key 容器。我使用 CryptAcquireContext() 函数。我在创建容器的地方使用了一些测试代码。然后,如果我转到 C:\Users...\Roaming\Microsoft\Crypto\RSA\Machine Keys\,我可以看到一个用我定义的容器名称创建的文件,所以我假设它已成功创建。

尝试创建相同容器的后续调用验证了该假设,因为我收到 win32 错误,指出键集已定义。

无论如何,在我尝试检索已创建的容器的下一个代码调用中,我收到未定义键集的 Windows 错误。

Error : -2146893799 (80090019) The keyset is not defined.

有什么想法吗?

这是一个代码示例:

public const uint PROV_RSA_FULL = 1;
public const uint CRYPT_NEWKEYSET = 0x00000008;
public const uint CRYPT_MACHINE_KEYSET = 0x00000020;
const string MS_DEF_PROV = "Microsoft Base Cryptographic Provider v1.0";

[DllImport("advapi32.dll", SetLastError = true)]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool CryptAcquireContext(out IntPtr phProv, string pszContainer, string pszProvider, uint dwProvType, uint dwFlags);

public static void CreateContainer()
{
IntPtr hCryptProv;
int error;
if (!CryptAcquireContext(out hCryptProv, "new", MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
{
error = Marshal.GetLastWin32Error();
}

if (!CryptAcquireContext(out hCryptProv, "new", MS_DEF_PROV, PROV_RSA_FULL, CRYPT_MACHINE_KEYSET))
{
error = Marshal.GetLastWin32Error();
}
}

最佳答案

您正在为该用户创建 key 容器,但试图从基于机器的存储中获取它。要解决此问题,您需要将 CRYPT_MACHINE_KEYSET 更改为 0,或者在创建 key 集时使用 CRYPT_NEWKEYSET | CRYPT_MACHINE_KEYSET 根据您的需要。

By default, keys and key containers are stored as user keys. For Base Providers, this means that user key containers are stored in the user's profile. A key container created without this flag by an administrator can be accessed only by the user creating the key container and a user with administration privileges.

有关详细信息,请查看下面的链接。

CryptAcquireContext() use and troubleshooting

CryptAcquireContext function

关于c# - CryptoAPI AcquireContext 无法检索 key 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15945218/

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