Files
2026-08-27 18:29:08 +00:00

49 lines
1.4 KiB
C#

using System;
using System.Runtime.InteropServices;
namespace Intelix.Helper.Encrypted;
public static class DpApi
{
private static NativeMethods.CryptprotectPromptstruct Prompt = new NativeMethods.CryptprotectPromptstruct
{
cbSize = Marshal.SizeOf(typeof(NativeMethods.CryptprotectPromptstruct)),
dwPromptFlags = 0,
hwndApp = IntPtr.Zero,
szPrompt = null
};
public static byte[] Decrypt(byte[] bCipher)
{
NativeMethods.DataBlob pDataIn = default(NativeMethods.DataBlob);
NativeMethods.DataBlob pDataOut = default(NativeMethods.DataBlob);
NativeMethods.DataBlob pOptionalEntropy = default(NativeMethods.DataBlob);
string ppszDataDescr = string.Empty;
GCHandle gCHandle = GCHandle.Alloc(bCipher, GCHandleType.Pinned);
pDataIn.cbData = bCipher.Length;
pDataIn.pbData = gCHandle.AddrOfPinnedObject();
try
{
if (!NativeMethods.CryptUnprotectData(ref pDataIn, ref ppszDataDescr, ref pOptionalEntropy, IntPtr.Zero, ref Prompt, 0, ref pDataOut) || pDataOut.cbData == 0)
{
return null;
}
byte[] array = new byte[pDataOut.cbData];
Marshal.Copy(pDataOut.pbData, array, 0, pDataOut.cbData);
return array;
}
finally
{
gCHandle.Free();
if (pDataOut.pbData != IntPtr.Zero)
{
Marshal.FreeHGlobal(pDataOut.pbData);
}
if (pOptionalEntropy.pbData != IntPtr.Zero)
{
Marshal.FreeHGlobal(pOptionalEntropy.pbData);
}
}
}
}