2014-02-04 3 views
0

Я работаю над программой шифрования C#, и я в значительной степени с ней справился.C# string encoding using ToBase64String

Он шифрует и расшифровывает строку, которую я передаю в качестве аргумента.

Единственная проблема заключается в том, что когда я сравниваю эквивалентную программу шифрования Java, я замечаю, что C# преобразует шестнадцатеричные символы специальных символов.

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

Ниже приведен пример

Java:

4g8LAQXy%2B1M%3D 

C#:

4g8LAQXy+1M= 

Как вы можете видеть, '+' в шестнадцатеричном является 2B и '=' в гекс 3D.

+5

Я надеюсь, что вы не используете Base64 в качестве схемы шифрования – DGibbs

+0

% не должна появляться на выходе Base64, результат Java выглядит URL закодирован? От куда это? –

+1

Чтобы пометить на @DGibbs, Base64 не шифрует - это кодирование. Base64 не лучше открытого текста. Просто хочу убедиться, что это было ясно. – longofest

ответ

1

Это выглядит как url% encoding, а не base-64; вы пробовали HttpUtility.UrlEncode()?

string s = "4g8LAQXy+1M="; 
string t = HttpUtility.UrlEncode(s); // 4g8LAQXy%2b1M%3d 
+0

@user этот метод полностью возвращается к 2.0 - просто добавьте ссылку на System.Web.dll; или же просто написать его самостоятельно - это довольно тривиально (мы используем пользовательский, IIRC) –

+0

Есть ли способ для% 2b быть% 2B? то же самое для% 3d – Wilson

+0

@user хорошо, в url-encode они идентичны. Вы можете вручную перевернуть кодировку, но в основном «проверьте белый список, проверьте, не находится ли он за пределами диапазона ascii, если так, utf-8 кодирует и кодирует шестнадцатеричный код –