Windows 에서 C\#를 사용 하여 폴 더 와 파일 에 암호 자 물 쇠 를 만 드 는 예제 공유

C\#폴 더 잠 금 도구
C\#언어 로 폴 더 잠 금 을 실현 하 는 프로그램 입 니 다.인터넷 에서 비슷 한'xxx 폴 더 xxx'소프트웨어 가 많 지만 대체적으로 C/C+언어 로 이 루어 졌 고 소스 코드 를 제공 하지 않 았 습 니 다.(이것 은 이해 할 수 있 습 니 다.암호 화 프로그램 이기 때문에 소스 코드 를 누설 해 서 는 안 됩 니 다)
프로그램의 기본 원 리 는 C\#언어 로 폴 더 이름 을 바 꾸 고 windows 보안 파일 의 클래스 식별 자 로 이름 을 바 꾸 는 것 입 니 다.구체 적 인 방법 은 폴 더 에 확장 명 을 추가 하 는 것 입 니 다."{2559 a1f2-21d7-11d4-bdaf-00c04f60b9f 0}"
(.{2559 a1f2-21d7-11d4-bdaf-00c04f60b9f 0}은 windows 보안 파일 의 클래스 식별 자 입 니 다)이 때 폴 더 의 아이콘 은 자물쇠 가 되 어 폴 더 가 잠 겨 있 습 니 다.
프로그램의 메 인 화면 은 매우 간결 합 니 다.캡 처 는 다음 과 같 습 니 다.
201637142947291.png (437×167)
프로그램 에서 암호 화 된 복호화 폴 더 의 핵심 코드 는 다음 과 같 습 니 다.

    private void btnBrowseFolder_Click(object sender, EventArgs e)
    {
      
      status = lockType;//
      

      if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
      {
        DirectoryInfo d = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
        string selectedpath = d.Parent.FullName + d.Name;
        if (folderBrowserDialog1.SelectedPath.LastIndexOf(".{") == -1)//       ,    
        {          
          SetPwd(folderBrowserDialog1.SelectedPath);
          if (!d.Root.Equals(d.Parent.FullName))
          {            
              d.MoveTo(d.Parent.FullName + "\\" + d.Name + status);//      
          }
          else d.MoveTo(d.Parent.FullName + d.Name + status);
          txtFolderPath.Text = folderBrowserDialog1.SelectedPath;
          
        }
        else//     
        {
          status = GetStatus(status);
          bool s = CheckPwd();
          if (s)
          {
            File.Delete(folderBrowserDialog1.SelectedPath + "\\key.xml");
            string path = folderBrowserDialog1.SelectedPath.Substring(0, folderBrowserDialog1.SelectedPath.LastIndexOf("."));
            d.MoveTo(path);
            txtFolderPath.Text = path;
            
          }
        }
      }
    }

