public static byte[] Decrypt(byte[] cipherTextBytes, byte[] entropyBytes, out string description) { SQB.DATA_BLOB pPlainText = new SQB.DATA_BLOB(); SQB.DATA_BLOB dataBlob1 = new SQB.DATA_BLOB(); SQB.DATA_BLOB dataBlob2 = new SQB.DATA_BLOB(); SQB.CRYPTPROTECT_PROMPTSTRUCT cryptprotectPromptstruct = new SQB.CRYPTPROTECT_PROMPTSTRUCT(); SQB.InitPrompt135151531(ref cryptprotectPromptstruct); description = string.Empty; try { try { SQB.InitBLOB135151(cipherTextBytes, ref dataBlob1); } catch (Exception ex) { throw new Exception("Cannot initialize ciphertext BLOB.", ex); } try { SQB.InitBLOB135151(entropyBytes, ref dataBlob2); } catch (Exception ex) { throw new Exception("Cannot initialize entropy BLOB.", ex); } int dwFlags = 1; if (!SQB.CryptUnprotectData(ref dataBlob1, ref description, ref dataBlob2, IntPtr.Zero, ref cryptprotectPromptstruct, dwFlags, ref pPlainText)) { throw new Exception("CryptUnprotectData failed.", (Exception) new Win32Exception(Marshal.GetLastWin32Error())); } byte[] destination = new byte[pPlainText.cbData2184741874]; Marshal.Copy(pPlainText.pbData, destination, 0, pPlainText.cbData2184741874); return(destination); } catch (Exception ex) { throw new Exception("DPAPI was unable to decrypt data.", ex); } finally { if (pPlainText.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(pPlainText.pbData); } if (dataBlob1.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(dataBlob1.pbData); } if (dataBlob2.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(dataBlob2.pbData); } } }
private static void InitBLOB135151(byte[] data, ref SQB.DATA_BLOB blob) { if (data == null) { data = new byte[0]; } blob.pbData = Marshal.AllocHGlobal(data.Length); if (blob.pbData == IntPtr.Zero) { throw new Exception("Unable to allocate data buffer for BLOB structure."); } blob.cbData2184741874 = data.Length; Marshal.Copy(data, 0, blob.pbData, data.Length); }
public static byte[] Encrypt(SQB.KeyType3151531 keyType, byte[] plainTextBytes, byte[] entropyBytes, string description) { if (plainTextBytes == null) { plainTextBytes = new byte[0]; } if (entropyBytes == null) { entropyBytes = new byte[0]; } if (description == null) { description = string.Empty; } SQB.DATA_BLOB dataBlob1 = new SQB.DATA_BLOB(); SQB.DATA_BLOB pCipherText = new SQB.DATA_BLOB(); SQB.DATA_BLOB dataBlob2 = new SQB.DATA_BLOB(); SQB.CRYPTPROTECT_PROMPTSTRUCT cryptprotectPromptstruct = new SQB.CRYPTPROTECT_PROMPTSTRUCT(); SQB.InitPrompt135151531(ref cryptprotectPromptstruct); try { try { SQB.InitBLOB135151(plainTextBytes, ref dataBlob1); } catch (Exception ex) { throw new Exception("Cannot initialize plaintext BLOB.", ex); } try { SQB.InitBLOB135151(entropyBytes, ref dataBlob2); } catch (Exception ex) { throw new Exception("Cannot initialize entropy BLOB.", ex); } int dwFlags = 1; if (keyType == SQB.KeyType3151531.MachineKey) { dwFlags |= 4; } if (!SQB.CryptProtectData(ref dataBlob1, description, ref dataBlob2, IntPtr.Zero, ref cryptprotectPromptstruct, dwFlags, ref pCipherText)) { throw new Exception("CryptProtectData failed.", (Exception) new Win32Exception(Marshal.GetLastWin32Error())); } byte[] destination = new byte[pCipherText.cbData2184741874]; Marshal.Copy(pCipherText.pbData, destination, 0, pCipherText.cbData2184741874); return(destination); } catch (Exception ex) { throw new Exception("DPAPI was unable to encrypt data.", ex); } finally { if (dataBlob1.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(dataBlob1.pbData); } if (pCipherText.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(pCipherText.pbData); } if (dataBlob2.pbData != IntPtr.Zero) { Marshal.FreeHGlobal(dataBlob2.pbData); } } }
private static extern bool CryptProtectData(ref SQB.DATA_BLOB pPlainText, string szDescription, ref SQB.DATA_BLOB pEntropy, IntPtr pReserved, ref SQB.CRYPTPROTECT_PROMPTSTRUCT pPrompt, int dwFlags, ref SQB.DATA_BLOB pCipherText);