2016-07-03 59 views
0

有没有办法用AES加密数据?我希望至少使用128位加密密钥。C#加密数据AES

我试着用微软提供的AES默认类,但是我做不了很多......我无法设置Key长度。

是否有另一个类可以使用?

+1

http://yossi-yakubov.blogspot.co.id/2010/07 /aes-encryption-using-c-short-way.html –

回答

1

是的。您可以使用如下的代码在http://www.codeproject.com/Articles/769741/Csharp-AES-bits-Encryption-Library-with-Salt

您可以使用RIJNDAEL

首先,你需要包括using System.Security.Cryptography;

public 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 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 void EncryptFile(string filename, string outfilename, string psw) 
     { 
      string file = filename; 
      string password = psw; 

      byte[] bytesToBeEncrypted = File.ReadAllBytes(file); //read bytes to encrypt them 
      byte[] passwordBytes = Encoding.UTF8.GetBytes(password); //read with UTF8 encoding the password. 
      passwordBytes = SHA256.Create().ComputeHash(passwordBytes); //hash the psw 

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

      string fileEncrypted = outfilename; 

      File.WriteAllBytes(fileEncrypted, bytesEncrypted); 
     } 
     public void DecryptFile(string filename, string outfilename, string psw) 
     { 
      string fileEncrypted = filename; 
      string password = psw; 

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

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

      string file = outfilename; 
      File.WriteAllBytes(file, bytesDecrypted); 
     } 
+1

重要的是要注意'AES.BlockSize = 128'是关键,这就是'Rijndael'AES的原因。 – zaph

+0

@zaph是的!谢谢...你对代码有什么看法?可以吗? –

+0

该方案看起来不错,关键是正确的来自密码,CBC模式是好的,有一个关于填充的假设,如果它在代码中是明确的,我会更快乐。没有检查是否使用了正确的解密密钥,但许多人不需要这样做,如果您需要添加加密认证。我不知道C#所以不能对此发表评论。 – zaph