프로그램의 실행 효 과 는 다음 과 같 습 니 다.
암호 화 된 D 디스크 아래 test 폴 더 를 예 로 들 면 다음 과 같 습 니 다.
우선 folder BrowserDialog 를 통 해 해당 폴 더 를 선택 하 십시오.
201637143219500.png (338×324)
비밀번호 입력,잠 금 추가
201637143238232.png (290×179)
효 과 는 다음 과 같 습 니 다:
201637143302754.png (476×290)
폴 더 를 더 블 클릭 하면 열 수 없습니다.
암호 화 된 test 폴 더 를 선택 하고 암호 화 할 때 입력 한 암 호 를 입력 하면 잠 금 을 풀 수 있 습 니 다.
201637143409234.png (290×139)
test 폴 더 복호화 됨
201637143435509.png (468×204)
암호 화 복호화 파일 도구
폴 더 이름 을 조작 하 는 방법 으로 폴 더 의 일반 암호 화 를 실현 하 는 폴 더 암호 화 도구 가 공 유 됐 으 며 폴 더 에 있 는 파일(동 영상,그림 등)이 그대로 저 장 돼 있다.
인터넷 에서 관련 파일 암호 화 프로그램 을 검색 한 결과'문자 창','텍스트'에 대한 암호 화 와 복호화 가 기본 적 인 것 으로 나 타 났 다.비디오 파일,이미지 등 일반 파일 에 대한 암호 화 복호화 프로그램 이 적 기 때문에 일반 파일 을 암호 화 하 는 작은 도 구 를 만 듭 니 다.
프로그램의 주요 기능 은 사용자 가 파일 선택 상 자 를 통 해 암호 화 할 파일-을 선택 하여 암 호 를 입력 하여 암호 화 하 는 것 입 니 다.암호 화 된 파일 을 선택 하고 비밀 번 호 를 입력 하여 복호화 합 니 다.
프로그램의 메 인 화면 은 다음 과 같 습 니 다.
201637143452275.png (458×181)
세 단추 의 Click 이벤트 처리 프로그램 은 다음 과 같 습 니 다.

    private void btnSelectFile_Click(object sender, EventArgs e)
    {
      if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
      {
        txtFileName.Text = openFileDialog1.FileName ;
      }
    }

    private void btnEncryptFile_Click(object sender, EventArgs e)
    {
      string inFile=txtFileName.Text;
      string outFile = inFile + ".dat";
      string password=txtPassword.Text ;
      DESFile.DESFileClass.EncryptFile(inFile, outFile, password);//    
      //        
      File.Delete(inFile);
      txtFileName.Text = string.Empty;
      MessageBox.Show("    ");
    }

    private void btnDecryptFile_Click(object sender, EventArgs e)
    {
      string inFile = txtFileName.Text;
      string outFile = inFile.Substring(0,inFile.Length - 4);
      string password = txtPassword.Text;
      DESFile.DESFileClass.DecryptFile (inFile, outFile, password);//    
      //        
      File.Delete(inFile);
      txtFileName.Text = string.Empty;
      MessageBox.Show("    ");
    }

     Help      :

