【问题标题】:Invalid length for a Base-64 char array during decoding/decryption解码/解密期间 Base-64 字符数组的长度无效
【发布时间】:2010-12-29 15:13:45
【问题描述】:

问:我面临以下大问题:

我不时发现以下异常:

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://stackoverflow.com/a/10879400/418343

【问题讨论】:

  • 一个常见的问题是错误地从字符串末尾剥离填充(尾随等号)。在您的情况下,“=3d”可能应该只是“=”或者“==”
  • 没有回答你的问题,但这是一种非常糟糕的加密方式 - 听起来你和 gawker 做同样的事情。您仅使用前 8 个字符作为密钥,并使用 DES(过时的加密标准)请参阅 codinghorror.com/blog/2010/12/…
  • 附注:Encoding.UTF8.GetBytes 是从密码中获取密钥的一种非常糟糕且不安全的方式。
  • 看起来@EricLaw 是正确的,因为它应该是==。这个 base64 字符串是从查询字符串中收集的吗? %3D= 的 URL 编码形式,所以看起来你的问题在于 URL 编码
  • 看看stackoverflow.com/questions/2925729/…。对于 Base64,该值应该是 4 的倍数

标签: c# .net asp.net encryption


【解决方案1】:

要解决你需要先编码然后解码所有准备好的encode-base64字符串的问题,取决于你在哪里使用它。

例如,如果您在 url(或查询)上使用它,这可能是您要使用的地方,那么您需要在使用它之前对 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));
}

ps 我有同样的问题,并尝试如你所说替换'+'和其他,但最后这就是让它起作用的原因。

不要忘记从代码中删除 text = text.Replace(" ", "+") 和其他加密操作,只需加密和解密即可。

【讨论】:

  • 字符串来自查询字符串..你的方法是否仍然做我想做的事
  • 对不起,我有点困惑,你能告诉我在我的代码中在哪里调用这些方法吗?提前谢谢
  • @just_name,我所说的加密/解密函数是你的函数。现在在您的代码上,您调用 Encrypt/Decrypt,调用 encodeSTROnUrl/decodeSTROnUrl。
  • 好的,非常感谢...我会试试你的方法,我希望确实能解决这个问题。
  • @just_name 不,这不是一个长数字,实际上一定是你的问题。
【解决方案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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 2011-02-24
    相关资源
    最近更新 更多