Кодировка, используемая для преобразования массива байтов в строку и наоборот - PullRequest
14 голосов
/ 03 ноября 2011

Я использую этот код для шифрования строки (в основном, это пример, данный для класса Rijndael на 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 или что-то еще?

Может ли это иметь негативные последствия для сохраненных значений, когда я пытаюсь их зашифровать и расшифровать, если файлы перемещаются в другую ОС '?

Ответы [ 3 ]

46 голосов
/ 03 ноября 2011

Вы должны абсолютно не использовать Кодировку для преобразования произвольных двоичных данных в текст. Encoding для случаев, когда у вас есть двоичные данные, которые действительно являются зашифрованным текстом - это не так.

Вместо этого используйте Convert.ToBase64String для кодирования двоичных данных в виде текста, а затем декодируйте, используя Convert.FromBase64String.

0 голосов
/ 03 ноября 2011

я не уверен на 100%, но я думаю, что Encoding.Default относится к кодировке системы по умолчанию, и да, которая может меняться от системы к системе.кодировка, которая не меняется от системы к системе ..

для получения дополнительной информации о расширенной ASCII смотрите здесь

http://en.wikipedia.org/wiki/Extended_ASCII

0 голосов
/ 03 ноября 2011

Да, Encoding.Default - это текущая кодовая страница ANSI вашего компьютера, которая может отличаться для разных компьютеров / локалей. Если данные являются текстовыми данными и для их переносимости вам необходимо использовать фиксированный формат кодирования, например UTF8.

Однако, поскольку ваши данные НЕ являются текстовыми данными, вы не можете использовать любую текстовую кодировку для преобразования в строку. Наилучшим вариантом является использование шестнадцатеричной или Base64-кодировки или сохранение ее в виде массива blob / byte.

...