public byte[] Decrypt( byte[] cipherTextBytes )
{
DataBlob plainTextBlob = new DataBlob ( );
DataBlob cipherTextBlob = new DataBlob ( cipherTextBytes );
DataBlob entropyBlob = new DataBlob ( entropy );
description = "";
try {
CryptProtectFlags flags = CryptProtectFlags.UIForbidden;
if ( !CryptUnprotectData ( ref cipherTextBlob, ref description, ref entropyBlob, IntPtr.Zero, IntPtr.Zero, flags, ref plainTextBlob ) )
throw new COMException ( "CryptUnprotectData failed. ", Marshal.GetLastWin32Error ( ) );
byte[] plainTextBytes = new byte[ plainTextBlob.cbData ];
Marshal.Copy ( plainTextBlob.pbData, plainTextBytes, 0, plainTextBlob.cbData );
return plainTextBytes;
} catch ( Exception ex ) {
throw new Exception ( "DPAPI was unable to decrypt data. " + ex.Message );
} finally {
if ( plainTextBlob.pbData != IntPtr.Zero )
Marshal.FreeHGlobal ( plainTextBlob.pbData );
if ( cipherTextBlob.pbData != IntPtr.Zero )
Marshal.FreeHGlobal ( cipherTextBlob.pbData );
if ( entropyBlob.pbData != IntPtr.Zero )
Marshal.FreeHGlobal ( entropyBlob.pbData );
}
}