当我尝试从密钥容器访问私钥时引发异常

Posted

技术标签:

【中文标题】当我尝试从密钥容器访问私钥时引发异常【英文标题】:Getting an exception thrown when I try to access private key from key container 【发布时间】:2017-06-26 16:20:50 【问题描述】:

我正在尝试从密钥容器访问私钥,然后使用它来解密先前加密的 byte[] 消息。我的代码似乎能够加密该字节 [],但是当我尝试解密它时,我收到以下消息:

在 mscorlib.dll 中发生了“System.ObjectDisposedException”类型的未处理异常

我在 Visual Studios 中使用 C#。 我的主要功能如下所示:

try
        
            string testValue = "TestKeyContainer";
            string message = "This is the test message!";

            UnicodeEncoding ByteConverter = new UnicodeEncoding();

            byte[] originalData = ByteConverter.GetBytes(message);
            byte[] encryptedData;
            byte[] decryptedData;

            RSACryptoServiceProvider rsa = null;

            //Create a public-private key pair and store them in a key container.
            MakeAndSaveKey(testValue);

            //[Attempt to] retrieve the key from the container
            rsa = GetKeyFromContainer(testValue);

            //Read message
            Console.WriteLine("Reading the test message... *ahem*...\n0", ByteConverter.GetString(originalData));

            //Encrypt, then read message
            encryptedData = encrypt(originalData, rsa);
            Console.WriteLine("Reading the encrypted message...\n....\n0", ByteConverter.GetString(encryptedData));

            //Decrypt, then read message
            decryptedData = decrypt(encryptedData, rsa);
            Console.WriteLine("Reading the decrypted message...\n0", ByteConverter.GetString(decryptedData));

            //Delete key from the container
            //DeleteKey("TestKeyContainer");
        
        catch (CryptographicException e)
        
            Console.WriteLine(e.Message);
        

DeleteKey(string) 未完成,因此被注释掉。 MakeAndSaveKey(string) 的代码是:

private static void MakeAndSaveKey(string containerName)

    CspParameters cp = new CspParameters();
    cp.KeyContainerName = containerName;
    CspParameters cp = new CspParameters();
    cp.KeyContainerName = containerName;
    return; 

GetKeyFromContainer(string) 是:

private static RSACryptoServiceProvider GetKeyFromContainer(string containerName)
    
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = containerName;

        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);
        return rsa;
    

需要注意的是,MakeAndSaveKey 和 GetKeyFromContainer 实际上只是微软代码的 C# 翻译,来自他们的 How to: Store Asymmetric Keys in a Key Container。

encrypt(byte[], RSACryptoServiceProvider) 的代码是:

private static byte[] encrypt(byte[] message, RSACryptoServiceProvider rsa)
    
        using (rsa)
        
            message = RSAEncrypt(message, rsa.ExportParameters(false), false);
        

        return message;
    

对于解密(byte[], RSACryptoServiceProvider):

private static byte[] decrypt(byte[] message, RSACryptoServiceProvider rsa)
    
        using (rsa)
        
            try
            
                message = RSADecrypt(message, rsa.ExportParameters(true), false);
            
            catch (CryptographicException e)
            
                Console.WriteLine("Couldn't decrypt the message. \n:ERROR: 0", e.Message);
            
        

        return message;
    

程序在停止前输出以下内容:

正在阅读测试消息... 咳咳...

这是测试信息!

正在读取加密消息...

....

????????????????????????????u??????????????????=?? ???????s???????h?

,除了 '=' 有三行而不是两行。我只是不知道在哪里可以找到那个符号。

在那之后,我得到了这篇文章顶部描述的异常。具体来说,它指向语句

message = RSADecrypt(message, rsa.ExportParameters(true), false);

来自解密(byte[], RSACryptoServiceProvider) 定义。有谁知道为什么会这样,或者如何解决?

【问题讨论】:

您似乎正在对通过参数给出的对象执行using (rsa),这可能就是原因。只有最初构造这个对象的方法/对象应该处理它。 【参考方案1】:
using (resource)

    // do something

是语法糖:

try

    // do something

finally

    if (resource!= null)
        resource.Dispose();

所以这意味着decrypt 试图使用已经释放的对象。 如果您将resource(s) 保存在自己的容器中,则表示您正在自己管理它,您不应该使用using。删除using 的使用,并确保在完成后手动处理所有资源。它应该可以工作。

【讨论】:

谢谢,“使用(rsa)”肯定是问题所在。现在可以使用了!

以上是关于当我尝试从密钥容器访问私钥时引发异常的主要内容,如果未能解决你的问题,请参考以下文章

检索私钥时链为空

Windows SSH 要求输入密码

如何禁止“应用程序请求访问受保护的项目”弹出窗口

无法使用Putty访问SSH到Arvixe共享主机[关闭]

如何摆脱 Visual Studio 2019 中的密码提示?

JSch为Java生成的密钥对提供无效的私钥错误