加密异常:密钥无法用于指定状态。

3

我是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个回答

6
我们的客户在类似的代码中遇到了相同的错误消息(无论是否指定了UseExistingKey标志)。他们把所有用户从旧域移到新域,之后约莫发生了这个错误。我们无法确定具体原因,但我们怀疑更改密钥容器文件的所有权(或找到旧域上的较旧用户身份的匹配密钥容器文件)可能会侵犯RSACryptoServiceProvider(或加密API或基础非托管实现)的安全性。
最终,我们通过在另一台计算机上使用测试代码手动识别密钥容器文件名(CspKeyContainerInfo.UniqueKeyContainerName),然后删除导致错误的坏容器文件来解决了问题。您在CspParameters中指定的KeyContainerName每次都映射到相同的32位十六进制文件名前缀,其余部分(显然)是特定于创建它的用户。容器文件存储在机器密钥存储区(如果指定了UseMachineKeyStore标志)或用户的漫游应用程序数据中的密钥存储区(通常为%APPDATA%\Roaming\Microsoft\Crypto...)。
小心不要破坏其他密钥容器文件,否则可能会破坏计算机上的其他应用程序或服务。
当你创建一个新密钥时,你也可以尝试在构造函数调用中指定一个密钥大小。可以尝试1024或这些天也许是2048。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接