我正在尝试使用DESCryptoServiceProvider
在C#中编写一个简单的文件加密器。我正在加密的文件格式是.jpg
。加密看起来很好,但是当我解密加密文件时,我在Windows Photo Viewer中收到一条错误消息。
这是我的代码:
public static void Encrypt(string inputFileName, string outputFileName, string key)
{
var inputPath = path + "\\" + inputFileName;
var outputPath = path + "\\" + outputFileName;
try
{
FileStream fsInput = new FileStream(inputPath, FileMode.Open, FileAccess.Read);
FileStream fsEncrypted = new FileStream(outputPath, FileMode.Create, FileAccess.Write);
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
DES.IV = ASCIIEncoding.ASCII.GetBytes(key);
DES.Padding = PaddingMode.None;
ICryptoTransform desencrypt = DES.CreateEncryptor();
CryptoStream cryptostream = new CryptoStream(fsEncrypted, desencrypt, CryptoStreamMode.Write);
byte[] bytearrayinput = new byte[fsInput.Length - 1];
fsInput.Read(bytearrayinput, 0, bytearrayinput.Length);
cryptostream.Write(bytearrayinput, 0, bytearrayinput.Length);
Console.WriteLine("file encrypted @ {0}", outputFileName);
}
catch(Exception ex)
{
Console.WriteLine("catch in encryption: " + ex.Message + "\n\nclosing...");
}
}
public static void Decrypt(string inputFileName, string outputFileName, string key)
{
var inputPath = path + "\\" + inputFileName;
var outputFileHoler = inputFileName.Substring(0, (outputFileName.IndexOf('.') + 4)); //FIX TO REMOVE REGEX
var outputPath = path + "\\" + outputFileHoler;
Console.WriteLine(outputPath); //TEMP
try
{
DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
DES.Key = ASCIIEncoding.ASCII.GetBytes(key);
DES.IV = ASCIIEncoding.ASCII.GetBytes(key);
DES.Padding = PaddingMode.None;
FileStream fsread = new FileStream(inputPath, FileMode.Open, FileAccess.Read);
ICryptoTransform desdecrypt = DES.CreateDecryptor();
CryptoStream cryptostream = new CryptoStream(fsread, desdecrypt, CryptoStreamMode.Read);
StreamWriter fsDecrypted = new StreamWriter(outputPath);
fsDecrypted.Write(new StreamReader(cryptostream).ReadToEnd());
fsDecrypted.Flush();
fsDecrypted.Close();
Console.WriteLine("file decrypted @ {0}", outputPath);
}
catch (Exception ex)
{
Console.WriteLine("catch in decryption: " + ex.Message + "\n\nclosing...");
}
}
我做错了什么?
PS。对密码学来说是全新的,如果它很简单,请原谅我......
答案 0 :(得分:1)
请勿尝试自己实施加密,除非您100%确定自己知道自己在做什么。使用经过良好审核的高级(!)库。
您正在尝试使用DES。由于密钥长度不足,DES被破坏且不安全。不要使用它。
您正在使用密钥而不是随机值作为IV。根据加密提供程序的工作方式,这会引入一个小漏洞或使您的加密100%毫无价值,因为它会泄露您的密钥。
您没有使用任何填充。这将无法正确加密/解密不完全符合块大小的文件。
您没有显示获取密钥的方式。你有可能以不安全的方式这样做。特别是假设您使用字符串来存储它。
CodesInChaos的评论指出了很多重要的观点。什么打破你的文件可能是StreamReader,填充,以及缺少流刷新/关闭。但是,再次不要尝试编写加密代码 - 即使您使其工作, 也会不安全。