5

EDIT2: 似乎Convert.FromBase64String是我的救星。有誰知道逗號是否每個都在這樣一個字符串中?我正在做基本的csv解析。如果是這樣,我總是可以使用引號(但我也可以引用這樣的字符串)但這只是我自己的一個小項目,所以用','分割就更容易解析。C#RSACryptoServiceProvider ToXmlString()/ FromXmlString()

編輯: 好吧,看來我的問題是,當我將加密的字節轉換爲字符串,然後將該字符串轉換回字節解密。我怎麼能這樣做,因爲我想實際存儲加密字符串的地方,並能夠解密該字符串。

我試圖將公鑰(僅用於測試的私鑰)保存到xml文件,以便我可以在以後讀取相同的文件,但在嘗試解密時會出現「錯誤數據」錯誤。任何人都可以看到我做錯了什麼?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Security.Cryptography; 
using System.IO; 

namespace EncryptionTest 
{ 
class Program 
{ 
    static void Main(string[] args) 
    { 
     UnicodeEncoding ByteConverter = new UnicodeEncoding(); 

     byte[] dataToEncrypt = ByteConverter.GetBytes("Test data"); 

     WriteRSAInfoToFile(); 

     string enc = Encrypt(dataToEncrypt); 

     enc = Decrypt(enc); 
    } 

    static void WriteRSAInfoToFile() 
    { 
     RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(); 
     TextWriter writer = new StreamWriter("C:\\publicKey.xml"); 
     string publicKey = RSA.ToXmlString(false); 
     writer.Write(publicKey); 
     writer.Close(); 

     writer = new StreamWriter("C:\\privateKey.xml"); 
     string privateKey = RSA.ToXmlString(true); 
     writer.Write(privateKey); 
     writer.Close(); 
    } 

    static string Encrypt(byte[] data) 
    { 
     UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
     RSACryptoServiceProvider encrypt = new RSACryptoServiceProvider(); 
     TextReader reader = new StreamReader("C:\\publicKey.xml"); 
     string publicKey = reader.ReadToEnd(); 
     reader.Close(); 

     encrypt.FromXmlString(publicKey); 

     byte[] encryptedData = encrypt.Encrypt(data, false); 

     return ByteConverter.GetString(encryptedData); 
    } 

    static string Decrypt(string data) 
    { 
     UnicodeEncoding ByteConverter = new UnicodeEncoding(); 
     RSACryptoServiceProvider decrypt = new RSACryptoServiceProvider(); 
     TextReader reader = new StreamReader("C:\\privateKey.xml"); 
     string privateKey = reader.ReadToEnd(); 
     reader.Close(); 

     decrypt.FromXmlString(privateKey); 

     byte[] d = ByteConverter.GetBytes(data); 
     byte[] decryptedData = decrypt.Decrypt(d, false);  // ERROR: bad data 

     return ByteConverter.GetString(decryptedData); 
    } 
} 

}

回答

0

這有什麼,與你的公鑰/私鑰處理(我認爲這部分看起來OK,I/O可以做更容易儘管文件)。

但是,以字符串方式傳輸加密數據的方式不適合「往返」。改用Base64編碼。

你應該可以在調試器中看到這個:記下encryptedData的長度和第一個字節,這應該與Decrypt方法中的d匹配。

+0

你說得對! Base64工作。謝謝 – user441521

+0

不要通過字符串編碼來翻譯密文 - http://blogs.msdn.com/b/shawnfa/archive/2005/11/10/491431.aspx 這裏值得一提。 – gmaran23

0

第二次編輯的答案是no,base64字符串只使用字母數字字符和「+」,「/」和「=」。

瞭解更多信息here

相關問題