C#中利用DPAPI加密解密數據

加密解密的一個函數

 

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);
    }

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章