我正在将一个旧的 VB6 应用程序移植到 .NET,从昨天下午开始我遇到了一些 CryptoAPI 调用的问题。
特别是我无法检索已定义的密钥容器。我使用该CryptAcquireContext()
功能。我在创建容器的地方使用了一些测试代码。然后,如果我去,C:\Users...\Roaming\Microsoft\Crypto\RSA\Machine Keys\
我可以看到一个使用我定义的容器名称创建的文件,所以我假设它已成功创建。
尝试创建相同容器的后续调用验证了该假设,因为我收到了键集已定义的 win32 错误。
无论如何,在我的下一个代码调用中,我尝试检索我已经创建的容器,我得到了未定义键集的 Windows 错误。
错误:-2146893799 (80090019) 未定义键集。
有任何想法吗?
这是一个代码示例:
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();
}
}