//////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////
        //////////////////////////////////////////////////////////////////////
        private string EncryptText(string clearText)
        {
            if (clearText == null || clearText.Length < 1)
                return clearText;

            DATA_BLOB inputData, entData, outputData;
            SafeNativeMemoryHandle safeInputDataHandle = new SafeNativeMemoryHandle();
            SafeNativeMemoryHandle safeOutputDataHandle = new SafeNativeMemoryHandle(true);
            SafeNativeMemoryHandle safeEntDataHandle = new SafeNativeMemoryHandle();

            inputData.pbData = entData.pbData = outputData.pbData = IntPtr.Zero;
            inputData.cbData = entData.cbData = outputData.cbData = 0;
            try {

                RuntimeHelpers.PrepareConstrainedRegions();
                try {
                }
                finally {
                    inputData = PrepareDataBlob(clearText);
                    safeInputDataHandle.SetDataHandle(inputData.pbData);

                    entData = PrepareDataBlob(_KeyEntropy);
                    safeEntDataHandle.SetDataHandle(entData.pbData);
                }

                CRYPTPROTECT_PROMPTSTRUCT   prompt      = PreparePromptStructure();
                UInt32                      dwFlags     = CRYPTPROTECT_UI_FORBIDDEN;
                if (UseMachineProtection)
                    dwFlags |= CRYPTPROTECT_LOCAL_MACHINE;
                bool success = false;

                RuntimeHelpers.PrepareConstrainedRegions();
                try {
                }
                finally {
                    success = UnsafeNativeMethods.CryptProtectData(ref inputData, "", ref entData,
                                                                    IntPtr.Zero, ref prompt,
                                                                    dwFlags, ref outputData);
                    safeOutputDataHandle.SetDataHandle(outputData.pbData);
                }
                if (!success || outputData.pbData == IntPtr.Zero) {
                    outputData.pbData = IntPtr.Zero;
                    Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
                }
                byte[] buf = new byte[outputData.cbData];
                Marshal.Copy(outputData.pbData, buf, 0, buf.Length);
                return Convert.ToBase64String(buf);
            } finally {
                if (!(safeOutputDataHandle == null || safeOutputDataHandle.IsInvalid)) {
                    safeOutputDataHandle.Dispose();
                    outputData.pbData = IntPtr.Zero;
                }
                if (!(safeEntDataHandle == null || safeEntDataHandle.IsInvalid)) {
                    safeEntDataHandle.Dispose();
                    entData.pbData = IntPtr.Zero;
                }
                if (!(safeInputDataHandle == null || safeInputDataHandle.IsInvalid)) {
                    safeInputDataHandle.Dispose();
                    inputData.pbData = IntPtr.Zero;
                }
            }
        }
 private string DecryptText(string encText)
 {
     DATA_BLOB data_blob;
     DATA_BLOB data_blob2;
     DATA_BLOB data_blob3;
     string str;
     if ((encText == null) || (encText.Length < 1))
     {
         return encText;
     }
     SafeNativeMemoryHandle handle = new SafeNativeMemoryHandle();
     SafeNativeMemoryHandle handle2 = new SafeNativeMemoryHandle(true);
     SafeNativeMemoryHandle handle3 = new SafeNativeMemoryHandle();
     data_blob.pbData = data_blob2.pbData = data_blob3.pbData = IntPtr.Zero;
     data_blob.cbData = data_blob2.cbData = data_blob3.cbData = 0;
     try
     {
         RuntimeHelpers.PrepareConstrainedRegions();
         try
         {
         }
         finally
         {
             data_blob = PrepareDataBlob(Convert.FromBase64String(encText));
             handle.SetDataHandle(data_blob.pbData);
             data_blob2 = PrepareDataBlob(this._KeyEntropy);
             handle3.SetDataHandle(data_blob2.pbData);
         }
         CRYPTPROTECT_PROMPTSTRUCT promptStruct = PreparePromptStructure();
         uint flags = 1;
         if (this.UseMachineProtection)
         {
             flags |= 4;
         }
         bool flag = false;
         RuntimeHelpers.PrepareConstrainedRegions();
         try
         {
         }
         finally
         {
             flag = Microsoft.Win32.UnsafeNativeMethods.CryptUnprotectData(ref data_blob, IntPtr.Zero, ref data_blob2, IntPtr.Zero, ref promptStruct, flags, ref data_blob3);
             handle2.SetDataHandle(data_blob3.pbData);
         }
         if (!flag || (data_blob3.pbData == IntPtr.Zero))
         {
             data_blob3.pbData = IntPtr.Zero;
             Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
         }
         byte[] destination = new byte[data_blob3.cbData];
         Marshal.Copy(data_blob3.pbData, destination, 0, destination.Length);
         str = Encoding.Unicode.GetString(destination);
     }
     finally
     {
         if ((handle2 != null) && !handle2.IsInvalid)
         {
             handle2.Dispose();
             data_blob3.pbData = IntPtr.Zero;
         }
         if ((handle3 != null) && !handle3.IsInvalid)
         {
             handle3.Dispose();
             data_blob2.pbData = IntPtr.Zero;
         }
         if ((handle != null) && !handle.IsInvalid)
         {
             handle.Dispose();
             data_blob.pbData = IntPtr.Zero;
         }
     }
     return str;
 }