2017-06-26 44 views
0

我試圖從密鑰容器訪問私鑰,然後使用它來解密先前加密的字節[]消息。我的代碼似乎能夠說的byte []加密的,但是當我嘗試解密它,我得到以下信息:當我嘗試從密鑰容器訪問私鑰時拋出異常

型「System.ObjectDisposedException」未處理的異常出現在mscorlib.dll

我在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*...\n{0}", ByteConverter.GetString(originalData)); 

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

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

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

DELETEKEY(串)是未完成的,因而註釋掉。代碼MakeAndSaveKey(字符串)是:

private static void MakeAndSaveKey(string containerName) 
{ 
    CspParameters cp = new CspParameters(); 
    cp.KeyContainerName = containerName; 
    CspParameters cp = new CspParameters(); 
    cp.KeyContainerName = containerName; 
    return; 
} 

GetKeyFromContainer(字符串)是:

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

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

應當指出的是,MakeAndSaveKey和GetKeyFromContainer字面上的微軟的代碼從他們How to: Store Asymmetric Keys in a Key Container只是一個C#轉換。

用於加密的代碼(字節[],的RSACryptoServiceProvider)是:

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

     return message; 
    } 

而對於解密(字節[],的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; 
    } 

該程序輸出它檔之前以下:

閱讀測試信息... ahem ...

這是測試消息!

讀取加密的消息...

....

??????????????????????????ü ????????????????? = ?????????小號??????? H +

,除了'='有三條線而不是兩條。我只是不知道在哪裏可以找到那個符號。

之後,我得到了這篇文章頂部描述的異常。具體而言,它指向

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

來自decrypt(byte [],RSACryptoServiceProvider)的定義。有人知道這是爲什麼發生,或者如何解決它?

+2

看來你正在對通過參數給出的對象執行「使用(rsa)」,這可能是原因。只有最初構造這個對象的方法/對象應該處理它。 –

回答

2
using (resource) 
{ 
    // do something 
} 

是語法糖:

try 
{ 
    // do something 
} 
finally 
{ 
    if (resource!= null) 
     resource.Dispose(); 
} 

因此,這意味着decrypt嘗試使用已經設置的對象。 如果您將resource(s)放在您自己的容器中,則表示您正在自行管理它,並且不應使用using。刪除使用using並確保完成後手動處理所有資源。它應該工作。

+0

謝謝,「使用(rsa)」肯定是問題所在。它現在有效! – MrSpudtastic

相關問題