- 爱易网页
 
                        - 
                            ASP.NET教程
 
                        - DES解密时提示“要解密的数据的长度无效。”,该如何解决 
 
                         
                    
                    
                    日期:2014-05-17  浏览次数:20587 次 
                    
                        
                         DES解密时提示“要解密的数据的长度无效。”
用DES加解密,调试的过程中,在解密方法里面出现异常
    ///
        /// DEC 加密过程
        ///
        public string Encrypt(string pToEncrypt, string sKey)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中
            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
            //byte[] inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);
            des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量
            des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);  //原文使用ASCIIEncoding.ASCII方法的GetBytes方法
            MemoryStream ms = new MemoryStream();   //使得输入密码必须输入英文文本
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                ret.AppendFormat("{0:X2}", b);
            }
            ret.ToString();
            return ret.ToString();
        }
         ///
         /// DEC 解密过程
         ///
         public string Decrypt(string pToDecrypt, string sKey)
         {
             DESCryptoServiceProvider des = new DESCryptoServiceProvider();
             byte[] inputByteArray = new byte[pToDecrypt.Length / 2];
             for (int x = 0; x < pToDecrypt.Length / 2; x++)
             {
                 int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));
                 inputByteArray[x] = (byte)i;
             }
             des.Key = ASCIIEncoding.ASCII.GetBytes(sKey); //建立加密对象的密钥和偏移量,此值重要,不能修改
             des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
             MemoryStream ms = new MemoryStream();
             CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
             cs.Write(inputByteArray, 0, inputByteArray.Length);
             cs.FlushFinalBlock();//异常:要解密的数据的长度无效
             StringBuilder ret = new StringBuilder(); //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象
             return System.Text.Encoding.Default.GetString(ms.ToArray());
         }
请教各位,多谢!!!
------解决方案--------------------
是不是由于数据库里的字段长度太小,导致字符被截取??
------解决方案--------------------
我用的一直没有问题啊 参考
/// <summary>
   /// 进行DES加密。
   /// </summary>
   /// <param name="pToEncrypt">要加密的字符串。</param>
   /// <param name="sKey">密钥,且必须为8位。</param>
   /// <returns>以Base64格式返回的加密字符串。</returns>
   public string Encrypt(string pToEncrypt, string sKey)
   {
       using (DESCryptoServiceProvider des = new DESCryptoServiceProvider())
       {
           byte[] inputByteArray = Encoding.UTF8.GetBytes(pToEncrypt);
           des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
           des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);
           System.IO.MemoryStream ms = new System.IO.MemoryStream();
           using (CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write))
           {
               cs.Write(inputByteArray, 0, inputByteArray.Length);
               cs.FlushFinalBlock();
               cs.Close();
           }
           string str = Convert.ToBase64String(ms.ToArray());
           ms.Close();
           return str;
       }