2015-12-21 86 views
1

我有兩個XML文件,其中包含由RSACryptoServiceProvider類生成的私鑰和公鑰。我將一個隨機字符串轉換爲一個字節數組,並使用私鑰對其進行加密。但是,如何使用公鑰再次解密字節[]?這是我到目前爲止有:解密使用私鑰簽名的字節[]

class Program 
    { 
     static void Main(string[] args) 
     { 
      RSACryptoServiceProvider encryptor = new RSACryptoServiceProvider(); 
      encryptor.FromXmlString(GetPrivateKey()); 


      string unencryptedString = "This string could only have been send by me."; 

      byte[] unencryptedByteArray = Encoding.Unicode.GetBytes(unencryptedString); 

      byte[] encryptedByteArray = encryptor.SignData(unencryptedByteArray, new SHA1CryptoServiceProvider()); 

      byte[] decryptedByteArray; //how do I decrypt the array again? 

      string decryptedString = System.Text.Encoding.Unicode.GetString(decryptedByteArray); 

      Console.WriteLine(decryptedString); 

      Console.ReadKey(); 
     } 

     private static string GetPrivateKey() 
     { 
      using (TextReader reader = new StreamReader(@"path to private key file generated by the ToXmlString method")) 
      { 
       string privateKey = reader.ReadToEnd(); 
       reader.Close(); 
       return privateKey; 
      } 
     } 

     private static string GetPublicKey() 
     { 
      using (TextReader reader = new StreamReader(@"path to public key file generated by the ToXmlString method")) 
      { 
       string privateKey = reader.ReadToEnd(); 
       reader.Close(); 
       return privateKey; 
      } 
     } 
    } 
+0

包括從文檔中的一個示例應用程序如果你有公鑰和私鑰的對稱密碼(如RSA),該crypting是相同的過程,解密。如果您使用公鑰加密數據,使用私鑰加密,您將獲得原始數據(反之亦然)。 – libik

+0

簽名!=加密。與簽名相反的過程是*驗證*,並且爲了執行該步驟,您仍然需要訪問原始數據。 –

回答

3

您不能解密回unencryptedString值。根據文檔,方法RSACryptoServiceProvider.SignData計算指定數據的哈希值並對其簽名。由於哈希在設計上是不可逆的,所以不能解密回原始值。

但是,您可以使用RSACryptoServiceProvider來加密和解密數據。下面我就MSDN

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

class RSACSPSample 
{ 

    static void Main() 
    { 
     try 
     { 
      //Create a UnicodeEncoder to convert between byte array and string. 
      UnicodeEncoding ByteConverter = new UnicodeEncoding(); 

      //Create byte arrays to hold original, encrypted, and decrypted data. 
      byte[] dataToEncrypt = ByteConverter.GetBytes("Data to Encrypt"); 
      byte[] encryptedData; 
      byte[] decryptedData; 

      //Create a new instance of RSACryptoServiceProvider to generate 
      //public and private key data. 
      using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) 
      { 

       //Pass the data to ENCRYPT, the public key information 
       //(using RSACryptoServiceProvider.ExportParameters(false), 
       //and a boolean flag specifying no OAEP padding. 
       encryptedData = RSAEncrypt(dataToEncrypt, RSA.ExportParameters(false), false); 

       //Pass the data to DECRYPT, the private key information 
       //(using RSACryptoServiceProvider.ExportParameters(true), 
       //and a boolean flag specifying no OAEP padding. 
       decryptedData = RSADecrypt(encryptedData, RSA.ExportParameters(true), false); 

       //Display the decrypted plaintext to the console. 
       Console.WriteLine("Decrypted plaintext: {0}", ByteConverter.GetString(decryptedData)); 
      } 
     } 
     catch (ArgumentNullException) 
     { 
      //Catch this exception in case the encryption did 
      //not succeed. 
      Console.WriteLine("Encryption failed."); 

     } 
    } 

    static public byte[] RSAEncrypt(byte[] DataToEncrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) 
    { 
     try 
     { 
      byte[] encryptedData; 
      //Create a new instance of RSACryptoServiceProvider. 
      using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) 
      { 

       //Import the RSA Key information. This only needs 
       //toinclude the public key information. 
       RSA.ImportParameters(RSAKeyInfo); 

       //Encrypt the passed byte array and specify OAEP padding. 
       //OAEP padding is only available on Microsoft Windows XP or 
       //later. 
       encryptedData = RSA.Encrypt(DataToEncrypt, DoOAEPPadding); 
      } 
      return encryptedData; 
     } 
     //Catch and display a CryptographicException 
     //to the console. 
     catch (CryptographicException e) 
     { 
      Console.WriteLine(e.Message); 

      return null; 
     } 

    } 

    static public byte[] RSADecrypt(byte[] DataToDecrypt, RSAParameters RSAKeyInfo, bool DoOAEPPadding) 
    { 
     try 
     { 
      byte[] decryptedData; 
      //Create a new instance of RSACryptoServiceProvider. 
      using (RSACryptoServiceProvider RSA = new RSACryptoServiceProvider()) 
      { 
       //Import the RSA Key information. This needs 
       //to include the private key information. 
       RSA.ImportParameters(RSAKeyInfo); 

       //Decrypt the passed byte array and specify OAEP padding. 
       //OAEP padding is only available on Microsoft Windows XP or 
       //later. 
       decryptedData = RSA.Decrypt(DataToDecrypt, DoOAEPPadding); 
      } 
      return decryptedData; 
     } 
     //Catch and display a CryptographicException 
     //to the console. 
     catch (CryptographicException e) 
     { 
      Console.WriteLine(e.ToString()); 

      return null; 
     } 

    } 
}