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

2024-01-05

我是 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 或底层非托管实现中)。

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CryptographicException:密钥在指定状态下使用无效 的相关文章

随机推荐