解密/解码期间Base-64字符数组长度无效

13

问:我遇到了以下大问题:

我时不时会遇到以下异常:

Base-64 字符数组的长度无效。

我使用加密和解密:

public static string Encrypt(string text)
        {

            try
            {
                key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                Byte[] byteArray = Encoding.UTF8.GetBytes(text);
                MemoryStream memoryStream = new MemoryStream();
                CryptoStream cryptoStream = new CryptoStream(memoryStream,des.CreateEncryptor(key, IV), CryptoStreamMode.Write);
                cryptoStream.Write(byteArray, 0, byteArray.Length);
                cryptoStream.FlushFinalBlock();
                return Convert.ToBase64String(memoryStream.ToArray());
            }

            catch (Exception ex)
            {
              string message =  ex.Message;
            }

            return string.Empty;
        }



        public static string Decrypt(string text)
        {
            try
            {
                key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8));
                DESCryptoServiceProvider des = new DESCryptoServiceProvider();
                text = text.Replace(" ", "+")
                Byte[] byteArray = Convert.FromBase64String(text);
                MemoryStream memoryStream = new MemoryStream();
                CryptoStream cryptoStream = new CryptoStream(memoryStream,
                des.CreateDecryptor(key, IV), CryptoStreamMode.Write);
                cryptoStream.Write(byteArray, 0, byteArray.Length);
                cryptoStream.FlushFinalBlock();
                return Encoding.UTF8.GetString(memoryStream.ToArray());
            }

            catch (Exception ex)
            {
                string message = ex.Message;

            } 

我阅读了许多关于这个问题的文章,有些帖子提到的解决方法是:

text = text.Replace(" ", "+") 但这并没有解决我的问题。

我的字符串是:3DZF/NZpp0yuQ=3D 请帮我解决这个问题。

编辑

  • 如果有任何修改或增强此类以使其更好地工作、更安全或避免任何可能出现的问题,我将不胜感激。
  • 如果有替代类别而不是这个,更加安全且不会出现这些问题,我将不胜感激。
  • 我在一个用于验证电子邮件的小应用程序中使用这个类。

编辑:

Decoding the querystring values is done already when it's parsed into the Request.

https://dev59.com/hmTWa4cB1Zd3GeqPEpJV#10879400


2
一个常见的问题是错误地从字符串末尾删除填充(尾随等号)。在你的情况下,"=3d" 可能应该简单地变成 "=" 或者可能是 "=="。 - EricLaw
2
不是回答你的问题,但这是一种非常糟糕的加密方式 - 听起来你正在做与gawker相同的事情。你只使用前8个字符作为密钥,并使用DES(一种过时的加密标准)。请参阅http://www.codinghorror.com/blog/2010/12/the-dirty-truth-about-web-passwords.html。 - Nick Fortescue
一个小提示:Encoding.UTF8.GetBytes 是从密码获取密钥的一种非常糟糕和不安全的方式。 - H H
1
看起来@EricLaw是正确的,应该是==。这个base64字符串是从查询字符串中获取的吗?%3D= 的URL编码形式,所以你的问题似乎出在URL编码上。 - John Rasch
1
请查看https://dev59.com/vnA85IYBdhLWcg3wJf4Z。对于Base64,值应该是4的倍数。 - LCJ
显示剩余2条评论
2个回答

19

为了解决这些问题,你需要先对已经进行过base64编码的字符串进行解码操作,具体方式要根据使用场景来确定。

例如,如果你将其用于URL(或查询)中,那么你需要在使用之前对URL进行编码,获取之后再进行解码操作。这是因为你需要避免混淆URL使用的字符编码与加密字符编码。

无论如何,下面是可以解决问题的代码(我出于同样的原因使用它):

public static string encodeSTROnUrl(string thisEncode)
{
    if (null == thisEncode)
        return string.Empty;

    return HttpUtility.UrlEncode(Encrypt(thisEncode));
}


public static string decodeSTROnUrl(string thisDecode)
{
    return Decrypt(HttpUtility.UrlDecode(thisDecode));
}

我也遇到了相同的问题,尝试了你说的替换'+'和其他字符,但最终使其正常工作的是不要忘记从代码中删除text = text.Replace(" ", "+")以及其他加密处理,只需要进行加密和解密操作。


这个字符串来自查询字符串...你的方法仍然能做我想做的事吗? - Anyname Donotcare
抱歉,我有点困惑,请问您能告诉我在代码中应该在哪里调用这些方法吗?谢谢。 - Anyname Donotcare
@just_name,我调用的加密/解密函数是你的函数。现在在你的代码中,你不再调用Encrypt/Decrypt函数,而是调用encodeSTROnUrl/decodeSTROnUrl函数。 - Aristos
@Aristos:非常感谢,但是当我尝试加密(7200406)时,我遇到了相同的异常,这是因为它是一个长数字还是其他原因? - Anyname Donotcare
1
@just_name 不,这不是一个长数字,实际上可能有其他问题。 - Aristos
显示剩余2条评论

-2
string imag = img;
imag = imag.Replace("\", "");
int c = imag.Length % 4;
if ((c) != 0)
    imag = imag.PadRight((imag.Length + (4 - c)), "=");
[] converted = Convert.FromBase64String(imag);
using (System.IO.MemoryStream vstream = new System.IO.MemoryStream(converted)) {
    return Image.FromStream(vstream);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接