如何从内存C#写入加密文件

How to write into encrypted file from memory 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. 您的代码不会按原样编译 - 它期望 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);
        }
    }
}

另外,仅供参考 - 您的盐非常不安全。有关详细信息,请参阅 here