[C#]AES加密算法实现

      密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

(以上来自百度)

c#aes算法实现的辅助类

  1     public static class AesSecret
  2     {
  3         #region 秘钥对
  4 
  5         private const string saltString = "Wolfy@home";
  6         private const string pWDString = "home@Wolfy";
  7 
  8         #endregion
  9 
 10         #region 加/解密算法
 11 
 12         /// <summary>
 13         /// 解密
 14         /// </summary>
 15         /// <param name="sSource">需要解密的内容</param>
 16         /// <returns></returns>
 17         public static byte[] DecryptString(string strSource)
 18         {
 19             byte[] encryptBytes = Convert.FromBase64String(strSource);
 20             byte[] salt = Encoding.UTF8.GetBytes(saltString);
 21             //提供高级加密标准 (AES) 对称算法的托管实现。
 22             AesManaged aes = new AesManaged();
 23             //通过使用基于 System.Security.Cryptography.HMACSHA1 的伪随机数生成器,实现基于密码的密钥派生功能 (PBKDF2)。
 24             Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(pWDString, salt);
 25             // 获取或设置加密操作的块大小(以位为单位)。
 26             aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
 27             //获取或设置用于对称算法的密钥大小(以位为单位)。
 28             aes.KeySize = aes.LegalKeySizes[0].MaxSize;
 29             //获取或设置用于对称算法的密钥。
 30             aes.Key = rfc.GetBytes(aes.KeySize / 8);
 31             //获取或设置用于对称算法的初始化向量 (IV)。
 32             aes.IV = rfc.GetBytes(aes.BlockSize / 8);
 33 
 34             // 用当前的 Key 属性和初始化向量 IV 创建对称解密器对象
 35             System.Security.Cryptography.ICryptoTransform decryptTransform = aes.CreateDecryptor();
 36 
 37             // 解密后的输出流
 38             MemoryStream decryptStream = new MemoryStream();
 39 
 40             // 将解密后的目标流(decryptStream)与解密转换(decryptTransform)相连接
 41             CryptoStream decryptor = new CryptoStream(
 42                 decryptStream, decryptTransform, CryptoStreamMode.Write);
 43 
 44             // 将一个字节序列写入当前 CryptoStream (完成解密的过程)
 45             decryptor.Write(encryptBytes, 0, encryptBytes.Length);
 46             decryptor.Close();
 47 
 48             // 将解密后所得到的流转换为字符串
 49             return decryptStream.ToArray();
 50 
 51         }
 52 
 53         /// <summary>
 54         /// 加密
 55         /// </summary>
 56         /// <param name="sSource">需要加密的内容</param>
 57         /// <returns></returns>
 58         public static byte[] EncryptString(string strSource)
 59         {
 60             byte[] data = UTF8Encoding.UTF8.GetBytes(strSource);
 61             byte[] salt = UTF8Encoding.UTF8.GetBytes(saltString);
 62 
 63             // AesManaged - 高级加密标准(AES) 对称算法的管理类
 64             AesManaged aes = new AesManaged();
 65 
 66             // Rfc2898DeriveBytes - 通过使用基于 HMACSHA1 的伪随机数生成器,实现基于密码的密钥派生功能 (PBKDF2 - 一种基于密码的密钥派生函数)
 67             // 通过 密码 和 salt 派生密钥
 68             Rfc2898DeriveBytes rfc = new Rfc2898DeriveBytes(pWDString, salt);
 69 
 70             /*
 71             * AesManaged.BlockSize - 加密操作的块大小(单位:bit)
 72             * AesManaged.LegalBlockSizes - 对称算法支持的块大小(单位:bit)
 73             * AesManaged.KeySize - 对称算法的密钥大小(单位:bit)
 74             * AesManaged.LegalKeySizes - 对称算法支持的密钥大小(单位:bit)
 75             * AesManaged.Key - 对称算法的密钥
 76             * AesManaged.IV - 对称算法的密钥大小
 77             * Rfc2898DeriveBytes.GetBytes(int 需要生成的伪随机密钥字节数) - 生成密钥
 78             */
 79 
 80             aes.BlockSize = aes.LegalBlockSizes[0].MaxSize;
 81             aes.KeySize = aes.LegalKeySizes[0].MaxSize;
 82             aes.Key = rfc.GetBytes(aes.KeySize / 8);
 83             aes.IV = rfc.GetBytes(aes.BlockSize / 8);
 84 
 85             // 用当前的 Key 属性和初始化向量 IV 创建对称加密器对象
 86             ICryptoTransform encryptTransform = aes.CreateEncryptor();
 87 
 88             // 加密后的输出流
 89             MemoryStream encryptStream = new MemoryStream();
 90 
 91             // 将加密后的目标流(encryptStream)与加密转换(encryptTransform)相连接
 92             CryptoStream encryptor = new CryptoStream
 93                 (encryptStream, encryptTransform, CryptoStreamMode.Write);
 94 
 95             // 将一个字节序列写入当前 CryptoStream (完成加密的过程)
 96             encryptor.Write(data, 0, data.Length);
 97             encryptor.Close();
 98 
 99             return encryptStream.ToArray();
100         }
101 
102         #endregion
103     }

可以和序列化配合使用。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C#中的AES加密算法实现主要基于System.Security.Cryptography命名空间下的Aes类。它提供了两种模式,分别是CBC和ECB模式,其中CBC模式需要指定一个初始化向量(IV)。下面是一个简单的示例代码: ```csharp using System; using System.Security.Cryptography; using System.Text; public class AesEncryption { public static string Encrypt(string plainText, string key, string iv) { byte[] plainBytes = Encoding.UTF8.GetBytes(plainText); byte[] keyBytes = Encoding.UTF8.GetBytes(key); byte[] ivBytes = Encoding.UTF8.GetBytes(iv); using (Aes aes = Aes.Create()) { aes.Key = keyBytes; aes.IV = ivBytes; aes.Mode = CipherMode.CBC; ICryptoTransform encryptor = aes.CreateEncryptor(); byte[] encryptedBytes = encryptor.TransformFinalBlock(plainBytes, 0, plainBytes.Length); string encryptedText = Convert.ToBase64String(encryptedBytes); return encryptedText; } } public static string Decrypt(string encryptedText, string key, string iv) { byte[] encryptedBytes = Convert.FromBase64String(encryptedText); byte[] keyBytes = Encoding.UTF8.GetBytes(key); byte[] ivBytes = Encoding.UTF8.GetBytes(iv); using (Aes aes = Aes.Create()) { aes.Key = keyBytes; aes.IV = ivBytes; aes.Mode = CipherMode.CBC; ICryptoTransform decryptor = aes.CreateDecryptor(); byte[] plainBytes = decryptor.TransformFinalBlock(encryptedBytes, 0, encryptedBytes.Length); string plainText = Encoding.UTF8.GetString(plainBytes); return plainText; } } } ``` 在上面的代码中,我们通过调用Create()方法来创建一个Aes对象,并设置其Key、IV和Mode属性。然后我们使用CreateEncryptor()方法创建一个加密器对象,使用TransformFinalBlock()方法进行加密操作。解密操作则是使用CreateDecryptor()方法创建一个解密器对象,同样使用TransformFinalBlock()方法进行解密操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值