读书人

急对文件流解密时出现字节丢失提示“

发布时间: 2012-05-24 11:55:41 作者: rapoo

急!!!!对文件流解密时出现字节丢失,提示“不正确的数据”,CryptoStream encStream,有哪位高手帮忙解决一下,谢谢!!
/// <summary>
/// 对文件加密采用算法
/// </summary>
/// <param name="sy">创建一个公钥和一个私钥 </param>
private void PasswordToByte(SymmetricAlgorithm sy)
{
byte[] b = new byte[8];
byte[] c = new byte[8];
Encoding ascii = Encoding.ASCII;
byte[] EncodeByte = ascii.GetBytes("zhongguo");
byte[] EncodeByte2 = ascii.GetBytes("zhongguo");

ToPassByte(b, EncodeByte);
ToPassByte(c, EncodeByte2);

sy.Key = b;
sy.IV = c;
}

/// <summary>
///
/// </summary>
/// <param name="Destination">字节数 </param>
/// <param name="Source">编码字符数组 </param>
public void ToPassByte(byte[] Destination, byte[] Source)
{
if (Destination.Length >= Source.Length)
{
for (int i = 0; i < Source.Length; i++)
{
Destination[i] = Source[i];
}
}
else
{
for (int i = 0; i < Destination.Length; i++)
{
Destination[i] = Source[i];
}
}
}

/// <summary>
/// 将一个文件加密并生成一个新文件
/// </summary>
/// <param name="inName">需要加密文件的全路径 </param>
/// <param name="outName">输出加密文件的全路径 </param>
public byte[] EncryptData(String inName, String outName)
{
//创建输入流和输出流
FileStream fin = new FileStream(inName, FileMode.Open, FileAccess.Read);
MemoryStream fout = new MemoryStream();
fout.SetLength(0);

//读写的缓存区
byte[] bin = new byte[1000]; //加密的临时存储区
long rdlen = 0; //初始化写出流的长度
long totlen = fin.Length; //输入流的长度
int len; //某一个时间段完成的写出流长度

//给key和iv赋值
PasswordToByte(des);
//创建加密器
ICryptoTransform transform = des.CreateEncryptor(des.Key, des.IV);
//使用加密器和输出流,创建一个加密输出流
CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write);

//循环读出输入流到内存中,然后加密流将一段内存加密后写到输出流
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 1000);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}

byte[] fdata = fout.ToArray(); //将加密流fout储存到数组fdata中
//关闭流
encStream.Close();
fin.Close();
fout.Close();

return fdata;
}



/// <summary>
///解密
/// </summary>
/// <param name="inName"> </param>


/// <param name="outName"> </param>
public byte[] DecryptData(byte[] filedata, string outName)
{
//创建输入流和输出流
MemoryStream fin = new MemoryStream(filedata);
MemoryStream fout = new MemoryStream();
fout.SetLength(0);

//读写的缓存区
byte[] bin = new byte[1000]; //加密的临时存储区
long rdlen = 0; //初始化写出流的长度
long totlen = fin.Length; //输入流的长度
int len; //某一个时间段完成的写出流长度

SymmetricAlgorithm des = new DESCryptoServiceProvider();
//给key和iv赋值
PasswordToByte(des);
// 创建解密器
ICryptoTransform transform = des.CreateDecryptor(des.Key, des.IV);
//使用解密器和输出流,创建一个解密输出流
CryptoStream encStream = new CryptoStream(fout, transform, CryptoStreamMode.Write);

//读出输入流,解密和写输出流
while (rdlen < totlen)
{
len = fin.Read(bin, 0, 1000);
encStream.Write(bin, 0, len);
rdlen = rdlen + len;
}

long l = fout.Length; //测试字段,传进来的长度到这里少个8个字节
byte[] fdata = fout.ToArray(); //将加密流fout储存到数组fdata中
//关闭流
encStream.Close();
fout.Close();
fin.Close();

return fdata;
}
在解密时,传入的字节数经过 CryptoStream encStream 内存流放入fout(输出流)后,字节就会少8个,不知道什么原因,找个一个多小时了,网上也有“不正确的数据”问题,可是好像不太一样!!!急!!!!
有高手帮忙解决一下,谢谢!!!

[解决办法]
这个问题的帖子蛮多的,就是没有一个明确答复!!!!!

读书人网 >asp.net

热点推荐