C#磁盘或U盘加密(创建加密区)

匿名 (未验证) 提交于 2019-12-03 00:18:01

需要下载的DLL和驱动
介于公司项目为C#项目进行的加密开发,用前几张文章所学到的TrueCrypt项目开启4个重要的入口点:

  1. 创建加密卷
  2. 加载加密卷
  3. 卸载加密卷
  4. 修改密码
  5. 加载驱动
  6. 安装驱动
using Microsoft.Win32; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.ServiceProcess; using System.Text;  namespace ICT.NetHandleLibrary {     public class TrueCryptHelper     {         Logger<TrueCryptHelper> log = new Logger<TrueCryptHelper>();         [DllImport("TrueCryptFormat.dll", EntryPoint = "FormatVolumeC", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]         private extern static int FormatVolumeC(string fileUrl, string pwd, Int64 size);          [DllImport("TrueCrypt.dll", EntryPoint = "MountVolumeC", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]         private extern static int MountVolumeC(string fileUrl, string pwd, int driveNo);          [DllImport("TrueCrypt.dll", EntryPoint = "UnmountVolumeC", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]         private extern static int UnmountVolumeC(int driveNo);          [DllImport("TrueCrypt.dll", EntryPoint = "ChangePasswordC", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]         private extern static int ChangePasswordC(string szFile, string szoldPassword, string sznewPassowrd, IntPtr hwndDlg);          [DllImport("TrueCrypt.dll", EntryPoint = "DriverLoadC", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]         private extern static int DriverLoadC();          [DllImport("TrueCrypt.dll", EntryPoint = "DriverInstallC", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]         private extern static bool DriverInstallC();          [DllImport("kernel32.dll", SetLastError = true)]         static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);          [DllImport("kernel32.dll", SetLastError = true)]         static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);          public int Format(string fileUrl, string pwd, Int64 size)         {             return FormatVolumeC(fileUrl, pwd, size);         }          public int Mount(string fileUrl, string pwd, int driveNo)         {             return MountVolumeC(fileUrl, pwd, driveNo);         }          public int Unmount(int driveNo)         {             return UnmountVolumeC(driveNo);         }          public int ChangePwd(string szFile, string szoldPassword, string sznewPassword, IntPtr intPtr)         {             return ChangePasswordC(szFile, szoldPassword, sznewPassword, intPtr);         }          public int StartDrvice()         {             return DriverLoadC();         }          public bool InstallDrvice()         {             return DriverInstallC();         }          public static bool CheckRegedit()         {             string isUrl = @"SYSTEM\CurrentControlSet\Services";             string itemName = "truecrypt";             RegistryKey subKey = Registry.LocalMachine.OpenSubKey(isUrl);             string[] keyNames = subKey.GetSubKeyNames();             subKey.Close();             bool result = false;             foreach (var keyName in keyNames)             {                 if (itemName.Equals(keyName))                 {                     result = true;                     break;                 }             }             return result;         }          public static bool executeRegedit()         {             try             {                 executeReg(@"SYSTEM\CurrentControlSet\Services", "truecrypt", "DisplayName", "truecrypt", RegistryValueKind.String);                 executeReg(@"SYSTEM\CurrentControlSet\Services", "truecrypt", "ErrorControl", "1", RegistryValueKind.DWord);                 executeReg(@"SYSTEM\CurrentControlSet\Services", "truecrypt", "ImagePath", @"System32\drivers\truecrypt.sys", RegistryValueKind.String);                 executeReg(@"SYSTEM\CurrentControlSet\Services", "truecrypt", "Start", "1", RegistryValueKind.DWord);                 executeReg(@"SYSTEM\CurrentControlSet\Services", "truecrypt", "Type", "1", RegistryValueKind.DWord);                 executeReg(@"SYSTEM\CurrentControlSet\Services", "truecrypt", "WOW64", "1", RegistryValueKind.DWord);             }             catch             {                 return false;             }              return true;         }          /// <summary>         /// 操作注册表(HKEY_LOCAL_MACHINE)         /// </summary>         /// <param name="isUrl">判断是否有某项的上一级路径</param>         /// <param name="itemName">项名称</param>         /// <param name="key"></param>         /// <param name="value"></param>         /// <returns></returns>         public static bool executeReg(string isUrl, string itemName, string key, string value, RegistryValueKind type)         {             RegistryKey subKey = Registry.LocalMachine.OpenSubKey(isUrl);             string[] keyNames = subKey.GetSubKeyNames();             subKey.Close();             bool result = false;             foreach (var keyName in keyNames)             {                 if (itemName.Equals(keyName))                 {                     result = true;                     break;                 }             }             if (!result)             {                 RegistryKey regkey = Registry.LocalMachine;                 RegistryKey software = regkey.CreateSubKey(isUrl + "\\" + itemName);                 software.Close();                 result = true;             }             RegistryKey regKey = Registry.LocalMachine;             RegistryKey openKey = regKey.OpenSubKey(isUrl + "\\" + itemName, true);             openKey.SetValue(key, value, type);             regKey.Close();              return result;         }          public bool copySysDrive()         {                        try             {                 IntPtr Wow64value = IntPtr.Zero;                 Wow64DisableWow64FsRedirection(ref Wow64value);                  if (!File.Exists(@"C:\Windows\System32\drivers\truecrypt.sys"))                 {                     log.Info("驱动不存在");                     string pLocalFilePath = AppDomain.CurrentDomain.BaseDirectory + "truecrypt.sys";//要复制的文件路径                     string pLocalFilePath64 = AppDomain.CurrentDomain.BaseDirectory + "truecrypt-x64.sys";//要复制的文件路径                     string pSaveFilePath = @"C:\Windows\System32\drivers";//指定存储的路径                     if (File.Exists(pLocalFilePath))//必须判断要复制的文件是否存在                     {                         log.Info("准备复制" + pLocalFilePath + "," + pSaveFilePath);                         File.Copy(pLocalFilePath, pSaveFilePath + "\\truecrypt.sys", true);//三个参数分别是源文件路径,存储路径,若存储路径有相同文件是否替换                     }                     if (File.Exists(pLocalFilePath64))//必须判断要复制的文件是否存在                     {                         log.Info("准备复制" + pLocalFilePath64+ "," + pSaveFilePath);                         File.Copy(pLocalFilePath64, pSaveFilePath + "\\truecrypt-x64.sys", true);//三个参数分别是源文件路径,存储路径,若存储路径有相同文件是否替换                     }                 }                 Wow64RevertWow64FsRedirection(Wow64value);             }             catch (Exception ex)             {                 log.Error(ex.ToString());                 return false;             }             return true;         }          public bool SysDriveState()         {             try             {                 var server = System.ServiceProcess.ServiceController.GetDevices().FirstOrDefault(service => service.ServiceName == "truecrypt");                 return server.Status != ServiceControllerStatus.Running ? false : true;             }             catch             {                 return false;             }         }          public int GetDriveToMount()         {             const int ASCII_OFFSET = 65;             int driveToMount = -1;             DriveInfo[] allDrives = DriveInfo.GetDrives();             List<char> driveLetters = new List<char>();             List<int> trueCryptDriveLetter = new List<int>();               foreach (DriveInfo d in allDrives)             {                 // Retrieve just the drive letter                 char filteredName = d.Name.ElementAt<char>(0);                 driveLetters.Add(filteredName);             }              foreach (char driveChar in driveLetters)             {                 trueCryptDriveLetter.Add((int)driveChar - ASCII_OFFSET);             }              // Chose random drive which is available             // Chose a number between 0 and 25 excluding the drives already in use             Random random = new Random();             do             {                 driveToMount = random.Next(15, 25);             } while (trueCryptDriveLetter.Contains(driveToMount));              return driveToMount;         }     } }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!