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个字符,它会增加空间。有什么解决方案吗?非常感谢。
base64用户名字符串的末尾用'='填充;当解释URL查询字符串时,这将被忽略。即:
username => "9mQkc5vEebsl2Qg6hbxL+r3KVNhOEsig32oP6eb6rd0="
变为:
username => 9mQkc5vEebsl2Qg6hbxL+r3KVNhOEsig32oP6eb6rd0
在请求处理程序中。
在URL中使用字符串之前,您需要对其进行URL编码。
默认的Base64字符集在Url中使用不安全,尤其是+
(空格)和=
(查询参数的名称/值分隔符)。
您可以使用修改后的集合(手动将某些字符替换为其他字符一次),也可以仔细地对数据进行编码,以确保每个字符都得到保留(尤其是+
,因为ASP.Net将其视为空间)。
有关规范的链接,请参阅维基百科上的Base64,有关PHP中类似问题,请参阅在URL中传递Base64编码的字符串。