解密时 Base-64 字符数组长度无效。

4

在某些情况下(解密时),我会遇到以下异常,并且无法确定确切的原因:

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

我的代码:

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

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


// string thisDecode = "3Dn%2bsJJPXprU4%3d"; //this is the value which cause the exception.
public static string decodeSTROnUrl(string thisDecode)
{
   return Decrypt(HttpUtility.UrlDecode(thisDecode));
}


QueryStringEncryption.Cryptography.decodeSTROnUrl(Request.QueryString["val"].ToString());

抛出异常的确切代码行为:

 Byte[] byteArray = Convert.FromBase64String(text);

我曾尝试在加密和解密操作前后进行编码和解码来解决这个问题,但仍有一些值会引发异常。


注意:我注意到了一些奇怪的行为: 发送到我的邮件中作为查询字符串的ID是:n%2bsJJPXprU4%3d,它可以正常工作而没有异常发生。

而那个出现问题的用户所发送的URL包含了3Dn%2bsJJPXprU4%3d

这是浏览器问题吗?!


你能否发布加密解密的整个代码?很可能在两者之间进行了一些不适当的编码转换(ASCII、Unicode)。 - vgru
此链接中的全部代码: https://dev59.com/Fm455IYBdhLWcg3wFP9u - Anyname Donotcare
2个回答

8

当请求被解析时,查询字符串的值已经被解码了。尝试不使用'HttpUtility.UrlDecode'。

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

谁会想到,这对我来说是解决方案!谢谢@Damith! - JCisar

4
64位编码在字符串中存在空格问题。 尝试在加密后添加以下内容。
sEncryptedString = sEncryptedString.Replace(' ', '+');

除非空格和加号对于OP来说代表相同的字符,否则这不是正确的解决方案。 - vgru
@just_name,更新了回复,我记错了。你需要在解密之前改变加密结果...或者更好的方法是在解密之前。 - Blachshma
3
重点不是避免异常,而是解码你最初编码的确切字符串,而这样做是不行的。 - vgru

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