2010-06-02 37 views
1

我試圖使用RSACryptoServiceProvider加密/解密。加密工作正常,但Decrypt方法拋出一個異常與消息:CryptographicException:未知錯誤'80007005'。當在.Net精簡版框架中調用RSACryptoServiceProvider.Decrypt()

未知錯誤'80007005'。

這是代碼:

Byte[] plainData = encoding.GetBytes(plainText); 
Byte[] encryptedData; 
RSAParameters rsap1; 
Byte[] decryptedData; 
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider()) 
{ 
    encryptedData = rsa1.Encrypt(plainData, false); 
    rsap1 = rsa1.ExportParameters(false); 
} 

using (RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider()) 
{ 
    rsa2.ImportParameters(rsap1); 
    decryptedData = rsa2.Decrypt(encryptedData, false); 
} 

decryptedText = encoding.GetString(decryptedData, 0, decryptedData.Length); 

是任何人都知道的一種解決方法?

謝謝!

回答

-1
rsap1 = rsa1.ExportParameters(false); 

通過將false傳遞給此方法,您選擇不導出私鑰。沒有私鑰就難以解密數據。嘗試將true傳遞給導出方法。

+1

導出密鑰與數據呈現RSA無用。此外,加密者甚至可能不擁有私鑰。 – 2010-06-02 01:08:43

+0

嘗試閱讀他的代碼。 – 2010-06-02 01:12:38

-1

使用RSA時,您需要了解密鑰管理的基本知識。您沒有指定在加密過程中使用什麼密鑰容器。你期望用什麼鍵?默認的用戶密鑰?機器的鑰匙?你知道默認的用戶密鑰和機器密鑰是什麼?更何況明顯的問題爲什麼你加密什麼與RSA?使用RSA加密完全用於加密會話密鑰,並且有專門的密鑰交換協議來處理這種開箱即用的(面向TLS的流或面向像S/MIME的文檔)。您應該使用其中一種開箱即用的協議,而不是推出自己的加密方案。你擰緊密鑰管理,這是有保證的。

當您嘗試解密時,解密者是否擁有與加密過程中使用的公鑰相對應的私鑰?

參見:

注意,這些都是在MSDN只是簡單的代碼示例和不應該被任何人沒有非常深刻的理解使用密碼學,特別是密鑰管理。

我建議您考慮使用高級別類如SslStream來加密數據交換。對於文檔存儲加密方案,您最好使用操作系統工具或依靠ProtectedData類。再說一次,除非你真的知道你在做什麼(在這種情況下,你不會在這裏問問題),否則不要推出自己的加密。

0

修正了代碼!我想我不需要指定容器......

Byte[] plainData = encoding.GetBytes(plainText); 
Byte[] encryptedData; 
Byte[] decryptedData; 
using (RSACryptoServiceProvider rsa1 = new RSACryptoServiceProvider()) 
{ 
    RSAParameters rsap1 = rsa1.ExportParameters(false); 

    using (RSACryptoServiceProvider rsa2 = new RSACryptoServiceProvider()) 
    { 
     rsa2.ImportParameters(rsap1); 
     encryptedData = rsa2.Encrypt(plainData, false); 
    } 

    decryptedData = rsa1.Decrypt(encryptedData, false); 
} 

decryptedText = encoding.GetString(decryptedData, 0, decryptedData.Length); 
相關問題