我得到的“输入不是有效的Base-64字符串,因为它包含一个非基础64字符”

时间:2012-10-01 18:16:08

标签: c# encryption base64

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

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);    
            }    
        }    
    }    
}    

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

  

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

知道可能导致此异常的原因。我发现更令人费解的是,为什么不会在每个案例和少数情况下抛出这种情况。

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

  

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

1 个答案:

答案 0 :(得分:1)

你的样本在最后用2个额外的'='完美地转换 所以在某个地方他们在运输途中迷路了。

  

ecrypted文本通过电子邮件发送到http链接。

那么这涉及到URL和HTML编码吗?充满错误的空间。

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