Можно ли получить массив ненулевой длины с нулевыми байтами во время шифрования Aes?C#

Место общения программистов C#
Ответить
Anonymous
 Можно ли получить массив ненулевой длины с нулевыми байтами во время шифрования Aes?

Сообщение Anonymous »

Несколько пользователей столкнулись со странными проблемами в моем приложении/игре. Они сообщили, что их файлы сохранений стали недействительными. Я пытался разобраться в проблеме, но ничего не нашел.
Вот конвейер:
  • внутриигровые данные преобразуются в файл json (строка)
  • файл json преобразует байты UTF8
  • Байты UTF8 проходят через этот метод шифрования (с использованием AES)
Расширение файла сохранения — .dat
Это первая игра, в которой я решил использовать шаг №3 (сохранение данных с шифрованием) и не обнаружил ничего странного и подобного в тестовых наборах и на тестовых стендах.
После того, как я получил несколько файлов сохранения от вовлеченных пользователей, я увидел, что все эти файлы имеют допустимая ненулевая длина, но имеет только ноль байтов.
Это пример одного из этих файлов:
здесь только ноль байтов
Вот код шифрования:

Код: Выделить всё

public static byte[] Encrypt(byte[] clearBytes, string encyptionKey)
{
using (var algorythm = Aes.Create())
{
algorythm.Mode = CipherMode.CBC;
algorythm.Padding = PaddingMode.PKCS7;
var encryptionBytes = _encoding.GetBytes(encyptionKey);
using (var pdb = new Rfc2898DeriveBytes(encryptionBytes, _salt, _iterations, _hashAlgorithm))
{
algorythm.Key = pdb.GetBytes(32);
algorythm.IV = pdb.GetBytes(16);
using (var encryptor = algorythm.CreateEncryptor())
{
using (var ms = new MemoryStream())
{
using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(clearBytes, 0, clearBytes.Length);
}
return ms.ToArray();
}
}
}
}
}
Вот код сохранения файла в файловую систему:

Код: Выделить всё

public bool Save(string relativePath, byte[] bytes)
{
var absolutePath = Path.Combine(_applicationDataPath, relativePath);
var fi = new FileInfo(absolutePath);
var di = fi.Directory;

try
{
if (!di.Exists)
di.Create();

var exists = fi.Exists;
using (var fs = exists ? fi.OpenWrite() : fi.Create())
{
fs.SetLength(0);
fs.Seek(0, SeekOrigin.Begin);

using (var ms = new MemoryStream(bytes))
{
ms.CopyTo(fs);
ms.Flush();

return true;
}
}
}
catch (Exception ex)
{
Debug.LogException(ex);
return false;
}
}
Если убрать шифрование, все работает хорошо, отчетов о поврежденных файлах сохранения нет.
Проблема в том, что я не могу воспроизвести эту ошибку на своем компьютере.

Подробнее здесь: https://stackoverflow.com/questions/797 ... ing-aes-en
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»