2015-10-09 125 views
2

我想用rsa在c#中加密和解密數據。我寫了這段代碼,它對加密工作正常,但我有解密問題。我的問題是什麼?!如何導入私鑰到c#RSAParameters對象?

這裏是我的代碼:

using System; 
using System.Security.Cryptography; 
using System.IO; 
using System.Text; 

namespace Cry 
{ 
    public class CryptoUtils 
    { 
     public CryptoUtils() 
     {  
      UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
      byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt"); 
      byte[] encryptedData; 
      byte[] decryptedData; 
      string decrptedStr = ""; 

      var pub = Convert.FromBase64String("MCgCIQCfkl4xV5T/v3r1bifOc1mVHa9yak5pGjUfAv0r+s6+AwIDAQAB"); 
      var prv = Convert.FromBase64String("MIGsAgEAAiEAn5JeMVeU/7969W4nznNZlR2vcmpOaRo1HwL9K/rOvgMCAwEAAQIg\nMce6pM/6xpIYrMoxluE7JBkVe9Sme9d6NPPJJX3NyBECEgCmwIarl1hSBnTqZNwJ\n8hZhqwIQAPT6CO/l/ma1sDi7eM7tCQISAKH90lYLlr9IinfSN3hp95g1AhAAlyNf\nuioqX1G+y/GVogyJAhEmQQB52juSQ574HnampzXUpQ=="); 

      using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) { 
       RSAParameters myRSAParameters = RSA.ExportParameters(false); 
       myRSAParameters.Modulus = pub; 
       myRSAParameters.Exponent = ByteConverter.GetBytes("65537"); 
       myRSAParameters.D = prv; 
       encryptedData = RSAEncrypt(dataToEncrypt, myRSAParameters, false); 
       decryptedData = RSADecrypt(encryptedData, myRSAParameters, false); 
       decrptedStr = ByteConverter.GetString(decryptedData); 
      } 
     } 

     static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) { 
      try { 
       byte[] encryptedData; 
       using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) { 
        RSA.ImportParameters(RSAKeyInfo); 
        encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding); 
       } 
       return encryptedData; 
      } catch (CryptographicException e) { 
       Console.WriteLine(e.Message); 

       return null; 
      } 

     } 

     static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) { 
      try { 
       byte[] decryptedData; 
       using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) { 
        RSA.ImportParameters(RSAKeyInfo); 
        decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding); 
       } 
       return decryptedData; 
      } catch (CryptographicException e) { 
       Console.WriteLine(e.ToString()); 

       return null; 
      } 

     } 
    } 
} 

在行encryptedData = RSAEncrypt(dataToEncrypt, myRSAParameters, false);數據加密,但在接下來的行我有這樣的錯誤:

​​

我想我did'nt填寫myRSAParameters正確,但是我的屬性不知道如何填補它!

+0

你從哪裏得到'pub'和'prv'的base64編碼值? –

+0

'pub'包含一個ASN.1編碼的公鑰(PKCS#1結構),'priv'包含私鑰(包括所有的256位RSA密鑰對,包括CRT參數)。他們不*代表模數和私人指數。 –

+0

來自pem文件! – Amin

回答

2

在.NET中,如果指定了RSAParameters.D,則還必須爲P,Q,DP,DQ和InverseQ指定(更正)值。

雖然模數,指數和D是技術上完成RSA所需的全部內容,但實際上很少有實現使用D,因爲執行RSA via the Chinese Remainder Theorem要高效得多。例如,當OpenSSL將退回到僅使用D的狀態; .NET不會。

相關問題