Reputation: 2221
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
Reputation: 27367
char[]
but you're passing a byte[]
.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