1

暗号化したい辞書オブジェクトがあり、それをクエリ文字列に入れてから、反対側で復号化します。

これには JavaScriptSerializer を使用しています。今、同じページのオンロードでこれを試してみましたが、うまくいきました。したがって、使用している暗号化/復号化拡張メソッドは機能しています。これにより、クエリ文字列で何らかの問題が発生していると思われます。

例えば

        var js = new JavaScriptSerializer();
        var d = new Dictionary<string, string>();
        d.Add("ID", "123456");
        d.Add("Name", "HELLO TEST");
        d.Add("Email", "test@email.com");
        var s = js.Serialize(d).EncryptString();
        var ds = js.Deserialize<Dictionary<string, string>>(s.DecryptString());
        @ViewBag.Test = ds["Name"];

上記の例では、EncryptString()DecryptString()は私が使用している拡張メソッドです。これは意図したとおりに機能するため、 の正しい値が引き出され"Name"ます。

シリアル化された暗号化された文字列をクエリ文字列に入れてからデコードしようとすると、問題が発生します。

したがって、最初のページには、次のようなものがあります。

        var js = new JavaScriptSerializer();
        var d = new Dictionary<string, string>();
        d.Add("ID", "123456");
        d.Add("Name", "HELLO TEST");
        d.Add("Email", "test@email.com");
        var s = HttpUtility.UrlEncode(js.Serialize(d).EncryptString());

sその後、クエリ文字列として使用されます。

受信ページには、これがあります:

public ActionResult Display(string r)
{
        var js = new JavaScriptSerializer();
        var decryptedString = HttpUtility.UrlDecode(r).DecryptString();
        var s = js.Deserialize<Dictionary<string, string>>(decryptedString);
        return View();
}

これにより、エラーがスローされます。System.FormatException: Invalid length for a Base-64 char array or string.このエラーは、decryptstring 行で発生します。

何が起こっているのかわかりません...クエリ文字列に入る前にテキストをurlencodingし、デシリアライズする前にurldecodingしています..

編集

それを理解しました..私はそれを2回暗号化していました...

4

2 に答える 2

2

文字列を UrlDecode する必要はない可能性があります。これは、MVC がrパラメーターの値を割り当てる前にそれを行っているためです。r直接復号化してみてください。

そしてもちろん、警告を発する必要があります。あなたがここで行っていることは、非常に悪い考えのように思えます。この暗号化された辞書を URL で送信することによって達成しようとしていることが何であれ、それを達成するためのより良い方法がほぼ確実にあります。

于 2012-04-05T03:03:12.847 に答える
1

ほとんどの場合、一部の文字は期待どおりに往復しません (つまり、この場合、"+" はスペースになる傾向があります)。

Fiddler (またはその他の HTTP デバッグ ツール) で、実際にサーバーとの間で送受信される内容を確認してください。「表示」アクションに来る文字列かどうかを確認するよりも、何が間違っているかがわかります。

于 2012-04-05T03:04:09.587 に答える