2015-10-05 4 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)); 
}