首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

急对文件流解密时出现字节丢失,提示“不正确的数据”,CryptoStream encStream,有谁帮忙解决一下,多谢!

2012-05-24 
急!!!!对文件流解密时出现字节丢失,提示“不正确的数据”,CryptoStream encStream,有哪位高手帮忙解决一下,

急!!!!对文件流解密时出现字节丢失,提示“不正确的数据”,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个,不知道什么原因,找个一个多小时了,网上也有“不正确的数据”问题,可是好像不太一样!!!急!!!! 
有高手帮忙解决一下,谢谢!!!

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

热点排行