Тройной DES без использования прямой или обратной косой черты

Можно ли модифицировать тройной DES, чтобы не включать прямую и обратную косую черту при шифровании/дешифровании?

У меня была эта ссылка на mvc, которая работает без шифрования, однако, когда я пытался зашифровать идентификатор, переданный методу контроллера, идентификатор был зашифрован и включал несколько косых черт (/vO5Ppr4+Phzx+lHD4Jp6JubZlYXK0Az9OA9J8urf+MJFw62c3Y0Q/Q==), поэтому я получаю 404 не найден, а метод контроллера не вызываются.

Ссылка на действия MVC:

<span> | </span> @Html.ActionLink("Student Rights", "StudentRights","Threads", new { id = CommonLayer.Securities.Encryption.EncryptTripleDES(item.ID) }, null)

Метод шифрования:

private static byte[] KEY_192 = 
        {
            111,21,12,65,21,12,2,1,
            5,30,34,78,98,1,32,122,
            123,124,125,126,212,212,213,214
        };

    private static byte[] IV_192 = 
        {
            1,2,3,4,5,12,13,14,
            13,14,15,13,17,21,22,23,
            24,25,121,122,122,123,124,124
        };

    /// <summary>
    /// Encrypt using TripleDES
    /// </summary>
    /// <param name="vl">String to Encrypt</param>
    /// <returns>Encrypted String</returns>
    public static String EncryptTripleDES(String vl)
    {
        if (vl != "")
        { 
            TripleDESCryptoServiceProvider cryptoprovider = new TripleDESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, cryptoprovider.CreateEncryptor(KEY_192, IV_192), CryptoStreamMode.Write);
            StreamWriter sw = new StreamWriter(cs);
            sw.Write(vl);
            sw.Flush();
            cs.FlushFinalBlock();
            ms.Flush();
            return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        } 
        return "";
    } 

    /// <summary>
    /// Decrypt using TripleDES
    /// </summary>
    /// <param name="vl">String to Decrypt</param>
    /// <returns>Decrypted String</returns>
    public static String DecryptTripleDES(String vl)
    { 
        if (vl != "")
        { 
            TripleDESCryptoServiceProvider cryptoprovider = new TripleDESCryptoServiceProvider();
            Byte[] buffer = Convert.FromBase64String(vl);
            MemoryStream ms = new MemoryStream(buffer);
            CryptoStream cs = new CryptoStream(ms, cryptoprovider.CreateDecryptor(KEY_192, IV_192), CryptoStreamMode.Read);
            StreamReader sw = new StreamReader(cs);
            return sw.ReadToEnd();
        } 
        return "";
    }

person rikket    schedule 25.05.2014    source источник
comment
Этот вопрос вообще не имеет ничего общего с шифрованием. Это о том, как поместить строку с косой чертой в URL-адрес с помощью ASP.NET MVC.   -  person usr    schedule 25.05.2014
comment
возможный дубликат Требуется шифрование /decryption не содержит символа «/» в зашифрованной строке   -  person CodesInChaos    schedule 25.05.2014


Ответы (3)


Как предлагает Оулстед, используйте безопасную для URL кодировку Base64, описанную в RFC 4648.

Моя реализация производит немного мусора, но для коротких строк это не должно иметь большого значения, если вы не вызываете это миллион раз в секунду.

public static string ToUrlSafeBase64(byte[] bytes)
{
    return Convert.ToBase64String(bytes).Replace('+', '-').Replace('/', '_').Replace("=","");
}

public static byte[] FromUrlSafeBase64(string s)
{
    while (s.Length % 4 != 0)
        s += "=";
    s = s.Replace('-', '+').Replace('_', '/');
    return Convert.FromBase64String(s);
}

Используется в качестве:

var str = ToUrlSafeBase64(bytes);

var bytes = FromUrlSafeBase64(str);
person CodesInChaos    schedule 25.05.2014

Это не результат 3DES, это кодирование случайных (выглядящих) двоичных данных в Base 64.

Вы можете просто (необработанно) URL-кодировать результат или заменить символ любым другим. Посетите страницу Base 64 в Википедии, чтобы найти идеи. Старайтесь придерживаться общих стандартов, таких как замена + на - и замена / на _ в соответствии со стандартом RFC 4648.

Вы также можете удалить символы = в конце. Это работает, если ваша библиотека base 64 может декодировать такое base 64, в противном случае вы можете просто добавить их снова, пока не получите строку, кратную 4 символам base 64.

person Maarten Bodewes    schedule 25.05.2014
comment
Я не понял вашего ответа. Как я могу применить свой метод? - person rikket; 25.05.2014

следующие функции работали над другим сообщением -encode-добавление-косой черты-в-результате

function mybase64_encode($s) {
    return str_replace(array('+', '/'), array(',', '-'), base64_encode($s));
}


function mybase64_decode($s) {
    return base64_decode(str_replace(array(',', '-'), array('+', '/'), $s));
}
person keiv.fly    schedule 25.05.2014
comment
как я могу применить это к моему методу? - person rikket; 25.05.2014
comment
Не рекомендуется придумывать ещё другую кодировку, вместо этого лучше использовать кодировку RFC 4648. - person Maarten Bodewes; 25.05.2014
comment
Функции написаны на PHP. вам нужно изменить их на С#. На самом деле они означают, что вы заменяете «+» на «,» и «/» на «-», которые действительны в URL-адресах. А затем заменить обратно, когда вы делаете декодирование. Convert.ToBase64String — это base64encode, а Convert.FromBase64String — это base64decode. Сейчас нет времени писать их на C#. - person keiv.fly; 25.05.2014
comment
@ keiv.fly Эта жалоба на плагиат нелепа. Предложение Оулстеда по использованию безопасного алфавита URL из 4648 является стандартным решением проблемы. Вы можете предположить, что он уже был знаком с этим подходом и не понял его из вашего поста. И прежде чем вы также обвините меня в плагиате, проверьте мой ответ на Нужен метод шифрования/дешифрования не имеет '/' в зашифрованном строка старше года. - person CodesInChaos; 25.05.2014
comment
Кроме того, все это, я даже не минусовал. Я думал, что ответ был достаточно близким и практичным в использовании, но не соответствующим стандартам. - person Maarten Bodewes; 25.05.2014
comment
@CodesInChaos Неправда, мне почти никогда не приходилось сталкиваться с проблемами кодирования/декодирования в отношении криптографии и шифрование: P - person Maarten Bodewes; 25.05.2014
comment
@owlstead Извините, я думал, вы заминусовали меня. Если вы не понизили меня, то все в порядке. Прости еще раз. - person keiv.fly; 25.05.2014