如何

2017-10-18 71 views
-1

我做節目到一個文件夾中的所有文件進行加密,以不被1如何

所以加密文件1的文件夾中的文件進行加密,這是我的AES 256加密

public class CoreEncryption 
    { 
     public static byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes) 
     { 
      byte[] encryptedBytes = null; 

      // Set your salt here, change it to meet your flavor: 
      // The salt bytes must be at least 8 bytes. 
      byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (RijndaelManaged AES = new RijndaelManaged()) 
       { 
        AES.KeySize = 256; 
        AES.BlockSize = 128; 

        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); 
        AES.Key = key.GetBytes(AES.KeySize/8); 
        AES.IV = key.GetBytes(AES.BlockSize/8); 

        AES.Mode = CipherMode.CBC; 

        using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write)) 
        { 
         cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length); 
         cs.Close(); 
        } 
        encryptedBytes = ms.ToArray(); 
       } 
      } 

      return encryptedBytes; 
     } 
    } 

    public class CoreDecryption 
    { 
     public static byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes) 
     { 
      byte[] decryptedBytes = null; 

      // Set your salt here, change it to meet your flavor: 
      // The salt bytes must be at least 8 bytes. 
      byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 }; 

      using (MemoryStream ms = new MemoryStream()) 
      { 
       using (RijndaelManaged AES = new RijndaelManaged()) 
       { 
        AES.KeySize = 256; 
        AES.BlockSize = 128; 

        var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, 1000); 
        AES.Key = key.GetBytes(AES.KeySize/8); 
        AES.IV = key.GetBytes(AES.BlockSize/8); 

        AES.Mode = CipherMode.CBC; 

        using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write)) 
        { 
         cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length); 
         cs.Close(); 
        } 
        decryptedBytes = ms.ToArray(); 
       } 
      } 

      return decryptedBytes; 
     } 
    } 
代碼

這開始加密和解密文件

public class EncryptionFile 
    { 
     public void EncryptFile(string file, string password) 
     { 

      byte[] bytesToBeEncrypted = File.ReadAllBytes(file); 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 

      // Hash the password with SHA256 
      passwordBytes = SHA256.Create().ComputeHash(passwordBytes); 

      byte[] bytesEncrypted = CoreEncryption.AES_Encrypt(bytesToBeEncrypted, passwordBytes); 

      string fileEncrypted = file; 

      File.WriteAllBytes(fileEncrypted, bytesEncrypted); 
     } 
    } 

    public class DecryptionFile 
    { 
     public void DecryptFile(string fileEncrypted, string password) 
     { 

      byte[] bytesToBeDecrypted = File.ReadAllBytes(fileEncrypted); 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); 
      passwordBytes = SHA256.Create().ComputeHash(passwordBytes); 

      byte[] bytesDecrypted = CoreDecryption.AES_Decrypt(bytesToBeDecrypted, passwordBytes); 

      string file = fileEncrypted; 
      File.WriteAllBytes(file, bytesDecrypted); 
     } 
    } 

所以,現在,我想輸入一個文件夾路徑,那我的加密過程隱窩中,所選擇文件夾中的每個文件。我怎樣才能做到這一點 ?

+0

爲什麼你不能只是循環遍歷所有的文件?請編輯您的問題以包含您嘗試過的內容。加密部分在這裏有點不相關。在說,你的加密代碼是相當有缺陷的。它不能對大於2GB的文件進行加密,並且由於您爲每次加密操作重新計算相同密碼的密鑰,因此速度會非常慢。你也從密碼中得到了IV,這是非常糟糕的做法,而是使用隨機IV。 –

回答

0

嗯.... 就這樣? 它工作正常(Windows10專業版x64/Visual Studio 2017)。

祝你好運。

//! -------------------------------------------------- --------------

static void Test1() 
    { 

     string[] files = Directory.GetFiles(@"D:\_test", "*", SearchOption.AllDirectories); 

     EncryptionFile enc = new EncryptionFile(); 
     //DecryptionFile dec = new DecryptionFile(); 

     string password = "abcd"; 

     for (int i=0; i<files.Length; i++) 
     { 
      Console.WriteLine(files[i]); 
      enc.EncryptFile(files[i], password); 
      //dec.DecryptFile(files[i], password); 
     } 
    }