这两天一直在被文件流虐。。。
是这样的,我想要做一个文件加密程序,把一个txt文件按制定的算法加密。
加密算法经过测试都是对的。。但是一用上文件流就出了很大的问题。。
加密后重新解码的文件都是乱码,不知道是不是编码的问题(Unicode,ASCII之类的)。。一直解决不了。。
求大神帮忙看看
上代码
Console.Write("\r\n请输入原始文件名:");
string sourceFile = Console.ReadLine();
Console.Write("请输入目标文件名:");
string targetFile = Console.ReadLine();
Console.WriteLine("请选择加密算法:");
Console.WriteLine("0.字符转位 1.字符串转位 2.简单换字 3.简单异或 4.反馈异或 5.多重换字 6.多重异或 7.简化DES");
TextEncrypt encrypt;
char ch = Console.ReadKey().KeyChar;
switch (ch)
{
//选择一些加密算法,就不列出了,都是书上的算法,经测试也是对的。
}
FileEncrypt fe = new FileEncrypt(encrypt);
Console.Write("请选择操作类型(1.加密 2.解密)\n");
if (Console.ReadKey().KeyChar == '2')
fe.Decrypt(sourceFile, targetFile, Encoding.Unicode); //自己写的解码方法
else
fe.Encrypt(sourceFile, targetFile, Encoding.Unicode); //自己写的加密方法
//加密方法
public virtual void Encrypt(string sourceFile, string targetFile, Encoding encoding)
{
FileStream fs1 = new FileStream(sourceFile, FileMode.Open);
FileStream fs2 = new FileStream(targetFile, FileMode.Create);
BinaryReader br1 = new BinaryReader(fs1, encoding);
BinaryWriter sw1 = new BinaryWriter(fs2, encoding);
char[] buf1;
while (fs1.Position < fs1.Length)
{
buf1 = br1.ReadChars(Interval);
sw1.Write(_encrypt.Encode(buf1));
}
br1.Close();
sw1.Close();
fs1.Close();
fs2.Close();
}
//解密i方法
public virtual void Decrypt(string sourceFile, string targetFile, Encoding encoding)
{
FileStream fs1 = new FileStream(sourceFile, FileMode.Open);
FileStream fs2 = new FileStream(targetFile, FileMode.Create);
BinaryReader br1 = new BinaryReader(fs1, encoding);
BinaryWriter sw1 = new BinaryWriter(fs2, encoding);
char[] buf1;
while (fs1.Position < fs1.Length)
{
buf1 = br1.ReadChars(Interval);
sw1.Write(_encrypt.Decode(buf1));
}
br1.Close();
sw1.Close();
fs1.Close();
fs2.Close();
}
后果如下:
部分解码是对的。。部分是错的。。QAQ
调了一天没找到问题所在。。求大神提点。。
------解决思路----------------------
不要把二进制数据用除了base64之外的编码方式转成字符串
------解决思路----------------------
字符编码,并不是每一个编号都会对应一个唯一的字符
有些未定义的,都会变成"?"
还有些是多个编号对应同一个字符的
实际上,你要加密文件,应该加密文件的二进制数据,而不是文件内容
就不应该以任何编码形式转成字符串
------解决思路----------------------
还有你文本文件的编码方式,必须要和你使用文件流的编码方式一致。
------解决思路----------------------
为什么有那么多 Encoding.Unicode 呢
要么就 Encoding.ASCII,要么就全部二进制读写
你的加密都是针对 char 进行的,如果是 Unicode 字符,运算后就可能不在他的范围里(被丢弃)了。自然也就没法解密了
如果采用 Encoding.ASCII char 无论怎么运算,其值都在 ASCII 范围内
二进制读写操作的是 byte 自然也是不会出错的