【问题标题】:What I am getting "The input is not a valid Base-64 string as it contains a non-base 64 character"我得到的是“输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符”
【发布时间】:2012-09-22 14:57:55
【问题描述】:

我正在使用以下代码加密/解密一些纯文本。

private static string EncryptionKey = "@#$%^&*()2343";    
private static byte[] Salt = Encoding.ASCII.GetBytes(EncryptionKey.Length.ToString()); 

public static string EncryptIt(string Input)    
{    
    RijndaelManaged Cipher = new RijndaelManaged();    
    byte[] TextByteArray = Encoding.Unicode.GetBytes(Input);    
    PasswordDeriveBytes Key = new PasswordDeriveBytes(EncryptionKey, Salt);    

    using (ICryptoTransform Transform = Cipher.CreateEncryptor(Key.GetBytes(32), Key.GetBytes(16)))    
    {        
        using (MemoryStream MS = new MemoryStream())    
        {    
            using (CryptoStream CS = new CryptoStream(MS, Transform, CryptoStreamMode.Write))    
            {    
                CS.Write(TextByteArray, 0, TextByteArray.Length);    
                CS.FlushFinalBlock();    
                return Convert.ToBase64String(MS.ToArray());    
            }    
        }    
    }    
}    

public static string DecryptIt(string Input)    
{    
    RijndaelManaged Cipher = new RijndaelManaged();    
    byte[] EncryptedByteArray = Convert.FromBase64String(Input);    
    PasswordDeriveBytes Key = new PasswordDeriveBytes(EncryptionKey, Salt);    

    using (ICryptoTransform Transform = Cipher.CreateDecryptor(Key.GetBytes(32), Key.GetBytes(16)))    
    {    
        using (MemoryStream MS = new MemoryStream(EncryptedByteArray))    
        {    
            using (CryptoStream cryptoStream = new CryptoStream(MS, Transform, CryptoStreamMode.Read))    
            {    
                byte[] TransformedText = new byte[EncryptedByteArray.Length];    
                int Count = cryptoStream.Read(TransformedText, 0, TransformedText.Length);    
                return Encoding.Unicode.GetString(TransformedText, 0, Count);    
            }    
        }    
    }    
}    

在大多数情况下,此代码可以正常工作。但是,在某些情况下,当我尝试解密加密文本时,在 DecryptIt 方法中调用 byte[] EncryptedByteArray = Convert.FromBase64String(Input) 时会出现以下异常。

输入不是有效的 Base-64 字符串,因为它包含非 base-64 字符、两个以上的填充字符或填充字符中的非空白字符。

知道是什么导致了这个异常。我发现更令人费解的是,为什么这个异常并没有出现在每个案例上,而且只有少数案例。

编辑: 下面是引发异常的 DecryptIt 方法的示例输入。请注意,我在上面的示例中更改了 EncryptionKey 变量的值。

oaOQ6qWWDwWby3C04N7HJAiqQgILBifqdHq4OQ5KDDRA3F2ZlBITu31a8mJJQ8sKn4g3vODFEJbigtNZozv6ockAdsDChhHwaaLL4l8MJPKbV1EiUE3rL30y + XHZ / S1a8mJJQ8sKn4g3vODFEJbigtNZozv6ockAdsDChhHwaaLL4l8MJPKbV1EiUE3rL30y +盎司/ eR9OzXn + 3Lepo0tRqH5BsfvEtJ / IcqRu3gJiIBTMAM0TmVxa2EZSj2mn6jZlgvlOEFCWzNKS3R9OzXn + In1br14venJmpApXyt930khz35UE5BtWn3Fq7jyer6mY2l60P / cI4z P>

【问题讨论】:

  • 请贴出抛出此异常时Input 的值。
  • 输入是一个电子邮件地址和一个带有一些固定文本的 Guid 值。
  • @palmsnow:那不是 base64 值,是吗? Input 的值应该是调用EncryptIt 的结果,它 base64 值。
  • @JonSkeet,PalmSnow - 这是另一个输入。
  • 如果错误只是偶尔发生,则表明 EncryptIt 和 DecryptIt 之间的传输/存储存在错误。

标签: c# encryption base64


【解决方案1】:

您的样本在结尾处带有 2 个额外的“=”,可以完美地反转换。
所以他们在运输中迷路了。

加密文本通过电子邮件在 http 链接中发送。

所以这涉及到 URL 和 HTML 编码?有很大的出错空间。

使用以== 结尾的小字符串运行测试。

【讨论】:

  • 关于将此加密字符串作为 http 链接查询字符串发送时可以做什么的任何建议。整个文本是从 win-form 应用程序通过电子邮件发送的?
  • 我想我可以将 MailMessage 的 BodyEncoding 设置为 System.Text.Encoding.UTF8。你认为这就够了吗?
  • 我认为您应该在 HttpUtility.UrlEncode() 周围显示您的代码,或者您如何创建该 URL。
  • 到目前为止,它通过 string.Format 使用连接字符串完成。我想这可能是它? :)
  • 是的,网址在查询中不喜欢=。但是/ 也不应该很酷。您需要正确的编码和解码。仅 URL,我认为不涉及 HTML。
猜你喜欢
  • 2018-02-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多