2015-10-05 82 views
1

我想以某種方式將文件中的字符串存儲起來,以至於無法(輕鬆)讀取它。所以我用的BinaryFormatter這樣的:如何從文件中讀取二進制格式的字符串?

using (FileStream fs = File.Create(sfDialog.FileName, 2048, FileOptions.None)) 
{ 
    BinaryFormatter bf = new BinaryFormatter(); 
    bf.Serialize(fs, Encoding.Unicode.GetBytes(this.BodyText)); 
} 

其中this.BodyText是保存的字符串。

現在我正努力從文件中讀回它。我試過BinaryReader沒有成功,所以我猜,我必須使用BinaryFormatter。我嘗試了Deserialize方法,但它返回一個不能轉換爲字符串的對象。另外Convert.ToBase64String不能用於對象。

有誰知道如何解決我的問題?

+1

如果你希望字符串不要輕易可讀的,你真的應該考慮適當的加密。 –

+0

我建議你把你的字符串轉換成byte []和xor它是有一些值的元素。 – enkryptor

+1

如果你不想讓它輕易閱讀,爲什麼不加密呢? –

回答

2

我同意其他人,你應該使用一些適當的加密,而不是這個。

但是要回答您的實際問題: 您正在序列化一個字節數組。所以這就是你反序列化時得到的結果。

因此,反序列化後,轉換爲byte[]這個字節數組轉換爲字符串:

var s = Encoding.Unicode.GetString((byte[])deserializedValue); 
+0

接受答案,因爲它實際上完美地回答了我的問題。因爲所有關於使用解密的建議都是相當可觀的,可能比使用二進制格式更優雅,但是因爲數據並不是真正的祕密 - 實際上我只是想隱瞞它是純HTML的事實 - 我會用這個。 – tafkab76

1

使用此功能來加密&解密。

string passPhrase = "Pasword";  // can be any string 
    string saltValue = "sALtValue";  // can be any string 
    string hashAlgorithm = "SHA1";    // can be "MD5" 
    int passwordIterations = 7;     // can be any number 
    string initVector = "~1B2c3D4e5F6g7H8"; // must be 16 bytes 
    int keySize = 256;    // can be 192 or 128 

    private string Encrypt(string data) 
    { 
     byte[] bytes = Encoding.ASCII.GetBytes(this.initVector); 
     byte[] rgbSalt = Encoding.ASCII.GetBytes(this.saltValue); 
     byte[] buffer = Encoding.UTF8.GetBytes(data); 
     byte[] rgbKey = new PasswordDeriveBytes(this.passPhrase, rgbSalt, this.hashAlgorithm, this.passwordIterations).GetBytes(this.keySize/8); 
     RijndaelManaged managed = new RijndaelManaged(); 
     managed.Mode = CipherMode.CBC; 
     ICryptoTransform transform = managed.CreateEncryptor(rgbKey, bytes); 
     MemoryStream stream = new MemoryStream(); 
     CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Write); 
     stream2.Write(buffer, 0, buffer.Length); 
     stream2.FlushFinalBlock(); 
     byte[] inArray = stream.ToArray(); 
     stream.Close(); 
     stream2.Close(); 
     return Convert.ToBase64String(inArray); 
    } 

    private string Decrypt(string data) 
    { 
     byte[] bytes = Encoding.ASCII.GetBytes(this.initVector); 
     byte[] rgbSalt = Encoding.ASCII.GetBytes(this.saltValue); 
     byte[] buffer = Convert.FromBase64String(data); 
     byte[] rgbKey = new PasswordDeriveBytes(this.passPhrase, rgbSalt, this.hashAlgorithm, this.passwordIterations).GetBytes(this.keySize/8); 
     RijndaelManaged managed = new RijndaelManaged(); 
     managed.Mode = CipherMode.CBC; 
     ICryptoTransform transform = managed.CreateDecryptor(rgbKey, bytes); 
     MemoryStream stream = new MemoryStream(buffer); 
     CryptoStream stream2 = new CryptoStream(stream, transform, CryptoStreamMode.Read); 
     byte[] buffer5 = new byte[buffer.Length]; 
     int count = stream2.Read(buffer5, 0, buffer5.Length); 
     stream.Close(); 
     stream2.Close(); 
     return Encoding.UTF8.GetString(buffer5, 0, count); 
    } 
0

如果你希望字符串不要輕易可讀的,你應該使用適當的加密。

例如,您可以使用DPAPI誰將使用您的Windows憑據作爲加密的關鍵。 (more details about the pros/cons of that concept here

或者你可以read Josh Galloway's article探索3種不同的方法,其中第三種看起來很有前途,即使我自己沒有嘗試過,但最酷的部分是它不需要你的加密數據在config文件。)

此外,對於原來的問題,不要忘了,你既然叫

Encoding.Unicode.GetBytes(this.BodyText) 

你將需要調用Encoding服務來獲得Unicode字符串你的字節數組時反序列化:

Encoding.Unicode.GetString(myByteArray); 
0

試試這個:

using (FileStream fs = File.Create(sfDialog.FileName, 2048, FileOptions.None)) 
{ 
    BinaryFormatter deserializer = new BinaryFormatter(); 
    deserializedObject = System.Text.Encoding.Unicode.GetString((byte[])deserializer.Deserialize(memoryStream)); 
} 
相關問題