2014-12-03 21 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