当前位置:编程学习 > C#/ASP.NET >>

c# 多重DES错误,即内存流使用K1密钥加密后,无法使用K2密钥进行解密

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

注意是多重,不是多次,


但是现在K1加密成功,K2就解密不了了,说不正确数据,自己上网找了很多资料还是没有办法解决,花了不少时间了。请各位师傅和师兄们帮帮忙。

以下是源码,密钥和向量存放在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

--------------------编程问答-------------------- 希望能有师傅来帮忙解决下!感激了 --------------------编程问答-------------------- 表示关注 --------------------编程问答-------------------- 1、中间修改循环变量,一般不这么写。
2、建议单步跟踪一下,看看参数是否正确。 --------------------编程问答-------------------- 你真不嫌累。。。。。。。。。。多重 --------------------编程问答-------------------- --------------------编程问答-------------------- LZ单步调试下,把错误的地方贴出来 --------------------编程问答-------------------- 错误在:在使用K1密钥内存流加密后,接着使用K2密钥内存流解密时,出现“不正确数据”
就是解密中的这句 CS.FlushFinalBlock();
我自己做过测试,如果对没有加过密的进行DES也是这样的错误,是否微软对DES加密设置有文件保护功能,只有 可以解密的且密钥是加密的密钥的才可以进行DES解密操作。寻求师傅的帮助。
全球第一大的IT论坛也解决不了的话,我放弃了!!
--------------------编程问答-------------------- 版主老大们呢?进来帮帮忙嘛 --------------------编程问答-------------------- 有人可以帮帮我吗?
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,