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

本文关键字:无效 错误 字符 数组 Base-64 | 更新日期: 2023-09-27 18:29:03

正如标题所说,我得到了:

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

所以我正在做的是,我使用以下方法构建要发送的电子邮件:

smsg += "<br><b>To complete your registration, verify your email</b>" + "<a href=" + siteurl + "?usenamw=" + Encrypt(username.Trim()) + "><br>HERE!</a>";

Encrypt方法如下所示:

private static string Encrypt(string clearText)
{
    string EncryptionKey = "MAKV2SPBNI99212";
    byte[] clearBytes = Encoding.Unicode.GetBytes(clearText);
    using (Aes encryptor = Aes.Create())
    {
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
        encryptor.Key = pdb.GetBytes(32);
        encryptor.IV = pdb.GetBytes(16);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write))
            {
                cs.Write(clearBytes, 0, clearBytes.Length);
                cs.Close();
            }
            clearText = Convert.ToBase64String(ms.ToArray());
        }
    }
    return clearText;
}

以下是HTML在hotmail中的样子:

http://localhost:30850/Activation.aspx?username=9mQkc5vEebsl2Qg6hbxL+r3KVNhOEsig32oP6eb6rd0=

在接收端,Activation.aspx.cs页面有一行:

String username = Request.QueryString["username"].ToString();
    Label1.Text = Decrypt(username);

还有解密方法:

private string Decrypt(string cipherText)
{
    string EncryptionKey = "MAKV2SPBNI99212";
    byte[] cipherBytes = Convert.FromBase64String(cipherText);
    using (Aes encryptor = Aes.Create())
    {
        Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(EncryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 });
        encryptor.Key = pdb.GetBytes(32);
        encryptor.IV = pdb.GetBytes(16);
        using (MemoryStream ms = new MemoryStream())
        {
            using (CryptoStream cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write))
            {
                cs.Write(cipherBytes, 0, cipherBytes.Length);
                cs.Close();
            }
            cipherText = Encoding.Unicode.GetString(ms.ToArray());
        }
    }
    return cipherText;
}

所以基本上,当我输入用户名时,比如Jonathan,在接收端标签上显示Jonathan没有问题。然而,如果我输入任何不是4的倍数的东西,我就会出错。我知道Base64需要4的倍数,如果它有7个字符,它会增加空间。有什么解决方案吗?非常感谢。

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

base64用户名字符串的末尾用'='填充;当解释URL查询字符串时,这将被忽略。即:

username => "9mQkc5vEebsl2Qg6hbxL+r3KVNhOEsig32oP6eb6rd0="

变为:

username => 9mQkc5vEebsl2Qg6hbxL+r3KVNhOEsig32oP6eb6rd0

在请求处理程序中。

在URL中使用字符串之前,您需要对其进行URL编码。

默认的Base64字符集在Url中使用不安全,尤其是+(空格)和=(查询参数的名称/值分隔符)。

您可以使用修改后的集合(手动将某些字符替换为其他字符一次),也可以仔细地对数据进行编码,以确保每个字符都得到保留(尤其是+,因为ASP.Net将其视为空间)。

有关规范的链接,请参阅维基百科上的Base64,有关PHP中类似问题,请参阅在URL中传递Base64编码的字符串。