Язык: 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
Вопрос: Почему содержимое выходного байтового массива отличается от исходного байтового массива?