none
DES解密出错:要解密的数据的长度无效 RRS feed

  • 问题

  • public class EncryptHelpr
    {
        private static readonly string key = "a1234567";
        private static readonly string iv = "a1234567";
    
        public static string Encrypt(string data)
        {
            string result = string.Empty;
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            DESCryptoServiceProvider provider = new DESCryptoServiceProvider() 
            { 
                Key = Encoding.ASCII.GetBytes(key), 
                IV = Encoding.ASCII.GetBytes(iv)
            };
            using (MemoryStream memory = new MemoryStream())
            {
                using (CryptoStream crypto = new CryptoStream(memory, provider.CreateEncryptor(), CryptoStreamMode.Write))
                {
                    crypto.Write(bytes, 0, bytes.Length);                    
                }
                //result = Convert.ToBase64String(memory.ToArray());
                result = Encoding.UTF8.GetString(memory.ToArray());
                    
            }
            return result;
        }
    
        public static string Decrypt(string data)
        {
            string result = string.Empty;
            //byte[] bytes = Convert.FromBase64String(data);
            byte[] bytes = Encoding.UTF8.GetBytes(data);
            DESCryptoServiceProvider provider = new DESCryptoServiceProvider()
            {
                Key = Encoding.ASCII.GetBytes(key),
                IV = Encoding.ASCII.GetBytes(iv)
            };
            using (MemoryStream memory = new MemoryStream())
            {
                using (CryptoStream crypto = new CryptoStream(memory, provider.CreateDecryptor(), CryptoStreamMode.Write))
                {
                    crypto.Write(bytes, 0, bytes.Length);
                }
                result = Encoding.UTF8.GetString(memory.ToArray());
            }
            return result;
        }
    }
    
    在加密和解密方法中,我各注释掉了一行,换成加粗部分,结果解密时总是出错,提示:要解密的数据的长度无效,何解?
    2013年4月21日 1:32

答案

  • 因为你注释的加密那句是把byte数组转为一个可读字符串,但改用你的那句是把byte转成对应的字符,比如0x41就转为a,但是有个问题,有些byte是转不成可见字符的,比如0x00。 所以你得到的是一个错误的字符串,当然也就不能转换回原来的byte数组,也就不能解密了

    http://feiyun0112.cnblogs.com/

    • 已标记为答案 张远强 2013年4月22日 6:36
    2013年4月21日 9:03
    版主
  • 感谢回复,再问下,用方法中原来的ToBase64String和FromBase64String,会不会保险?是不是都能正常转换?会不会再出现“转不成可见字符”类似问题?

    hi,

    只要你的byte[]处理的正确,并不会有你提到的问题,要记住,怎麼來就怎麼去,加解密的動作是互相對应的,不能乱换,请考以下

    http://www.dotblogs.com.tw/yc421206/archive/2012/04/18/71609.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 张远强 2013年4月22日 6:36
    2013年4月22日 3:21

全部回复

  • 因为你注释的加密那句是把byte数组转为一个可读字符串,但改用你的那句是把byte转成对应的字符,比如0x41就转为a,但是有个问题,有些byte是转不成可见字符的,比如0x00。 所以你得到的是一个错误的字符串,当然也就不能转换回原来的byte数组,也就不能解密了

    http://feiyun0112.cnblogs.com/

    • 已标记为答案 张远强 2013年4月22日 6:36
    2013年4月21日 9:03
    版主
  • 感谢回复,再问下,用方法中原来的ToBase64String和FromBase64String,会不会保险?是不是都能正常转换?会不会再出现“转不成可见字符”类似问题?
    2013年4月22日 2:07
  • 感谢回复,再问下,用方法中原来的ToBase64String和FromBase64String,会不会保险?是不是都能正常转换?会不会再出现“转不成可见字符”类似问题?

    hi,

    只要你的byte[]处理的正确,并不会有你提到的问题,要记住,怎麼來就怎麼去,加解密的動作是互相對应的,不能乱换,请考以下

    http://www.dotblogs.com.tw/yc421206/archive/2012/04/18/71609.aspx


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    • 已标记为答案 张远强 2013年4月22日 6:36
    2013年4月22日 3:21
  • 感谢回复,我正是在解决输出样式的问题。原本也是使用文章第二个示例输出样式(将byte[]转为Hex),结果加密字符串长度比原先长了很多,所以寻求有没有更优的方法,以便于HTTP传输:)
    2013年4月22日 3:38
  • hi,

    文中还有个连结,你可能没看到
    http://www.dotblogs.com.tw/yc421206/archive/2009/08/11/9984.aspx

    转成Hexadecimalecimal

    this.textBox2.Text = BitConverter.ToString(myHash).Replace("-","");



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年4月22日 5:00
  • 我做了测试:


    1).BitConverter.ToString(myHash).Replace("-","")
    2).Convert.ToBase64String(myHash)

    两种方法密文的长度,2)会比1)短1/3左右,我是在给手机端程序做接口,比较在意密文的长度:)

    2013年4月22日 5:57
  • hi,

    那就选择较短的方式做处理啰^^

    若可以的话直接传递byte[]会更省资源


    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/

    2013年4月22日 6:12