none
c# 多重DES错误,即内存流使用K1密钥加密后,无法使用K2密钥进行解密。K1不等于K2 RRS feed

  • 问题

  • c# 多重DES错误,即内存流使用K1密钥加密后,无法使用K2密钥进行解密。
    我想设计个多重的DES来使用,比如5重,那么就是K1加密 K2解密 K3加密 K4解密 K5加密

    注意是多重,不是多次,


    但是现在K1加密成功,K2就解密不了了,说不正确数据,自己上网找了很多资料还是没有办法解决,花了不少时间了。请各位师傅和师兄们帮帮忙。
    错误在:在使用K1密钥内存流加密后,接着使用K2密钥内存流解密时,出现“不正确数据”
    就是解密中的这句 CS.FlushFinalBlock();
    我自己做过测试,如果对没有加过密的进行DES也是这样的错误,是否微软对DES加密设置有文件保护功能,只有 可以解密的且密钥是加密的密钥的才可以进行DES解密操作。寻求师傅的帮助。
    全球第一大的IT论坛也解决不了的话,我放弃了!!


    以下是源码,密钥和向量存放在KeyIV中,前面是密钥,最后一个是向量。
    唉,但是我也很不抱有希望。。。唉,,准备放弃了!!!!!
      #region 多重DES加密
      /// <summary>
      /// 多重DES加密
      /// </summary>
      /// <param name="KeyIV">密钥向量集</param>
      /// <param name="desCount">重数</param>
      /// <param name="values">要加密的字节数组</param>
      /// <returns></returns>
      public byte[] MuDES_EN(byte[][] KeyIV, int desCount, byte[] values)
      {
      try
      {
      byte[] MDesByte;

      //加密第一次
      MDesByte = CreateEncryptByte(KeyIV[0], KeyIV[desCount], values);
      //按照重数-1循环加解密
      for(int i=1;i<desCount;i++)
      {
      //解密
      MDesByte = CreateDescryptByte(KeyIV[i], KeyIV[desCount], MDesByte);
      i = i + 1;
      //加密
      MDesByte = CreateEncryptByte(KeyIV[i], KeyIV[desCount], MDesByte);
      }
      return MDesByte;

      }
      catch
      {
      return null;
      }
      }
      #endregion





      #region 加密字节数组(标准DES)
      /// <summary>
      /// 加密字节数组(标准DES)
      /// </summary>
      /// <param name="key">密钥</param>
      /// <param name="iV">向量</param>
      /// <param name="values">要加密的字节数组</param>
      /// <returns></returns>
      public static byte[] CreateEncryptByte(byte[] key, byte[] iV, byte[] values)
      {
      try
      {
      using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
      {
      des.Key = key;
      des.IV = iV;
      System.IO.MemoryStream ms = new System.IO.MemoryStream(values);
      using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
      {
      ms.Flush();
      cs.Write(values, 0, values.Length);
      cs.FlushFinalBlock();
      cs.Close();
      }
      //加密流转换成字节流
      byte[] buffer = ms.ToArray();
      //关闭内存流
      ms.Flush();
      ms.Close();
      des.Clear();
      //返回已加密的字节数组
      return buffer;
      }
      }
      catch
      {
      //解密不成功,返回NULL
      return null;
      }




      }
      #endregion




      #region 解密字节数组(标准DES)
      /// <summary>
      /// 解密字节数组(标准DES)
      /// </summary>
      /// <param name="key">密钥</param>
      /// <param name="iV">向量</param>
      /// <param name="values">要解密的字节数组</param>
      /// <returns></returns>
      public static byte[] CreateDescryptByte(byte[] key, byte[] iV, byte[] values)
      {
      try
      {
      using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
      {
      des.Key = key;
      des.IV = iV;
      System.IO.MemoryStream ms = new System.IO.MemoryStream();
      using (CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write))
      {
      ms.Flush();
      //ms.Close();
      cs.Write(values, 0, values.Length);
      cs.FlushFinalBlock();
      cs.Close();
      }
      //解密流转换成字节流
      byte[] buffer = ms.ToArray();
      ms.Flush();
      //关闭内存流
      ms.Close();
      //返回已加密的字节数组
      return buffer;
      }
      }
      catch
      {
      //解密不成功,返回NULL
      return null;
      }
      }
      #endregion

    2011年9月4日 4:45

答案

全部回复