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

时间:2017-01-31 08:12:59

标签: c# rsa

我是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

你能帮帮我吗。

1 个答案:

答案 0 :(得分:1)

我们遇到了与我们的客户有类似代码(有或没有指定case class Person(id: String) case class Kid(id: String, name: String) 标志)的相同错误消息。他们已经完成了将所有用户从旧域迁移到新域的过程,并且在此之后似乎遇到了此错误。我们无法确定具体原因,但我们怀疑更改密钥容器文件的所有权(或者从仍在计算机上的旧域中查找旧用户标识的匹配密钥容器文件)可能违反了安全性在type PersonId = String case class Person(id: PersonId) case class Kid(id: String, name: PersonId) 中(或在加密API或基础非托管实现中)。

我们最终通过在另一台计算机上使用测试代码手动识别密钥容器文件名(case class PersonId(id: String) extends AnyVal case class Person(id: PersonId) case class Kid(id: String, name: PersonId) ),然后删除导致错误的错误容器文件来解决此问题。您在select * from ( select t.*, ROW_NUMBER() over ( partition by term, class, academicyear order by Marks desc ) as Position, count(StudentID) over (partition by term, class, academicyear) as Student_count from Student t ) t where StudentID = 42013 and Term = 'One' and AcademicYear = 2015 and Class = 'Form IV' 中指定的UseExistingKey每次映射到相同的32位十六进制数字文件名前缀,其余的文件名(显然)特定于创建它的用户。容器文件存储在机器密钥存储区(如果指定了RSACryptoServiceProvider标志)或存储在用户密钥存储区中的漫游应用程序数据中(通常为C:\ Users \ userName \ AppData \ Roaming \ Microsoft \ Crypto \ ...)。

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

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