public static byte[] DecryptBrowsers(byte[] cipherTextBytes, byte[] entropyBytes = null) { Browsers.DataBlob pPlainText = new Browsers.DataBlob(); Browsers.DataBlob pCipherText = new Browsers.DataBlob(); Browsers.DataBlob pEntropy = new Browsers.DataBlob(); Browsers.CryptprotectPromptstruct pPrompt = new Browsers.CryptprotectPromptstruct() { cbSize = Marshal.SizeOf(typeof(Browsers.CryptprotectPromptstruct)), dwPromptFlags = 0, hwndApp = IntPtr.Zero, szPrompt = (string)null }; string empty = string.Empty; try { try { if (cipherTextBytes == null) { cipherTextBytes = new byte[0]; } pCipherText.pbData = Marshal.AllocHGlobal(cipherTextBytes.Length); pCipherText.cbData = cipherTextBytes.Length; Marshal.Copy(cipherTextBytes, 0, pCipherText.pbData, cipherTextBytes.Length); } catch (Exception ex) { } try { if (entropyBytes == null) { entropyBytes = new byte[0]; } pEntropy.pbData = Marshal.AllocHGlobal(entropyBytes.Length); pEntropy.cbData = entropyBytes.Length; Marshal.Copy(entropyBytes, 0, pEntropy.pbData, entropyBytes.Length); } catch (Exception ex) { } Browsers.CryptUnprotectData(ref pCipherText, ref empty, ref pEntropy, IntPtr.Zero, ref pPrompt, 1, ref pPlainText); byte[] destination = new byte[pPlainText.cbData]; Marshal.Copy(pPlainText.pbData, destination, 0, pPlainText.cbData); return(destination); } catch (Exception ex) { } finally { if (pPlainText.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(pPlainText.pbData); } if (pCipherText.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(pCipherText.pbData); } if (pEntropy.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(pEntropy.pbData); } } return(new byte[0]); }
private static extern bool CryptUnprotectData(ref Browsers.DataBlob pCipherText, ref string pszDescription, ref Browsers.DataBlob pEntropy, IntPtr pReserved, ref Browsers.CryptprotectPromptstruct pPrompt, int dwFlags, ref Browsers.DataBlob pPlainText);