base-64 字符数组或字符串的长度无效

SongKer 发布时间:2015-11-26 分类:.NET 阅读:6406次 5 条评论

进过加密后字符串:

Wu1wFpAusn1vJjbM4XrLITa3f3x7If0nDyDYLFzlRPgzFfOnB+02sdPEvvt8GR/0YdQboOANZj6SBOWIhsWpkxDxRRqWqbz+

接收的加密字符串:

Wu1wFpAusn1vJjbM4XrLITa3f3x7If0nDyDYLFzlRPgzFfOnB 02sdPEvvt8GR/0YdQboOANZj6SBOWIhsWpkxDxRRqWqbz 

区别在于get方式接收的加密后的字符串里面将‘+’变成了空格‘ ’。导致用密钥解密时候报错:base-64 字符数组或字符串的长度无效。

解决办法:将接收的字符串里的空格‘ ’替换成‘+’。

代码:text.Replace(' ', '+');

------------------20151126更新--------------------

如果用get方式传递加密后的url字符串的话,会出现上面+变空格问题。需要在传递url参数时候,对参数进行安全编码。

HttpServerUtility.UrlTokenEncode 方法

编码:将字节数组编码为使用 64 进制数字并适合在 URL 上传输的等效字符串表示形式。

HttpServerUtility.UrlTokenDecode 方法

接收时候需要解码:将 URL 字符串标记解码为使用 64 进制数字的等效字节数组。

------------------------------------------------------

下面是详细的加密解密代码:

        /// <summary>
        /// 加密
        /// </summary>
        /// <param name="text"></param>
        /// <param name="key">8位的key</param>
        /// <returns></returns>
        public static string DESEncrypt(string text, string key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Mode = System.Security.Cryptography.CipherMode.ECB;
            des.Padding = PaddingMode.Zeros;
            des.Key = ASCIIEncoding.ASCII.GetBytes(key);
            byte[] inputBuffer = Encoding.GetEncoding("UTF-8").GetBytes(text);
            byte[] outputBuffer = des.CreateEncryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
            return Convert.ToBase64String(outputBuffer);
        }
        /// <summary>
        /// 解密
        /// </summary>
        /// <param name="text"></param>
        /// <param name="key">8位的key</param>
        /// <returns></returns>
        public static  string DESDecrypt(string text, string key)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            des.Mode = System.Security.Cryptography.CipherMode.ECB;
            des.Padding = PaddingMode.Zeros;
            des.Key = ASCIIEncoding.ASCII.GetBytes(key);
            byte[] inputBuffer = Convert.FromBase64String(text.Replace(' ', '+'));
            byte[] outputBuffer = des.CreateDecryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
            return Encoding.GetEncoding("UTF-8").GetString(outputBuffer);
        }


已有5条留言

发表评论:

◎欢迎您的参与讨论。