是否可以解密用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:数据无效。
我没有找到有关此例外的任何信息。这是什么意思?我可以像我想要的那样解密这些文件,还是不可能?
寻求帮助!
答案 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
。