2016-03-21 1 views
0

Я пытаюсь написать прямо в зашифрованный поток, а затем сохранить его в файл.Как записать в зашифрованный файл из памяти C#

У меня есть код ниже, но когда я дешифрую, я получаю мусор не сообщение, которое я шифровал.

Может ли кто-нибудь помочь, чего мне не хватает в коде ниже?

static void Main(string[] args) 
    { 
     string password = "pswd"; 
     string fileName = "test.txt"; 
     string msg = "Secret Message"; 
     FileEncryptionExample fe = new FileEncryptionExample(); 

     fe.EncryptFileExample(fileName, password, msg); 

     fe.DecryptFileExample(fileName, password); 

     Console.WriteLine("Press any key..."); 
     Console.ReadKey(); 
    } 
//------------------------------------------------------------------ 
public class FileEncryptionExample 
{ 
    public void DecryptFileExample(string fileName, string password) 
    { 


     byte[] salt = Encoding.ASCII.GetBytes(password.Length.ToString()); 

     using (FileStream fs = new FileStream(fileName, FileMode.Open)) 
     { 

      PasswordDeriveBytes secretKey = new PasswordDeriveBytes(password, salt); 

      RijndaelManaged rm = new RijndaelManaged(); 
      CryptoStream strm = new CryptoStream(fs, rm.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)), CryptoStreamMode.Read); 
      using (StreamReader sr = new StreamReader(fs)) 
      { 
       while (!sr.EndOfStream) 
       { 
        byte[] data = new byte[12]; 

        sr.Read(data, 0, 12); 

        Console.WriteLine(sr.ReadLine()); 
       } 
      } 

     } 

    } 


    public void EncryptFileExample(string fileName, string password, string text) 
    { 

     StreamWriter sw = new StreamWriter(fileName); 

     byte[] salt = Encoding.ASCII.GetBytes(password.Length.ToString()); 

     using (RijndaelManaged rm = new RijndaelManaged()) 
     { 
      PasswordDeriveBytes secretKey = new PasswordDeriveBytes(password, salt); 

      using (CryptoStream strm = new CryptoStream(sw.BaseStream, rm.CreateEncryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)), CryptoStreamMode.Write)) 
      { 
       //sw.WriteLine(text); 

       byte[] data = Encoding.ASCII.GetBytes(text); 
       strm.Write(data, 0, data.Length); 
      } 

     } 

    } 
} 
+1

Работает ли это для вас https://msdn.microsoft.com/en-us/library/system.security.cryptography.rijndaelmanaged(v=vs.110).aspx? – Thomas

ответ

2
  1. Ваш код не будет компилироваться как есть - это ожидает char[] но вы передаете byte[].
  2. Вы передаете fs в StreamReader вместо strm.

Вы можете использовать это:

public void DecryptFileExample(string fileName, string password) 
{ 
    byte[] salt = Encoding.ASCII.GetBytes(password.Length.ToString()); 

    using (FileStream fs = new FileStream(fileName, FileMode.Open)) 
    { 
     PasswordDeriveBytes secretKey = new PasswordDeriveBytes(password, salt); 

     RijndaelManaged rm = new RijndaelManaged(); 
     CryptoStream strm = new CryptoStream(fs, rm.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)), CryptoStreamMode.Read); 

     using (StreamReader srDecrypt = new StreamReader(strm)) 
     { 
      var str = srDecrypt.ReadToEnd(); 
      Console.WriteLine(str); 
     } 
    } 
} 

Также как FYI - ваша соль невероятно небезопасно. См. here для получения дополнительной информации.

 Смежные вопросы

  • Нет связанных вопросов^_^