2016-03-21 12 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. strmの代わりにfsをStreamReaderに渡しています。

あなたはこれを使用することができます:

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を参照してください。

関連する問題