2012-04-05 1 views
1

状況を説明してください。私のコードでは、登録が完了した後に生成されるstringに変換されたuseridを暗号化しています。 ecrypted文字列は以下のようにurlパラメータとして渡されます。UrlEncodeは+シンボルをエンコードしていませんが、フォーマット例外の復号中です

string ConfirmCode = string.Empty; 
Common.Secure.Security mySec = new Common.Secure.Security(); 
ConfirmCode = mySec.Encrypt(myMember.MemberID.ToString()); 

string EmailValidationLink = "<a href=\'" + pageScheme + "://" + CurrentDomain.HostName + "/Contents/Common/" + "EN" + "/" + CurrentDomain.EmailValidationPage + "?ConfirmCode=" + **UrlEncode(ConfirmCode)** + "\'>Click here to validate your account.</a>"; 

そして:

私は暗号化された文字列を渡すためにURLENCODEを使用していますが、解読が、私は書式の例外を取得していながら、暗号化されたテキストは、「+」記号を持っている場合、問題がありますなぜなら、この '+'記号はスペースとして扱われるからです。

たとえば、暗号化されたテキストが 'S7 + 5tZzTm0k ='のようなものである場合、+シンボルは 'S7 5tZzTm0k ='と解釈され、フォーマット例外が発生します。

私の暗号化と復号化コードが

public string Decrypt(string Text) 
{ 
    if (!ENABLED) return Text; 
    des.Key = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey)); 
    des.Mode = CipherMode.ECB; 
    ICryptoTransform desdencrypt = des.CreateDecryptor(); 
    Byte[] buff = Convert.FromBase64String(Text); 
    return ASCIIEncoding.ASCII.GetString(desdencrypt.TransformFinalBlock(buff, 0, buff.Length)); 
} 

public string Encrypt(string Text) 
{ 
    if (!ENABLED) return Text; 
    des.Key = hashmd5.ComputeHash(ASCIIEncoding.ASCII.GetBytes(myKey)); 
    des.Mode = CipherMode.ECB; 
    ICryptoTransform desdencrypt = des.CreateEncryptor(); 
    ASCIIEncoding MyASCIIEncoding = new ASCIIEncoding(); 
    Byte[] buff = ASCIIEncoding.ASCII.GetBytes(Text); 
    return Convert.ToBase64String(desdencrypt.TransformFinalBlock(buff, 0, buff.Length)); 
} 

以下のように私はこれについてグーグルでされていて、誰もがURLENCODEを使用して問題を解決するだろうことを示唆しているが、私の場合にも、使用した後、それが問題を解決していません。

どうすればいいですか?

if (Request.QueryString["ConfirmCode"] != null) 
      { 
       bool isAccountSuspended; 
       isAccountSuspended = AccountManagement.AcountManager.EmailValidationNote(HttpContext.Current.Server.UrlDecode(Request.QueryString["ConfirmCode"])); 

       if (!isAccountSuspended) 
       { 
        lblMessage.Text = "Your account is already suspended. Please contact customer service."; 
        lblMessage.ForeColor = System.Drawing.Color.Red; 
       } 
       else 
       { 
        lblMessage.Text = "Thank you for verifying your email address. We hope you’ll enjoy playing with us."; 
       } 
      } 

よろしく Srividhya

+0

あなたは 'UrlEncode'のコードを投稿できますか? – Oded

+0

あなたの 'UrlEncode'メソッドは' HttpUtility.UrlEncode'を呼び出していますか? 'HttpUtility.Url * Decode *'メソッドは '+'を ''に置き換えますが、 'HttpUtility.UrlEncode'は使用しないでください。 – drf

+1

実際、.NET Frameworkライブラリの標準UrlEncodeメソッドを使用していますか?もしそうでなければ、あなたはすべきです。 –

答えて

0

あなたは、単にpercent encoding+の出現をすべて置き換えることができます - %2B

UrlEncode(ConfirmCode).Replace("+", "%2B") 
+0

URLENCODE後の私が取得値です。 :) –

+0

@PetrAbdulin - そうでしょう。何らかの理由で、OPが使用している 'UrlEncode'呼び出しはしません。 – Oded

+0

それは私の質問だった..なぜUrlEncodeはそれをやっていないのですか?もしそれがしなければならないのですか? UrlDecodeため – Vidya

0

OK、あなたと他のコメントと回答からすべての与えられたデータから、私は唯一の可能な論理的な結論に来ている:あなたのURLエンコードされた文字列が二回デコードされます。 S7%2B5tZzTm0k%3Dの最初のデコードではS7+5tZzTm0k=、2番目のデコードではS7 5tZzTm0k=となります。文字列が2回デコードされた場所を検出するのは慎重なデバッグだけです。

P.S. が2回の値をエンコードすることを確認する方法として、正しくデコードされます。 2回エンコードされたURLの値はS7%252B5tZzTm0k%253Dである必要があります。

+0

コードは、この – Vidya

+0

ようになり、私はalook – Vidya

+0

上UrlDecodeのコードを参照してください。 – Vidya

0

ちょっと見て、私はRequest.QueryStringがクエリーストリングにあるもののデコードされたバージョンをあなたに与えて+バージョンのものを与えてくれると信じています。

を変更し、次の

isAccountSuspended = AccountManagement.AcountManager.EmailValidationNote(Request.QueryString["ConfirmCode"]); 

へ行(すなわちデコードを削除)し、それが動作するはずです。

+0

私はこれを試しましたが..下記を参照してください... string ConfirmCode = Request.QueryString ["ConfirmCode"]; isAccountSuspended = AccountManagement.AcountManager.EmailValidationNote(ConfirmCode);しかしそれでも問題は解決しないままです。 – Vidya

+0

'ConfirmCode'には何が含まれていますか? –

+0

'Request.QueryString [" ConfirmCode "]'の値は何ですか?あなたが 'ConfirmCode = S7%2b5tZzTm0k%3d'で渡しているなら、それはあなたが望むものでなければなりません。別の場所から例外を取得している可能性はありますか? – Chris

0

これは投機的ですが、UrlDecodeを同じ文字列に2回コールしている可能性があります。

URLの値がConfirmCode=S7%2b5tZzTm0k%3dであることを示しましたが、これは正しいです(%2bは '+'の正しいエンコード)。

あなたは一度、この文字列をデコードする場合、期待どおり、あなたは、S7+b5tZTm0k=を取得します。

文字列にデコードすると、 '+'が ''としてデコードされるため、S7 b5tZTm0k=が得られます。これはあなたが見ているものです。

あなたは結果の文字列は一度だけデコードされていることを確認するためにあなたのデコードロジックを通して見てみたいことがあります。

+0

Request.QueryString [" ConfirmCode "]の値を保存するとURLが "Content/Common/EN/EmailValidationPage.aspx?ConfirmCode = S7 + 5tZzTm0k ="ここにurlであることを確認してください... ConfirmCodeが正しく渡されています – Vidya

0

必須ディレクティブの使用:System.Security.Cryptographyを使用する必要があります。

Way to encrypt: HttpUtility.UrlEncode(Encrypt(Value)); 

例:文字列値= HttpUtility.UrlEncode(暗号化(値))。

Way to decrypt: Decrypt(HttpUtility.UrlDecode(value); 

private string Encrypt(string clearText) 
{ 
    string EncryptionKey = "MAKV2SPBNsdsI99212"; 
    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; 
} 
private string Decrypt(string cipherText) 
{ 
    string EncryptionKey = "MAKV2SPBNsdsI99212"; 
    cipherText = cipherText.Replace(" ", "+"); 
    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; 
} 
関連する問題