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

Siv*_*mar 3 c# rsa

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

            CspParameters cspParams = new CspParameters(24);
            cspParams.KeyContainerName = "XML_DISG_RSA_KEY";
            RSACryptoServiceProvider key = new RSACryptoServiceProvider(cspParams);
Run Code Online (Sandbox Code Playgroud)

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

他们得到了以下例外。

[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
Run Code Online (Sandbox Code Playgroud)

请你帮助我好吗。

Rob*_*ker 6

UseExistingKey我们与一位客户遇到了同样的错误消息,其中包含类似的代码(无论是否指定标志)。他们已将所有用户从旧域迁移到新域,并且似乎在那之后遇到了此错误。我们无法确定具体原因,但我们怀疑更改密钥容器文件的所有权(或者从计算机上仍存在的旧域中查找与旧用户身份匹配的密钥容器文件)可能违反了安全性在RSACryptoServiceProvider(或在加密 API 或底层非托管实现中)。

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

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

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