Как преобразовать байт AES [] в строку и наоборот? - PullRequest
0 голосов
/ 28 ноября 2018

Мой метод AESEncrypt(string text) возвращает байтовый массив.Если я шифрую сообщение и использую возвращенный байтовый массив в качестве входных данных для AESDecrypt(byte[] text), все работает нормально.Проблема в том, что мне нужно преобразовать его в строку и наоборот, поэтому я попробовал следующее:

byte[] encrypted = enc.AESEncrypt("Testmessage");
string encryptedStr = Convert.ToBase64String(encrypted);
byte[] test = Convert.FromBase64String(encryptedStr);

Console.WriteLine((encrypted == test));

Я также пробовал это с Encoding.ASCII.GetString(), Encoding.UTF8.GetString(),

но encrypted == test возвращает false каждый раз ...

Какой метод мне нужно использовать для преобразования байта AES [] в строку и наоборот?

Это AESEncryptметод:

public byte[] AESEncrypt(string s)
{
    byte[] encrypted;

    using (AesManaged aes = new AesManaged()) {
        ICryptoTransform encryptor = aes.CreateEncryptor(AESKey, AESIV);
        using (MemoryStream ms = new MemoryStream()) {
            using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) {
                using (StreamWriter sw = new StreamWriter(cs)) {
                    sw.Write(s);
                }
                encrypted = ms.ToArray();
            }
        }
    }

    return encrypted;
}

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Зашифрованная полезная нагрузка, содержащаяся в байтовом массиве, не может быть напрямую преобразована в строку или, по крайней мере, без использования кодировки ANSI, и обе стороны (кодирование и декодирование) согласовывают кодовую страницу строки.И если вы используете любую кодировку Unicode (UTF-8, UTF-16, ...), у вас обязательно будут байты, которые содержат недопустимые кодовые точки, поэтому их нельзя будет декодировать в символ.

Вот где Base64 вступает в игру.Это безопасный способ представления байтовых массивов в виде строк ASCII, подмножества, реализуемого почти каждой (если не каждой) кодировкой.Так что использовать этот код base64 можно.

Вы просто захотите encrypted.SequenceEquals(test), как описано в Сравнение двухбайтовых массивов в .NET .

0 голосов
/ 28 ноября 2018

Base64 используется непосредственно для этого.Вот пример:

Кодирование

public static string Base64Encode(string plainText)
{
    var plainTextBytes = System.Text.Encoding.UTF8.GetBytes(plainText);
    return System.Convert.ToBase64String(plainTextBytes);
}

Декодирование

public static string Base64Decode(string base64EncodedData)
{
    var base64EncodedBytes = System.Convert.FromBase64String(base64EncodedData);
    return System.Text.Encoding.UTF8.GetString(base64EncodedBytes);
}
0 голосов
/ 28 ноября 2018

Рассмотрим byte[] encrypted и byte[] test, когда вы проверяете на равенство с == по умолчанию ссылки сравниваются, а не их содержание.Это объясняет, почему тестирование encrypted == test не выполняется.

Вы также спрашиваете, как преобразовать byte[] в строку, которая вообще не связана с вашим тестом encrypted == test.В общем, вы System.Text.Encoding.*.GetString(byteArray); преформуете различные преобразования, но вам нужно знать, какая кодировка использовалась для byteArray.Эта информация должна передаваться отдельно, у вас может быть спецификация, в которой говорится, что все байтовые массивы кодируются в UTF-8, или вы можете передать кодирование вместе с данными, но общего ответа не существует.

...