C#中利用DPAPI加密解密数据

    技术2022-05-11  89

    加密解密的一个函数

     

    using  System; using  System.Runtime.InteropServices; using  System.Text; using  System.Security; namespace  CryptProtection {    [Serializable()]    public sealed class DataProtection    {        [Flags()]        public enum CryptProtectPromptFlags        {            CRYPTPROTECT_PROMPT_ON_UNPROTECT = 0x01,            CRYPTPROTECT_PROMPT_ON_PROTECT = 0x02,            CRYPTPROTECT_PROMPT_RESERVED = 0x04,            CRYPTPROTECT_PROMPT_STRONG = 0x08,            CRYPTPROTECT_PROMPT_REQUIRE_STRONG = 0x10        }        [Flags()]        public enum CryptProtectDataFlags        {            CRYPTPROTECT_UI_FORBIDDEN = 0x01,            CRYPTPROTECT_LOCAL_MACHINE = 0x04,            CRYPTPROTECT_CRED_SYNC = 0x08,            CRYPTPROTECT_AUDIT = 0x10,            CRYPTPROTECT_NO_RECOVERY = 0x20,            CRYPTPROTECT_VERIFY_PROTECTION = 0x40,            CRYPTPROTECT_CRED_REGENERATE = 0x80        }        加密数据        解密数据        internal static void InitPromptstruct(ref DPAPI.CRYPTPROTECT_PROMPTSTRUCT ps)        {            ps.cbSize = Marshal.SizeOf(typeof(DPAPI.CRYPTPROTECT_PROMPTSTRUCT));            ps.dwPromptFlags = 0;            ps.hwndApp = IntPtr.Zero;            ps.szPrompt = null;        }    }    //允许托管代码不经过堆栈步即调入非托管代码    [SuppressUnmanagedCodeSecurityAttribute()]    internal class DPAPI    {        [DllImport("crypt32")]        public static extern bool CryptProtectData(ref DATA_BLOB dataIn, string szDataDescr, IntPtr optionalEntropy, IntPtr pvReserved,            IntPtr pPromptStruct, DataProtection.CryptProtectDataFlags dwFlags, ref DATA_BLOB pDataOut);        [DllImport("crypt32")]        public static extern bool CryptUnprotectData(ref DATA_BLOB dataIn, StringBuilder ppszDataDescr, IntPtr optionalEntropy,            IntPtr pvReserved, IntPtr pPromptStruct, DataProtection.CryptProtectDataFlags dwFlags, ref DATA_BLOB pDataOut);        [DllImport("Kernel32.dll")]        public static extern IntPtr LocalFree(IntPtr hMem);        [StructLayout(LayoutKind.Sequential)]            public struct DATA_BLOB        {            public int cbData;            public IntPtr pbData;        }        [StructLayout(LayoutKind.Sequential)]            public struct CRYPTPROTECT_PROMPTSTRUCT        {            public int cbSize; // = Marshal.SizeOf(typeof(CRYPTPROTECT_PROMPTSTRUCT))            public int dwPromptFlags; // = 0            public IntPtr hwndApp; // = IntPtr.Zero            public string szPrompt; // = null        }    }    internal class Win32Error    {        [Flags()]            public enum FormatMessageFlags : int        {            FORMAT_MESSAGE_ALLOCATE_BUFFER = 0x0100,            FORMAT_MESSAGE_IGNORE_INSERTS = 0x0200,            FORMAT_MESSAGE_FROM_STRING = 0x0400,            FORMAT_MESSAGE_FROM_HMODULE = 0x0800,            FORMAT_MESSAGE_FROM_SYSTEM = 0x1000,            FORMAT_MESSAGE_ARGUMENT_ARRAY = 0x2000,            FORMAT_MESSAGE_MAX_WIDTH_MASK = 0xFF,        }        [DllImport("Kernel32.dll")]        public static extern int FormatMessage(FormatMessageFlags flags, IntPtr source, int messageId, int languageId ,             StringBuilder buffer, int size, IntPtr arguments);    }}

     


    最新回复(0)