ASP.Net中URL中的UrlEncoding Plus(+)

时间:2008-12-24 09:05:47

标签: asp.net url

我正在加密和Base64一个字符串。一切都很好,直到我从QueryString集合中检索加密的字符串。加密文本包含加号。当我检索加密的字符串时,加上一次,现在有一个空格。你可以想象这不会解密。

我已经尝试过Server.HtmlEncode / HtmlDecode和Server.UrlEncode / Server.UrlDecode但无济于事。两种方法都将加号与空格混淆。

有什么想法吗?

以下是类似帖子:QueryString Malformed

修改 我找到了解决方案:Server.UrlEncode确实有效,我正在应用Server.UrlDecode而且也不需要。

2 个答案:

答案 0 :(得分:4)

请注意,将“+++”替换为“==”的方法很危险,因为在极少数情况下,加密查询字符串可能有效地包含“+++”。在这种情况下,解密失败。要更好地解决问题,请查看使用“修改后的base64 for url”。它涉及为“+”切换“ - ”而为“/”切换“_”并且没有“==”填充。它似乎对我们有用,即使在另一个失败的情况下也是如此。以下是我用于参考的链接,对我们有用。

Code for decoding/encoding a modified base64 URL

答案 1 :(得分:1)

几年前我遇到了像你这样的问题。这是我将base64查询字符串解码为字符串的代码,反之亦然

    public static String DoDecryption(String Value)
    {
        Decryptor dec = new Decryptor(EncryptionAlgorithm.TripleDes );
        dec.IV = Encoding.ASCII.GetBytes("funky");
        byte [] DecValue =  Convert.FromBase64String(Value.Replace("+++","=="));
        byte [] DecKey   = Encoding.ASCII.GetBytes("0123456789012345");
        byte [] DecipherValue = dec.Decrypt(DecValue,DecKey);
        return Encoding.ASCII.GetString(DecipherValue);
    }

这是加密部分

    public static String DoEncryption(String Value)
    {
        Encryptor enc = new Encryptor(EncryptionAlgorithm.TripleDes);
        byte [] EncValue =  Encoding.ASCII.GetBytes(Value);
        byte [] EncKey   = Encoding.ASCII.GetBytes("0123456789012345");
        enc.IV = Encoding.ASCII.GetBytes("funky");
        byte [] CipherValue = enc.Encrypt(EncValue,EncKey);
        //InitVector = Encoding.ASCII.GetString(enc.IV);
        return Convert.ToBase64String(CipherValue).Replace("==","+++");
    }

请注意,DoEncryption中的Value参数是要加密到querystring的字符串,而DoDecryption中的value参数是已经转换为base64字符串的查询字符串。

希望有帮助