Farukh
Farukh

Reputation: 2221

How to write into encrypted file from memory C#

I am trying to write straight into encrypted stream and then store it into file.

I have code below, but when I decrypt I get garbage not the message that I was encrypting.

Can anyone help what I am missing in the code below?

 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);
            }

        }

    }
}

Upvotes: 0

Views: 413

Answers (1)

Rob
Rob

Reputation: 27367

  1. Your code won't compile as is - it's expecting a char[] but you're passing a byte[].
  2. You're passing fs to the StreamReader instead of strm.

You can use this:

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);
        }
    }
}

Also as an FYI - your salt is incredibly insecure. See here for more information.

Upvotes: 2

Related Questions