解密用MS DPAPI和JNA加密的数据

时间:2014-12-03 17:34:18

标签: java windows encryption jna dpapi

是否可以解密用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异常:线程中的异常" main" com.sun.jna.platform.win32.Win32Exception:数据无效。

我没有找到有关此例外的任何信息。这是什么意思?我可以像我想要的那样解密这些文件,还是不可能?

寻求帮助!

1 个答案:

答案 0 :(得分:1)

根据MSDN documentation,您遗漏了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,其中函数可以存储其结果(此结构在JNA的platform.jar中定义)。完成后,请不要忘记释放DATA_BLOB的{​​{1}}字段,并将其值传递给pbData