Использование ProtectedData.Protect () для файлов - PullRequest
0 голосов
/ 17 октября 2018

Я работаю над кодом, который в идеале может зашифровать файл с помощью Windows DPAPI.Это нормально, если файл можно прочитать непосредственно в память, но если это невозможно, я не могу зашифровать его.ProtectedData.Protect принимает 3 аргумента - данные в виде байтового массива, необязательную энтропию в виде байтового массива и область видимости.

Когда я использую его, как показано ниже, он дает 2 разных результата:

var data = new byte[]{1, 2, 3, 4, 5, 6, 7, 8};

byte[] encryptedDataA = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);

byte[] encryptedDataB = ProtectedData.Protect(data, null, DataProtectionScope.CurrentUser);

Console.WriteLine(encryptedDataA.SequenceEqual(encryptedDataB));

// False!!!!

Задание идентичной энтропии также приводит к различным результатам. Здесь - это ответ MSDN, подтверждающий это.Тем не менее, нет никакой документации, которую я могу найти, детализируя заголовок или как его читать.

Поскольку нет никаких перегрузок, принимающих его как что-либо, кроме byte[], я не могу найти способ исправить это, чтобы позволитьдля шифрования больших файлов без уродливой порции данных.

Есть ли способ обойти это?

1 Ответ

0 голосов
/ 17 октября 2018

Если вы посмотрите на исходный код для ProtectedData.Protect, вы обнаружите, что в какой-то момент он перенаправляет вызов в библиотеку Crypt32: Функция CryptProtectData .

В разделе Замечания вы увидите:

Функция создает ключ сеанса для выполнения шифрования.Ключ сеанса извлекается снова, когда данные должны быть расшифрованы.

Это, для меня, он читает, как новый ключ генерируется каждый раз, когда вызывается функция.

Так, если вам нужно каждый раз получать одно и то же значение, лучше использовать AES.

...