2015-10-05 50 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)); 
} 
相关问题