Кодировка, используемая для преобразования массива Bytes в String и наоборот
Я использую этот код для шифрования строки (в основном это пример, приведенный в Rijndael class на MSDN):
public static String AESEncrypt(String str2Encrypt, Byte[] encryptionKey, Byte[] IV)
{
Byte[] encryptedText;
using (RijndaelManaged rijAlg = new RijndaelManaged())
{
// Use the provided key and IV
rijAlg.Key = encryptionKey;
rijAlg.IV = IV;
// Create a decrytor to perform the stream transform
ICryptoTransform encryptor = rijAlg.CreateEncryptor(rijAlg.Key, rijAlg.IV);
// Create the streams used for encryption
using (MemoryStream msEncrypt = new MemoryStream())
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
// Write all data to the stream
swEncrypt.Write(str2Encrypt);
}
encryptedText = msEncrypt.ToArray();
}
}
return Encoding.Default.GetString(encryptedText);
}
Я использую Encoding.Default
для преобразования массива байтов в строку, но я не уверен, что это хорошее решение. Моя цель - хранить зашифрованный текст (например, пароли...) в файлах. Должен ли я продолжить с Encoding.Default
или использовать Encoding.UTF8Encoding
или что-то еще?
Может ли это иметь негативные последствия для сохраненных значений, когда я пытаюсь их зашифровать и расшифровать, если файлы перемещаются на разные ОС?
Ответы
Ответ 1
Вы не должны использовать Encoding для преобразования произвольных двоичных данных в текст. Encoding
- это когда вы получили двоичные данные, которые действительно являются закодированным текстом - это не так.
Вместо этого используйте Convert.ToBase64String
для кодирования двоичных данных в виде текста, затем декодируйте с помощью Convert.FromBase64String
.
Ответ 2
Да, Encoding.Default
- это текущая кодовая страница ANSI на компьютере и может отличаться от нескольких машин/локалей. Если данные были текстовыми данными и сделать их переносимыми, вам нужно будет использовать фиксированный формат кодирования, например UTF8.
Однако, поскольку ваши данные НЕ являются текстовыми данными, вы не можете использовать текстовую кодировку для преобразования в строку. Лучше всего использовать кодировку hex или Base64 или сохранить ее как массив blob/byte.
Ответ 3
im не на 100% уверен, но я думаю, что Encoding.Default относится к системному кодированию по умолчанию и да, что может измениться с системы на систему.
Если я использую UTF8 или какую-либо другую кодировку, которая не изменяется от системы к системе.
для получения дополнительной информации о расширенном ascii смотрите здесь
http://en.wikipedia.org/wiki/Extended_ASCII