CryptographicException:密钥在指定状态下使用无效

CryptographicException: Key not valid for use in specified state

我是 C# 新手。我不明白为什么它会造成问题。

            CspParameters cspParams = new CspParameters(24);
            cspParams.KeyContainerName = "XML_DISG_RSA_KEY";
            RSACryptoServiceProvider key = new RSACryptoServiceProvider(cspParams);

以下代码在我的本地设置中运行良好。但它在客户端不起作用。

他们低于例外。

[CryptographicException:密钥在指定状态下使用无效。 ]

   System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer) +4644432
   System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle) +69
   System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair() +92
   System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize) +173
   System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters) +14

你能帮帮我吗

我们 运行 与我们的一位客户使用类似代码(有或没有指定 UseExistingKey 标志)进入相同的错误消息。他们经历了将所有用户从旧域转移到新域的过程,并且似乎 运行 大约在那之后就陷入了这个错误。我们无法确定具体原因,但我们怀疑更改密钥容器文件的所有权(或者它从仍在计算机上的旧域中为旧用户身份找到匹配的密钥容器文件)可能违反了安全性在 RSACryptoServiceProvider(或在加密 API 或底层 non-managed 实现中)。

我们最终通过在另一台计算机上使用测试代码手动识别密钥容器文件名 (CspKeyContainerInfo.UniqueKeyContainerName),然后删除导致错误的错误容器文件来解决此问题。您在 CspParameters 中指定的 KeyContainerName 每次都映射到相同的 32-hexadecimal-digit 文件名前缀,文件名的其余部分(显然)特定于创建它的用户。容器文件存储在机器密钥存储区(如果指定了 UseMachineKeyStore 标志)或漫游应用程序数据中的用户密钥存储区(通常为 C:\Users\userName\AppData\Roaming\Microsoft\Crypto\ ...)。

注意不要破坏其他密钥容器文件,否则您可能会破坏计算机上的其他应用程序或服务。

您可能还会看到在构造函数调用中指定密钥大小是否有助于您创建新密钥。试试 1024,或者现在可能是 2048。