public class EncryptionAndDecryption { /// <summary> /// 加密文件 /// </summary> /// <param name="bytesToBeEncrypted"></param> /// <param name="passwordBytes"></param> /// <returns></returns> public byte[] AES_Encrypt(byte[] bytesToBeEncrypted, byte[] passwordBytes) { byte[] encryptedBytes = null; //把盐放在这里,换成符合你口味的: //salt字节必须至少为8个字节。 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; } /// <summary> /// 解密文件 /// </summary> /// <param name="bytesToBeDecrypted"></param> /// <param name="passwordBytes"></param> /// <returns></returns> public byte[] AES_Decrypt(byte[] bytesToBeDecrypted, byte[] passwordBytes) { byte[] decryptedBytes = null; //把盐放在这里,换成符合你口味的: //salt字节必须至少为8个字节。 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; } /// <summary> /// 字符串加密 /// </summary> /// <param name="input"></param> /// <param name="password"></param> /// <returns></returns> public string EncryptText(string input, string password) { // Get the bytes of the string 获取字符串的字节数 byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input); byte[] passwordBytes = Encoding.UTF8.GetBytes(password); // Hash the password with SHA256 用SHA256散列密码 passwordBytes = SHA256.Create().ComputeHash(passwordBytes); byte[] bytesEncrypted = AES_Encrypt(bytesToBeEncrypted, passwordBytes); string result = Convert.ToBase64String(bytesEncrypted); return result; } /// <summary> /// 字符串解密 /// </summary> /// <param name="input"></param> /// <param name="password"></param> /// <returns></returns> public string DecryptText(string input, string password) { // Get the bytes of the string 获取字符串的字节数 byte[] bytesToBeDecrypted = Convert.FromBase64String(input); byte[] passwordBytes = Encoding.UTF8.GetBytes(password); passwordBytes = SHA256.Create().ComputeHash(passwordBytes); byte[] bytesDecrypted = AES_Decrypt(bytesToBeDecrypted, passwordBytes); string result = Encoding.UTF8.GetString(bytesDecrypted); return result; } }
调用class,加密字符串,页面上可以看到效果
EncryptionAndDecryption ed = new EncryptionAndDecryption(); //加密 123456abc,key是111aaa var str = ed.EncryptText("123456abc","111aaa"); //加密过后的字符串 ViewBag.encryptStr = str; //解密后得到 123456abc ViewBag.decryptStr = ed.DecryptText(str,"111aaa");
<div>加密:@ViewBag.encryptStr<br />解密:@ViewBag.decryptStr</div>