Расшифровать данные, которые были зашифрованы с помощью MS DPAPI с помощью JNA

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

byte[] byteArray = (byte[]) Advapi32Util.registryGetValue(WinReg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\SystemCertificates\\AuthRoot\\Certificates\\02FAF3E291435468607857694DF5E45B68851868", "Blob");

byte[] decrypted = Crypt32Util.cryptUnprotectData(byteArray);

String stringDecrypted = new String(decrypted);
System.out.println(stringDecrypted);

Но я получаю исключение Win32: исключение в потоке «основной» com.sun.jna.platform.win32.Win32Exception: данные недействительны.

Я не нашел никакой информации об этом исключении. Так что это значит?? И могу ли я расшифровать эти файлы, как я хочу, или это невозможно?

Спасибо за помощь!


person Opa114    schedule 03.12.2014    source источник


Ответы (1)


Согласно документации MSDN, вам не хватает шести дополнительных аргументов для cryptUnprotectData.

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

ОБНОВЛЕНИЕ

На основе документации MSDN:

BOOL WINAPI CryptUnprotectData(
  _In_        DATA_BLOB *pDataIn,
  _Out_opt_   LPWSTR *ppszDataDescr,
  _In_opt_    DATA_BLOB *pOptionalEntropy,
  _Reserved_  PVOID pvReserved,
  _In_opt_    CRYPTPROTECT_PROMPTSTRUCT *pPromptStruct,
  _In_        DWORD dwFlags,
  _Out_       DATA_BLOB *pDataOut
);

Второй, третий, четвертый и пятый аргументы, вероятно, могут быть null. Шестой аргумент вероятно может быть равен нулю. Последний аргумент должен быть соответствующим образом выделенным DATA_BLOB, где функция может хранить свои результаты (эта структура определена в platform.jar JNA). Не забудьте освободить поле pbData DATA_BLOB, когда закончите с ним, передав его значение в LocalFree.

person technomage    schedule 03.12.2014
comment
и какие именно аргументы мне нужно добавить. я думаю, что аргументы должны быть теми, которые используют DPAPI для шифрования данных. но я не нашел информации, какие именно параметры они используют. так что немного сложно найти аргументы, которые мне нужны - person Opa114; 04.12.2014
comment
Проблема заключается в том, что функция JNA cryptUnprotectData() принимает только следующие аргументы: данные byte[] ИЛИ данные byte[], энтропия byte[], флаги int, приглашение WinCrypt.CRYPTPROTECT_PROMPTSTRUCT ИЛИ данные byte[], флаги int см. здесь (jna.java.net/javadoc/platform/com/ sun/jna/platform/win32/), поэтому я не знаю, какие значения я должен установить там :( - person Opa114; 04.12.2014
comment
Согласно последний на github, cryptUnprotectData() соответствует документам в MSDN. jna.java.net не использовался годами. - person technomage; 04.12.2014
comment
Можете ли вы снять защиту данных, используя только собственный код? - person technomage; 04.12.2014
comment
я вижу одно различие между моим использованием и вашим: я использовал Crypt32U, пока вы не ссылаетесь только на Crypt32. Но Crypt32 — это только интерфейс. так что я должен реализовать это самостоятельно или я ошибаюсь? я не лучший программист :( Что ты имеешь в виду: я могу снять защиту данных только с нативным кодом? - person Opa114; 05.12.2014
comment
Нет, вам не нужно реализовывать себя. Crypt32Util использует Crypt32; интерфейс предоставляет структуру, которую JNA затем отображает в собственной библиотеке с помощью Native.loadLibrary(). Автор Crypt32Util только что предоставил несколько сокращений для определения родной библиотеки. - person technomage; 05.12.2014
comment
хорошо, но в CryptUtil32 у меня нет всех параметров, которые указаны в Crypt32 - person Opa114; 06.12.2014