2015-02-19 12 views
5

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 ==

+0

Dodano przykładowy kod. – Dkong

+0

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 –

+1

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. –

Odpowiedz

4

ok stałe, po prostu usunąć ten sposób urldecode. Wydaje się, że dekodowanie odbywa się automatycznie.

+0

Myślałem o tej odpowiedzi, ale nie mogłem wykryć dodatkowej metody dekodowania .... –

Powiązane problemy