Korzystam z następującego kodu do zaszyfrowania/odszyfrowania kwerendy i przekazania go z jednej strony na drugą. Wynikowi brakuje "+" (patrz na dole pytania). Co mogę zrobić, aby upewnić się, że pojawia się znak "+", ponieważ korzystam już z urlencode/urldecode?Szyfrowanie i odszyfrowywanie wartości kwerendy przy użyciu AES 256
// Encryption strona
protected void Page_Load(object sender, EventArgs e)
{
string text = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
Response.Write("256:" + Decrypt256(Encrypt256(text)));
Response.Write(string.Format("<br/><a href=\"decrypt.aspx?p={0}\">{0}</a>", HttpUtility.UrlEncode(Encrypt256(text))));
}
private const string AesIV256 = @"!QAZ2WSX#EDC4RFV";
private const string AesKey256 = @"5TGB&YHN7UJM(IK<5TGB&YHN7UJM(IK<";
private string Encrypt256(string text)
{
// AesCryptoServiceProvider
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 256;
aes.IV = Encoding.UTF8.GetBytes(AesIV256);
aes.Key = Encoding.UTF8.GetBytes(AesKey256);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// Convert string to byte array
byte[] src = Encoding.Unicode.GetBytes(text);
// encryption
using (ICryptoTransform encrypt = aes.CreateEncryptor())
{
byte[] dest = encrypt.TransformFinalBlock(src, 0, src.Length);
// Convert byte array to Base64 strings
return Convert.ToBase64String(dest);
}
}
/// <summary>
/// AES decryption
/// </summary>
private string Decrypt256(string text)
{
// AesCryptoServiceProvider
AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
aes.BlockSize = 128;
aes.KeySize = 256;
aes.IV = Encoding.UTF8.GetBytes(AesIV256);
aes.Key = Encoding.UTF8.GetBytes(AesKey256);
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
// Convert Base64 strings to byte array
byte[] src = System.Convert.FromBase64String(text);
// decryption
using (ICryptoTransform decrypt = aes.CreateDecryptor())
{
byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
return Encoding.Unicode.GetString(dest);
}
}
strona deszyfrowania (używam tej strony, aby wydrukować to, co Ja rozszyfrował ciąg od pierwszej strony, a następnie porównać je co otrzymuję w adresie URL:
protected void Page_Load(object sender, EventArgs e)
{
string urlValue = HttpUtility.UrlDecode(Request.QueryString["p"].Trim());
Decrypt256(Encoding.ASCII.GetString(s2));
Response.Write(urlValue + "<br /><br />");
Response.Write("AUwsHc8j/llULnuwVnspNwolBUAhl5GFqC6iOrUN5euZFrOgFVypqTGfhAaooLxa0Fko+9KGtRh3UcQJtzkfSw==");
}
Końcowym wynikiem są następujące dwa wiersze (pierwszy wiersz jest wynikiem z adresu URL) .Bardzo pasują do siebie oprócz pierwszego adresu URL (zakodowany/dekodowany wynik zapytania) brakuje symbolu "+" .Dowolny pomysł, jak uniknąć to?
AUwsHc8j/llULnuwVnspNwolBUAhl5GFqC6iOrUN5euZFrOgFVypqTGfhAaooLxa0Fko 9KGtRh3UcQJtzkfSw ==
AUwsHc8j/llULnuwVnspNwolBUAhl5GFqC6iOrUN5euZFrOgFVypqTGfhAaooLxa0Fko + 9KGtRh3UcQJtzkfSw ==
Dodano przykładowy kod. – Dkong
Sprawdź tę odpowiedź dotyczącą przechodzenia łańcuchów zakodowanych w base64 w ciągach zapytań: http://stackoverflow.com/questions/1374753/passing-base64-encoded-str-in-url –
Przez by, 'AesCryptoServiceProvider' implementuje' IDisposable' interfejs, więc jego użycie powinno być również opakowane w blok '' '' do właściwego deterministycznego usuwania zasobów. –