строка в байтовый массив (в строку в XML) и обратно

я знаю, что есть 1 миллион вопросов о преобразовании «строка в байтовый массив», но ни один из них не подходит для моей проблемы.

Для установки моего программного обеспечения мне нужно сохранить некоторую информацию от пользователя (адрес сервера, идентификатор пользователя, пароль и т. д.). Некоторые из этих данных должны быть защищены (зашифрованы с помощью DPAPI). Для этого мне нужно преобразовать string (SecureString) в byte[]

public static byte[] StringToByte(string s)
{
    return Convert.FromBase64String(s);
}

где я получаю свою первую проблему. Если длина строки не кратна 4 (s.lenght % 4 == 0), я получаю сообщение об ошибке «Недопустимая длина для массива символов Base-64». Я читал, что я могу (должен) добавить "=" в конец string, но некоторые из этих строк могут быть паролями (которые могут содержать "="). Мне нужно сохранить (зашифрованные) данные в XML-файле, почему я не могу использовать кодировку Unicode (я не знаю, почему, но это портит файл XML... из-за кодировки, я полагаю).

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

Кто-нибудь из вас может помочь мне решить эту проблему? Меня не волнует вывод в XML, если он «читаем».

с уважением Алекс


person Alex    schedule 02.08.2013    source источник


Ответы (1)


где я получаю свою первую проблему. Если длина строки не кратна 4 (s.lenght% 4 == 0), я получаю сообщение об ошибке «Недопустимая длина для массива символов Base-64».

Это говорит о том, что это не base64 для начала. Похоже, вы идете в неправильном направлении - base64 используется для преобразования двоичных данных в текст. Чтобы преобразовать текст в двоичную форму, обычно достаточно использовать Encoding.GetBytes:

return Encoding.UTF8.GetBytes(text);

Теперь, если вам нужно закодировать результат шифрования (который будет двоичными данными) в виде текста, тогда вы должны использовать base64. (Поскольку результатом шифрования текста в кодировке UTF-8 является не текст в кодировке UTF-8.)

Итак, что-то вроде:

public static string EncryptText(string input)
{
    byte[] unencryptedBytes = Encoding.UTF8.GetBytes(input);
    byte[] encryptedBytes = EncryptBytes(unencryptedBytes); // Not shown here
    return Convert.ToBase64String(encryptedBytes);
}

public static string DecryptText(string input)
{
    byte[] encryptedBytes = Convert.FromBase64String(input);
    byte[] unencryptedBytes = DecryptBytes(encryptedBytes); // Not shown here
    return Encoding.UTF8.GetString(unencryptedBytes);
}
person Jon Skeet    schedule 02.08.2013
comment
извините, что беспокою вас, Джон, но у меня есть нерешенный вопрос, связанный с вашим старым сообщением, в котором вы сказали (и с тех пор я взял это за правило), что самый безопасный способ преобразования текстовых данных в и из byte[] использует base64, ты имел ввиду во всех сценариях или только в некоторых? прости еще раз. - person terrybozzio; 02.08.2013
comment
общедоступная статическая строка ByteToString (byte [] bytes) { return Convert.ToBase64String (bytes); } общедоступный статический байт [] StringToByte (строка s) { return Encoding.UTF8.GetBytes (s); } попробовал это, но если я использую его string s = ByteToString(StringToByte("test"));, результат будет dGVzdA==, что, очевидно, не является тестом - person Alex; 02.08.2013
comment
@Alex: Ну да, потому что теперь вы все еще конвертируете байты в строку с помощью Convert.ToBase64String! Используйте Encoding.GetString, чтобы отменить операцию Encoding.GetBytes. - person Jon Skeet; 02.08.2013
comment
@terrybozzio: Нет - если вы начинаете с произвольных двоичных данных, вы используете Base64 для перехода к тексту, и таким образом вы можете вернуться к тем же двоичным данным. Если вы начинаете с текстовых данных, используйте обычную кодировку, например UTF-8. - person Jon Skeet; 02.08.2013
comment
хорошо, я правильно понимаю, я должен начать с Encoding.UTF8, потому что это строковый ввод, затем я должен зашифровать его и вернуться к строке с Convert.ToBase64String, потому что теперь это необработанный двоичный файл, и наоборот, чтобы получить мои сохраненные данные? - person Alex; 02.08.2013
comment
хорошо, это была моя ошибка, я думал, что использую одну и ту же кодировку все время. большое спасибо - person Alex; 02.08.2013
comment
@Alex: Вы понимаете, почему вам следует использовать разные кодировки в двух разных случаях? Если нет, то стоит подумать об этом дальше. В основном это вопрос определения кодировки на основе типа исходных данных. - person Jon Skeet; 02.08.2013