2014-12-03 76 views
0

是否可以解密用MS DPAPI加密的数据?例如,我想从Windows注册表中解密数字证书。解密使用MS DPAPI和JNA加密的数据

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:数据是无效的。

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

Thnaks求助!

回答

1

根据MSDN documentation,您缺少6个额外的参数cryptUnprotectData

即使这些参数标记为“可选”,您仍然需要在接口方法签名中声明它们。

UPDATE

基于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_BLOBpbData字段,并将其值传递给LocalFree

+0

什么是我需要添加的确切参数。我认为参数必须是使用DPAPI加密数据的参数。但我没有发现他们使用什么确切参数的信息。所以有点难以找出我需要的参数 – Opa114 2014-12-04 12:52:00

+0

probelem是JNA函数cryptUnprotectData()只接受这些参数: byte [] data OR byte [] data,byte [] entropy,int flags, WinCrypt.CRYPTPROTECT_PROMPTSTRUCT提示或 字节[]数据,INT标志 在这里看到(https://jna.java.net/javadoc/platform/com/sun/jna/platform/win32/Crypt32Util.html) ,所以我不知道我必须在那里设置哪些值:( – Opa114 2014-12-04 18:11:50

+0

根据[github上的最新版本,'cryptUnprotectData()'](https://github.com/twall/jna/blob/master/contrib/platform/src /com/sun/jna/platform/win32/Crypt32.java#L72-L112)与MSDN上的文档相匹配。'jna.java.net'多年来一直没有使用过。 – technomage 2014-12-04 19:52:10