关于C#加密解密问题。

阔人 2011-04-28 02:07:36
我做了一个对文件加密解密的工具,使用该工具加密解密文件时发现:加密解密其它文件都很工常,没有错误;但加密文本文件、然后将文件解密,发现解密后的文件与加密前的文件不一样,解密后的文件总是多个两三行内容。就是多读了文件的最后几句话。这是个什么怪事呀?为什么对别的文件(.doc和.pdf)都没问题,就.txt文件有问题.希望大侠帮助分析一下这个奇怪的问题!!谢谢了!!
...全文
117 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
阔人 2011-04-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 vrhero 的回复:]

十有八九是固定大小缓冲区的问题,最后一块读或写时没有修改读取或写入的长度...
[/Quote]
谢谢呀!!假如是这个错误的话,那如何去发现改正勒!!谢谢指教!!
vrhero 2011-04-28
  • 打赏
  • 举报
回复
十有八九是固定大小缓冲区的问题,最后一块读或写时没有修改读取或写入的长度...
Tim_Andy 2011-04-28
  • 打赏
  • 举报
回复
 

/// <summary>
/// DES加密文件
/// </summary>
/// <param name="inputDESIV">密钥向量</param>
/// <param name="inputDESKEY">密钥</param>
/// <param name="inputFileName">待加密文件的文件名</param>
/// <returns>成功返回true,失败返回false</returns>
public static bool DesEncryptFile_(byte[] inputDESIV, string inputDESKEY, string inputFileName)
{
//输出文件名
string strOUTPUT = "";
//输入流
FileStream fsINPUT = null;
//输出流
FileStream fsOUTPUT = null;

try
{
if (inputDESKEY.Length < 16)
{
//字节形式密钥向量
byte[] bytesDESIV = inputDESIV;
//字节形式加密密钥
byte[] bytesDESKEY = Encoding.UTF8.GetBytes(inputDESKEY.Substring(0, 8));
//长文件名形式输出文件的文件名
strOUTPUT = Path.GetDirectoryName(inputFileName) + "\\" + Path.GetFileNameWithoutExtension(inputFileName) + "_加密副本" + Path.GetExtension(inputFileName);
//文件流形式输入
fsINPUT = new FileStream(inputFileName, FileMode.Open, FileAccess.Read);
//文件流形式输出
fsOUTPUT = new FileStream(strOUTPUT, FileMode.Create, FileAccess.Write);
//字节形式输入文件
byte[] bytesINPUTFILE = new byte[fsINPUT.Length];
//声明一个新的DES对象
DESCryptoServiceProvider desEncrypt = new DESCryptoServiceProvider();
//把输出流对象包装成加密流对象
CryptoStream csEncrypt = new CryptoStream(fsOUTPUT, desEncrypt.CreateEncryptor(bytesDESKEY, bytesDESIV), CryptoStreamMode.Write);
//输入流读取文件
fsINPUT.Read(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//把字节写入加密流
csEncrypt.Write(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//关闭加密流对象
csEncrypt.Close();
//关闭输出流对象
fsOUTPUT.Close();
//关闭输入流对象
fsINPUT.Close();
//返回true
return true;
}
else
{
//字节形式密钥向量
byte[] bytesDESIV = inputDESIV;
//字节形式加密密钥
byte[] bytesDESKEY = Encoding.UTF8.GetBytes(inputDESKEY);
//长文件名形式输出文件的文件名
strOUTPUT = Path.GetDirectoryName(inputFileName) + "\\" + Path.GetFileNameWithoutExtension(inputFileName) + "_加密副本" + Path.GetExtension(inputFileName);
//文件流形式输入
fsINPUT = new FileStream(inputFileName, FileMode.Open, FileAccess.Read);
//文件流形式输出
fsOUTPUT = new FileStream(strOUTPUT, FileMode.Create, FileAccess.Write);
//字节形式输入文件
byte[] bytesINPUTFILE = new byte[fsINPUT.Length];
//声明一个新的DES对象
RijndaelManaged rmEncrypt = new RijndaelManaged();
//设置DES对象密钥长度
rmEncrypt.KeySize = inputDESKEY.Length * 8;
//把输出流对象包装成加密流对象
CryptoStream csEncrypt = new CryptoStream(fsOUTPUT, rmEncrypt.CreateEncryptor(bytesDESKEY, bytesDESIV), CryptoStreamMode.Write);
//输入流读取文件
fsINPUT.Read(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//把字节写入加密流
csEncrypt.Write(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//关闭加密流对象
csEncrypt.Close();
//关闭输出流对象
fsOUTPUT.Close();
//关闭输入流对象
fsINPUT.Close();
//返回true
return true;
}
}
catch
{
try
{
//关闭输出流对象
fsOUTPUT.Close();
//删除文件
File.Delete(strOUTPUT);
}
catch
{
}
//返回false
return false;
}
}



/// <summary>
/// DES解密文件
/// </summary>
/// <param name="inputDESIV">密钥向量</param>
/// <param name="inputDESKEY">密钥</param>
/// <param name="inputFileName">待解密文件的文件名</param>
/// <returns>成功返回true,失败返回false</returns>
public static bool DesDecryptFile_(byte[] inputDESIV, string inputDESKEY, string inputFileName)
{
//输出文件名
string strOUTPUT = "";
//输入流
FileStream fsINPUT = null;
//输出流
FileStream fsOUTPUT = null;

try
{
if (inputDESKEY.Length < 16)
{
//字节形式密钥向量
byte[] bytesDESIV = inputDESIV;
//字节形式加密密钥
byte[] bytesDESKEY = Encoding.UTF8.GetBytes(inputDESKEY.Substring(0, 8));
//长文件名形式输出文件的文件名
strOUTPUT = Path.GetDirectoryName(inputFileName) + "\\" + Path.GetFileNameWithoutExtension(inputFileName) + "_解密副本" + Path.GetExtension(inputFileName);
//文件流形式输入
fsINPUT = new FileStream(inputFileName, FileMode.Open, FileAccess.Read);
//文件流形式输出
fsOUTPUT = new FileStream(strOUTPUT, FileMode.Create, FileAccess.Write);
//字节形式输入文件
byte[] bytesINPUTFILE = new byte[fsINPUT.Length];
//声明一个新的DES对象
DESCryptoServiceProvider desDecrypt = new DESCryptoServiceProvider();
//把输出流对象包装成解密流对象
CryptoStream csDecrypt = new CryptoStream(fsOUTPUT, desDecrypt.CreateDecryptor(bytesDESKEY, bytesDESIV), CryptoStreamMode.Write);
//输入流读取文件
fsINPUT.Read(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//把字节写入解密流
csDecrypt.Write(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//关闭解密流对象
csDecrypt.Close();
//关闭输出流对象
fsOUTPUT.Close();
//关闭输入流对象
fsINPUT.Close();
//返回true
return true;
}
else
{
//字节形式密钥向量
byte[] bytesDESIV = inputDESIV;
//字节形式加密密钥
byte[] bytesDESKEY = Encoding.UTF8.GetBytes(inputDESKEY);
//长文件名形式输出文件的文件名
strOUTPUT = Path.GetDirectoryName(inputFileName) + "\\" + Path.GetFileNameWithoutExtension(inputFileName) + "_解密副本" + Path.GetExtension(inputFileName);
//文件流形式输入
fsINPUT = new FileStream(inputFileName, FileMode.Open, FileAccess.Read);
//文件流形式输出
fsOUTPUT = new FileStream(strOUTPUT, FileMode.Create, FileAccess.Write);
//字节形式输入文件
byte[] bytesINPUTFILE = new byte[fsINPUT.Length];
//声明一个新的DES对象
RijndaelManaged rmDecrypt = new RijndaelManaged();
//设置DES对象密钥长度
rmDecrypt.KeySize = inputDESKEY.Length * 8;
//把输出流对象包装成解密流对象
CryptoStream csDecrypt = new CryptoStream(fsOUTPUT, rmDecrypt.CreateDecryptor(bytesDESKEY, bytesDESIV), CryptoStreamMode.Write);
//输入流读取文件
fsINPUT.Read(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//把字节写入解密流
csDecrypt.Write(bytesINPUTFILE, 0, bytesINPUTFILE.Length);
//关闭解密流对象
csDecrypt.Close();
//关闭输出流对象
fsOUTPUT.Close();
//关闭输入流对象
fsINPUT.Close();
//返回true
return true;
}
}
catch
{
try
{
//关闭输出流对象
fsOUTPUT.Close();
//删除文件
File.Delete(strOUTPUT);
}
catch
{
}
//返回false
return false;
}
}






阔人 2011-04-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 a334715874 的回复:]

不清楚,帮顶吧`
[/Quote]
这个我感觉应该没关系吧,如果有关系的话,别的文件也会出问题呀.我用的DES算法.
cjh200102 2011-04-28
  • 打赏
  • 举报
回复
不清楚你用的是什么加密的

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