0

是否可以解密使用 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 中的异常:数据无效。

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

感谢帮助!

4

1 回答 1

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到函数可以存储其结果的位置(此结构在 JNA 中定义platform.jar)。完成后不要忘记释放DATA_BLOB'pbData字段,将其值传递给LocalFree.

于 2014-12-03T23:25:19.850 回答