使用RSACryptoServiceProvider生成RSA密钥时的持久性错误

问题描述 投票:0回答:1

当多次调用RSACryptoServiceProvider创建私钥/公钥对时,我遇到了奇怪的错误问题:

class Program
{
    static void Main(string[] args)
    {
        try
        {
            CreateKey();
        }
        catch (Exception e)
        {
            Console.WriteLine("First failure:"+ e);
        }

        try
        {
            CreateKey();
        }
        catch (Exception e)
        {
            Console.WriteLine("Second failure:" + e);
        }
    }

    private static void CreateKey()
    {
        var cp = new CspParameters
        {
            KeyContainerName = "ContainerKey.1"
        };
        using (var rsa = new RSACryptoServiceProvider(cp) { PersistKeyInCsp = false })
        {
            Console.WriteLine(rsa.ToXmlString(true));
            Console.WriteLine(rsa.ToXmlString(false));
            rsa.Clear();
        }
    }
}

执行上述代码的输出是(省略了我的意思:

<RSAKeyValue>[Private key content omitted]</RSAKeyValue>
<RSAKeyValue>[Public key content omitted]</RSAKeyValue>
Second failure:System.Security.Cryptography.CryptographicException: Keyset as registered is invalid.

   at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
   at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
   at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
   at System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters)
   at RsaTest.Program.CreateKey() in C:\Users\RF185104\source\repos\RsaTest\RsaTest\Program.cs:line 39
   at RsaTest.Program.Main(String[] args) in C:\Users\RF185104\source\repos\RsaTest\RsaTest\Program.cs:line 25

运行上面的代码,对CreateKey的第一次调用正常工作,但是第二个调用失败。现在,当再次重新运行代码时,即使是第一次也失败了,这意味着某些地方仍然存在。但这不应该发生,因为将PersistKeyInCsp设置为false应该可以防止键的持久性。更改KeyContainerName会使呼叫再次起作用,但只能起作用一次。然后,下一次呼叫也会失败。

我相信我对RSACryptoServiceProvider的工作方式有很大的误解,因为我不知道上面的错误怎么会发生。

此代码的主要目的是创建RSA密钥对而不将其持久化到本地存储,因此,在同一用户上运行的其他应用程序无法访问它。

运行Windows 10,.NET Framework 4.7.2,同时在调试和发行中发生。

.net rsa public-key-encryption
1个回答
0
投票

[username运行process name,试图访问... \ APPDATA \ ROAMING \ MICROSOFT \ CRYPTO \ RSA \Windows SID\randomish folder name,违反了“恶意软件行为:Windows EFS滥用”规则,并且受阻。有关如何响应此事件的信息,请参见KB85494。

© www.soinside.com 2019 - 2024. All rights reserved.