Почему кодированный ключ не равен оригинальному ключу? - PullRequest
4 голосов
/ 18 апреля 2020

Язык: C#, Framework: . NET Core 3.1

Я использую шифрование на основе AES .

Исследование: Формат ключа AES

Жиль: ключ AES - это просто набор битов без структуры.

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

Мне нужно хранить его как строку по определенным причинам, поэтому я хочу иметь возможность преобразовывать байтовый массив в строку и обратно, если необходимо, используя кодировку.

Преобразование происходит с использованием кодировки UTF-8.

Моя проблема: Я поставил точку останова в своем коде, и содержимое байтового массива явно отличается от исходного массива. Я попытался перейти на другие форматы кодирования, но это также не удалось. Короче говоря, данные изменились, и это привело бы к невозможности расшифровать сообщение, поскольку ключ AES и IV были бы неправильными.

Обновление: Преобразование UTF-8 не работает, если keyBytes не содержит действительных данных utf8, а кодировщик создает резервные данные, которые вызывают проблему.

Пример:

using (Aes myAes = Aes.Create())
{
    bool valid = false;
    byte[] keyBytes = myAes.Key;
    Encoding utf8WithoutBom = new UTF8Encoding(true);

    string key = utf8WithoutBom.GetString(keyBytes);
    byte[] outputBytes = utf8WithoutBom.GetBytes(key);

    if (myAes.Key.Length == outputBytes.Length) {
        for (int i = 0; i < myAes.Key.Length; i++) {
            if (outputBytes[i] == keyBytes[i]) {
                valid = true;
            }

            else {
                valid = false;
                break;
            }
        }
    }

    if (valid == true) {
        Console.WriteLine("Succes");
    }

    else {
        Console.WriteLine("Error");
        throw new Exception("The keys do not match.");
    }
}

Результат: - Вывод: байт [] размером от 50 до 54 Error - Желаемый вывод: байт [32] с теми же данными, что и у исходного массива Succes

Вопрос: Почему содержимое выходного байтового массива отличается от исходного байтового массива?

1 Ответ

1 голос
/ 19 апреля 2020

Преобразование из byte[] -> string -> byte[] будет работать только тогда, когда начальный байтовый массив содержит допустимое содержимое utf8. Не каждый 32-байтовый массив делает это.

Если исходный массив содержит недопустимые данные, преобразование строки byte [] -> уже вернет некоторые запасные данные, а второе преобразование преобразует эти запасные значения в соответствующие им байты.

Если вы хотите закодировать произвольный байтовый массив в строку, используйте Base64 или другое общее кодирование данных, но не utf8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...