[英]Invalid character in a Base-64 string when Concatenating and Url encoding a string
我正在嘗試編寫一些通過Url傳遞的加密代碼。 為了解決這個問題,我排除了數據的實際加密,只顯示了導致問題的代碼。
我取一個鹽值,將其轉換為字節數組,然后將其轉換為base64字符串。 我將此字符串連接到另一個base64字符串(以前是字節數組)。
然后對這兩個base64字符串進行Url編碼。 這是我的代碼...
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;
using System.Web;
class RHEncryption
{
private static readonly Encoding ASCII_ENCODING = new System.Text.ASCIIEncoding();
private static readonly string SECRET_KEY = "akey";
private static string md5(string text)
{
return BitConverter.ToString(new MD5CryptoServiceProvider().ComputeHash(ASCII_ENCODING.GetBytes(text))).Replace("-", "").ToLower();
}
public string UrlEncodedData;
public RHEncryption()
{
// encryption object
RijndaelManaged aes192 = new RijndaelManaged();
aes192.KeySize = 192;
aes192.BlockSize = 192;
aes192.Mode = CipherMode.CBC;
aes192.Key = ASCII_ENCODING.GetBytes(md5(SECRET_KEY));
aes192.GenerateIV();
// convert Ivector to base64 for sending
string base64IV = Convert.ToBase64String(aes192.IV);
// salt value
string s = "maryhadalittlelamb";
string salt = s.Substring(0, 8);
// convert to byte array
// and base64 for sending
byte[] saltBytes = ASCII_ENCODING.GetBytes(salt.TrimEnd('\0'));
string base64Salt = Convert.ToBase64String(saltBytes);
//url encode concatenated base64 strings
UrlEncodedData = HttpUtility.UrlEncode(base64Salt + base64IV, ASCII_ENCODING);
}
public string UrlDecodedData()
{
// decode the url encode string
string s = HttpUtility.UrlDecode(UrlEncodedData, ASCII_ENCODING);
// convert back from base64
byte[] base64DecodedBytes = null;
try
{
base64DecodedBytes = Convert.FromBase64String(s);
}
catch (FormatException e)
{
Console.WriteLine(e.Message.ToString());
Console.ReadLine();
}
return s;
}
}
如果再調用UrlDecodedData方法, 則會得到一個
Base-64字符串中的無效字符
例外。 這是因為base64Salt變量包含無效字符(我猜是行終止符),但似乎無法將其剝離。
更新1
自發布以來我發現的一件事是,如果我更改要編碼的字符串的順序,則不會引發異常。 因此,從更改以下代碼
UrlEncodedData = HttpUtility.UrlEncode(base64Salt + base64IV, ASCII_ENCODING);
至
UrlEncodedData = HttpUtility.UrlEncode(base64IV + base64Salt, ASCII_ENCODING);
似乎可以正常工作,很遺憾,由於此信息已傳遞給第三方組件,因此我無法重新排序。
這是您的問題:
UrlEncodedData = HttpUtility.UrlEncode(base64Salt + base64IV, ASCII_ENCODING);
...
string s = HttpUtility.UrlDecode(UrlEncodedData, ASCII_ENCODING);
base64DecodedBytes = Convert.FromBase64String(s);
您要連接兩個Base64編碼的字符串,然后嘗試對組合進行Base64解碼。 僅當base64Salt
是6位的倍數base64Salt
有效,在您的情況下不是6位的倍數。 不是這么多的數據將以結尾的'='字符進行Base64編碼,將其連接起來會將'='放在字符串的中間,這不是有效的Base64字符串。
您必須先對原始數據進行分類,然后再對其進行編碼。 僅當您知道原始數據長度時,這才起作用。 如果不這樣做,則必須分別對salt和vector進行編碼,然后將它們分類為URL; 例如http:// yoursite / yourPage?salt = mcMDaw%20VUsZX&iv = VUsZXyg6n61e6SavmMrtAWa0A
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.