在 Powershell 中打开加密密钥,而不是在 C# 中

Opening Encryption Key Works in Powershell Not in C#

我正在打开存储在 HSM 中的加密密钥。我的机器上安装了 HSM 的客户端库。如果我 运行 以下 Windows Powershell 片段:

##Open an existing Key
$keyName = 'foo'
$providername = 'SafeNetProtectApp Key Storage Provider'
$provider = New-Object 'System.Security.Cryptography.CngProvider' -ArgumentList $providername
$key = [System.Security.Cryptography.CngKey]::Open($keyName, $provider)

有效。

如果我尝试编译以下 C# 片段:

using System.Security.Cryptography;

namespace SaveSecret
{
    class Program
    {
        static void Main(string[] args)
        {
            System.Console.WriteLine(">>> Starting application <<<");

            string keyName = "foo";
            string providerName = "SafeNetProtectApp Key Storage Provider";
            CngProvider provider = new CngProvider(providerName);
            CngKey key = null;
            key = CngKey.Open(keyName, provider);

            System.Console.Write("[Hit Enter to Continue]");
            System.Console.ReadLine();
        }
    }
}

我得到以下异常:

System.Security.Cryptography.CryptographicException
  HResult=0x8009001E
  Message=Provider DLL could not be found.

  Source=System.Core
  StackTrace:
   at System.Security.Cryptography.NCryptNative.OpenStorageProvider(String providerName)
   at System.Security.Cryptography.CngKey.Open(String keyName, CngProvider provider, CngKeyOpenOptions openOptions)
   at System.Security.Cryptography.CngKey.Open(String keyName, CngProvider provider)

我很困惑为什么我可以在 Powershell 中使用相同的库毫无问题地打开密钥。在同一台机器上,如果我尝试在 C# 中执行该操作,则会出现异常。谁能解释为什么会这样?

其他事实...

我编写的项目针对的是错误的处理器架构。提供程序库是 64 位的,但我的项目是针对 32 位的。我将我的项目更改为以 64 位可执行文件为目标,它成功了。

感谢大家的帮助!