UrlEncoding Plus (+) в URL в ASP.Net - PullRequest
       15

UrlEncoding Plus (+) в URL в ASP.Net

3 голосов
/ 24 декабря 2008

Я шифрую и Base64 строку. Все отлично работает, пока я не получу зашифрованную строку из коллекции QueryString. Зашифрованный текст содержит символ плюс. Когда я получаю зашифрованную строку, где когда-то был плюс, теперь есть пробел. Как вы можете себе представить, это не расшифровывается.

Я пробовал оба Server.HtmlEncode / HtmlDecode и Server.UrlEncode / Server.UrlDecode безрезультатно. Оба метода путают символ плюс с пробелом.

Есть идеи?

Вот похожий пост: QueryString Malformed

Edit: Я нашел решение: Server.UrlEncode работает, я применял Server.UrlDecode и мне тоже не нужно.

Ответы [ 2 ]

4 голосов
/ 03 сентября 2009

Будьте осторожны, метод замены "+++" на "==" опасен, поскольку в редких случаях зашифрованная строка запроса может корректно содержать "+++". В этом случае расшифровка не удалась. Для лучшего решения проблемы посмотрите на использование «модифицированного base64 для URL». Он включает в себя переключение "-" для "+" и "_" для "/" и не имеет заполнения "==". Похоже, это работает для нас, даже в ситуациях, когда другие не удалось. Вот ссылка, которую я использовал для справки, которая работает для нас.

Код для декодирования / кодирования модифицированного URL base64

1 голос
/ 24 декабря 2008

У меня были проблемы, как у вас несколько лет назад. Вот мой код для декодирования строки запроса 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("==","+++");
    }

Обратите внимание, что параметр Value в DoEncryption - это строка, которую вы хотите зашифровать в строку запроса, а параметр value в DoDecryption - строка запроса, которая уже преобразуется в строку base64.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...