using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace DESFile
{
  /// <summary>
  ///      
  /// </summary>
  public class CryptoHelpException : ApplicationException
  {
    public CryptoHelpException(string msg) : base(msg) { }
  }

  /// <summary>
  /// CryptHelp
  /// </summary>
  public class DESFileClass
  {
    private const ulong FC_TAG = 0xFC010203040506CF;

    private const int BUFFER_SIZE = 128 * 1024;

    /// <summary>
    ///     Byte      
    /// </summary>
    /// <param name="b1">Byte  </param>
    /// <param name="b2">Byte  </param>
    /// <returns>true-  </returns>
    private static bool CheckByteArrays(byte[] b1, byte[] b2)
    {
      if (b1.Length == b2.Length)
      {
        for (int i = 0; i < b1.Length; ++i)
        {
          if (b1[i] != b2[i])
            return false;
        }
        return true;
      }
      return false;
    }

    /// <summary>
    ///   DebugLZQ ,http://www.cnblogs.com/DebugLZQ
    /// </summary>
    /// <param name="password">  </param>
    /// <param name="salt"></param>
    /// <returns>    </returns>
    private static SymmetricAlgorithm CreateRijndael(string password, byte[] salt)
    {
      PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, salt, "SHA256", 1000);

      SymmetricAlgorithm sma = Rijndael.Create();
      sma.KeySize = 256;
      sma.Key = pdb.GetBytes(32);
      sma.Padding = PaddingMode.PKCS7;
      return sma;
    }

    /// <summary>
    ///          
    /// </summary>
    private static RandomNumberGenerator rand = new RNGCryptoServiceProvider();

    /// <summary>
    ///          Byte  
    /// </summary>
    /// <param name="count">Byte    </param>
    /// <returns>  Byte  </returns>
    private static byte[] GenerateRandomBytes(int count)
    {
      byte[] bytes = new byte[count];
      rand.GetBytes(bytes);
      return bytes;
    }

    /// <summary>
    ///     
    /// </summary>
    /// <param name="inFile">     </param>
    /// <param name="outFile">       </param>
    /// <param name="password">    </param>
    public static void EncryptFile(string inFile, string outFile, string password)
    {
      using (FileStream fin = File.OpenRead(inFile),
        fout = File.OpenWrite(outFile))
      {
        long lSize = fin.Length; //       
        int size = (int)lSize;
        byte[] bytes = new byte[BUFFER_SIZE]; //   
        int read = -1; //         
        int value = 0;

        //   IV salt
        byte[] IV = GenerateRandomBytes(16);
        byte[] salt = GenerateRandomBytes(16);

        //       
        SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);
        sma.IV = IV;

        //            IV salt
        fout.Write(IV, 0, IV.Length);
        fout.Write(salt, 0, salt.Length);

        //       
        HashAlgorithm hasher = SHA256.Create();
        using (CryptoStream cout = new CryptoStream(fout, sma.CreateEncryptor(), CryptoStreamMode.Write),
          chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))
        {
          BinaryWriter bw = new BinaryWriter(cout);
          bw.Write(lSize);

          bw.Write(FC_TAG);

          //             
          while ((read = fin.Read(bytes, 0, bytes.Length)) != 0)
          {
            cout.Write(bytes, 0, read);
            chash.Write(bytes, 0, read);
            value += read;
          }
          //      
          chash.Flush();
          chash.Close();

          //     
          byte[] hash = hasher.Hash;

          //         
          cout.Write(hash, 0, hash.Length);

          //      
          cout.Flush();
          cout.Close();
        }
      }
    }

    /// <summary>
    ///     
    /// </summary>
    /// <param name="inFile">     </param>
    /// <param name="outFile">       </param>
    /// <param name="password">    </param>
    public static void DecryptFile(string inFile, string outFile, string password)
    {
      //        
      using (FileStream fin = File.OpenRead(inFile),
        fout = File.OpenWrite(outFile))
      {
        int size = (int)fin.Length;
        byte[] bytes = new byte[BUFFER_SIZE];
        int read = -1;
        int value = 0;
        int outValue = 0;

        byte[] IV = new byte[16];
        fin.Read(IV, 0, 16);
        byte[] salt = new byte[16];
        fin.Read(salt, 0, 16);

        SymmetricAlgorithm sma = DESFileClass.CreateRijndael(password, salt);
        sma.IV = IV;

        value = 32;
        long lSize = -1;

        //       ,     
        HashAlgorithm hasher = SHA256.Create();

        using (CryptoStream cin = new CryptoStream(fin, sma.CreateDecryptor(), CryptoStreamMode.Read),
          chash = new CryptoStream(Stream.Null, hasher, CryptoStreamMode.Write))
        {
          //       
          BinaryReader br = new BinaryReader(cin);
          lSize = br.ReadInt64();
          ulong tag = br.ReadUInt64();

          if (FC_TAG != tag)
            throw new CryptoHelpException("     ");

          long numReads = lSize / BUFFER_SIZE;

          long slack = (long)lSize % BUFFER_SIZE;

          for (int i = 0; i < numReads; ++i)
          {
            read = cin.Read(bytes, 0, bytes.Length);
            fout.Write(bytes, 0, read);
            chash.Write(bytes, 0, read);
            value += read;
            outValue += read;
          }

          if (slack > 0)
          {
            read = cin.Read(bytes, 0, (int)slack);
            fout.Write(bytes, 0, read);
            chash.Write(bytes, 0, read);
            value += read;
            outValue += read;
          }

          chash.Flush();
          chash.Close();

          fout.Flush();
          fout.Close();

          byte[] curHash = hasher.Hash;

          //            
          byte[] oldHash = new byte[hasher.HashSize / 8];
          read = cin.Read(oldHash, 0, oldHash.Length);
          if ((oldHash.Length != read) || (!CheckByteArrays(oldHash, curHash)))
            throw new CryptoHelpException("     ");
        }

        if (outValue != lSize)
          throw new CryptoHelpException("       ");
      }
    }
  }
}

암호 화/복호화 결과:
암호 화 D 디스크 에 있 는 1.avi 의 경우 암호 화 된 파일 은 1.avi.dat 이 며,1.avi 파일 로 이름 을 바 꿔 도 열 수 없습니다(파일 이 암호 화 됨).
201637143519084.jpg (523×437)
비밀 번 호 를 입력 하여 복호화 한 후 파일 복호화 가 복구 되 어 순조롭게 열 릴 수 있 습 니 다~
201637143537795.jpg (741×468)

좋은 웹페이지 즐겨찾기