Кодировка, используемая для преобразования массива 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