Есть ли в Windows AEAD API?(см. CryptProtectData, но с использованием ключа) - PullRequest
0 голосов
/ 29 января 2019

Предоставляет ли Windows высокоуровневую, протестированную, поддерживаемую функцию для выполнения аутентифицированного шифрования с использованием симметричного ключа?

Конечно, AEAD (аутентифицированное шифрование с дополнительными данными) будет лучше.Но этот вопрос задает только AE (Authenticated Encryption).

Background

Windows предоставляет (относительно) простой API для шифрования большого двоичного объекта с помощью API CryptProtectData, который мы можем обернуть впростая в использовании функция:

public Byte[] ProtectBytes(Byte[] plaintext)
{
   //...
}

Детали ProtectBytes менее важны, чем идея, что вы можете использовать его довольно легко:

  • вот байты, которые я хочу зашифроватьпо секретному ключу, хранящемуся в System
  • , верните мне зашифрованный BLOB-объект

Возвращенный BLOB-объект является недокументированной документацией структура, которая содержит все необходимое (например, алгоритм хеширования, алгоритм шифрования, соль, сигнатура HMAC и т. Д.) Для дешифрования и возврата исходных данных.

Для полноты ниже приведен пример реализации псевдокода ProtectBytes, который использует Crypt API для защиты байтов:

public Byte[] ProtectBytes(Byte[] plaintext)
{
   //Setup our n-byte plaintext blob
   DATA_BLOB dataIn;
   dataIn.cbData = plaintext.Length;
   dataIn.pbData = Addr(plaintext[0]);

   DATA_BLOB dataOut;

   //dataOut = EncryptedFormOf(dataIn)
   BOOL bRes = CryptProtectData(
         dataIn,
         null,     //data description (optional PWideChar)
         null,     //optional entropy (PDATA_BLOB)
         null,     //reserved
         null,     //prompt struct
         CRYPTPROTECT_UI_FORBIDDEN || CRYPTPROTECT_LOCAL_MACHINE,
         ref dataOut);
   if (!bRes) then
   {
      DWORD le = GetLastError();
      throw new Win32Error(le, "Error calling CryptProtectData");
   }

   //Copy ciphertext from dataOut blob into an actual array
   bytes[] result;
   SetLength(result, dataOut.cbData);
   CopyMemory(dataOut.pbData, Addr(result[0]), dataOut.cbData);

   //When you have finished using the DATA_BLOB structure, free its pbData member by calling the LocalFree function
   LocalFree(HANDLE(dataOut.pbData)); //LocalFree takes a handle, not a pointer. But that's what the SDK says.
}

Важным моментом во всем этом является то, что CryptProtectData может работать в одном из двух режимов:

  • данные могутрасшифровывается только с помощью you (потому что оно, по сути, зашифровано вашим паролем Windows)
  • данные могут быть дешифрованы любым пользователем, работающим на той же локальной машине (поскольку, по сути, они зашифрованы,с паролем локальной подсистемы безопасности)

CryptProtectDataWithPassword?

Как сделать то же самое с явным паролем?

Недостаток CryptProtectData означает, что расшифровка связана с:

  • me
  • my machine

Это означает, что зашифрованные данные не могут быть переданы кому-либо еще,Мне нужно что-то более портативное между разными людьми.(например, люди на других компьютерах, люди не в том же домене, люди не в домене)

Crypto API Next Gen в Windows 8 также не поддерживает его

Существует bcrypt (он же BestCrypt, он же Cng, он же CryptoNG, он же Crypto NextGen, он же API Cryptography Next Generation), который предоставляет обновленную версию Windows 2000-эры CryptProtectData под названием ProtectSecret .

Эта функция позволяет указать, кто в домене может расшифровать секрет - либо с помощью SID, например:

  • "SID=S-1-1-0": группа Все
  • "SID=S-1-5-32-544": BUILTIN \ Группа администраторов
  • "SID=S-1-5-32-545": BUILTIN \ Группа пользователей

Или через сертификат в вашем личном магазине:

  • "CERTIFICATE=HashId:87b8808ecb233e0736b84b60670065b36ca615f1": CN = youporn.com

Недостатком этой новой функции является то, что:

  • требуется Windows 8 или новее
  • , она работает только надомен
  • или с сертификатом

Мне нужно что-то, что работает с паролем (то есть секретом).

Донне хочу накатить свой

Есть ли в Windows существующая высокоуровневая функция для шифрования с помощью пароля?Одним из главных достоинств поддержки Windows является то, что они возвращают непрозрачный большой двоичный объект, который поддерживает управление версиями.

Все упаковано в версионную структуру, которая содержит все необходимое для расшифровки, аутентификации,Они могут изменить алгоритм, и старые зашифрованные большие двоичные объекты все еще работают, в то время как новые рабочие области также будут работать.

Плюс, я не хочу кататься самостоятельно.Мы все знаем, как свернуть ваше собственное шифрование.Довольно просто не облажаться шифрование:

enter image description here

упс, следующая версия

enter image description here

упс, следующая версия

enter image description here

Поэтому, вместо того, чтобы кататься по собственной воле, мне бы очень хотелось:

  • то, что поставляется с Windows
  • , возвращает непрозрачный блоб
  • проверено и протестированолюди, у которых больше времени и знаний, чем у меня

Причина, по которой я не пользуюсь libsodium, заключается в том, что он недоступен для языка, которым я пользуюсь.(тоже не вопрос)

...