用C#实现AES加密和解密

简介:

AES 是一个新的可以用于保护电子数据的加密算法。明确地说,AES 是一个迭代的、对称密钥分组的密码,它可以使用128、192 和 256 位密钥,并且用 128 位(16字节)分组加密和解密数据。与公共密钥密码使用密钥对不同,对称密钥密码使用相同的密钥加密和解密数据。通过分组密码返回的加密数据 的位数与输入数据相同。迭代加密使用一个循环结构,在该循环中重复置换(permutations )和替换(substitutions)输入数据。

需要加入引用 using System.Security.Cryptography;

 

 
  1. /// <summary> 
  2.         /// 有密码的AES加密   
  3.         /// </summary> 
  4.         /// <param name="text">加密字符</param> 
  5.         /// <param name="password">加密的密码</param> 
  6.         /// <param name="iv">密钥</param> 
  7.         /// <returns></returns> 
  8.         public static string AESEncrypt(string text, string password, string iv)  
  9.         {  
  10.             RijndaelManaged rijndaelCipher = new RijndaelManaged();  
  11.  
  12.             rijndaelCipher.Mode = CipherMode.CBC;  
  13.  
  14.             rijndaelCipher.Padding = PaddingMode.PKCS7;  
  15.  
  16.             rijndaelCipher.KeySize = 128;  
  17.  
  18.             rijndaelCipher.BlockSize = 128;  
  19.  
  20.             byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);  
  21.  
  22.             byte[] keyBytes = new byte[16];  
  23.  
  24.             int len = pwdBytes.Length;  
  25.  
  26.             if (len > keyBytes.Length) len = keyBytes.Length;  
  27.  
  28.             System.Array.Copy(pwdBytes, keyBytes, len);  
  29.  
  30.             rijndaelCipher.Key = keyBytes;  
  31.  
  32.  
  33.             byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);  
  34.             rijndaelCipher.IV = ivBytes;  
  35.  
  36.             ICryptoTransform transform = rijndaelCipher.CreateEncryptor();  
  37.  
  38.             byte[] plainText = Encoding.UTF8.GetBytes(text);  
  39.  
  40.             byte[] cipherBytes = transform.TransformFinalBlock(plainText, 0, plainText.Length);  
  41.  
  42.             return Convert.ToBase64String(cipherBytes);  
  43.  
  44.         }  
  45.  
  46.         /// <summary> 
  47.         /// 随机生成密钥  
  48.         /// </summary> 
  49.         /// <returns></returns> 
  50.         public static string GetIv(int n)  
  51.         {  
  52.             char[] arrChar = new char[]{  
  53.            'a','b','d','c','e','f','g','h','i','j','k','l','m','n','p','r','q','s','t','u','v','w','z','y','x',  
  54.            '0','1','2','3','4','5','6','7','8','9',  
  55.            'A','B','C','D','E','F','G','H','I','J','K','L','M','N','Q','P','R','T','S','V','U','W','X','Y','Z'  
  56.           };  
  57.  
  58.             StringBuilder num = new StringBuilder();  
  59.  
  60.             Random rnd = new Random(DateTime.Now.Millisecond);  
  61.             for (int i = 0; i < n; i++)  
  62.             {  
  63.                 num.Append(arrChar[rnd.Next(0, arrChar.Length)].ToString());  
  64.  
  65.             }  
  66.  
  67.             return num.ToString();  
  68.         }  
  69.  
  70.         /// <summary> 
  71.         /// AES解密  
  72.         /// </summary> 
  73.         /// <param name="text"></param> 
  74.         /// <param name="password"></param> 
  75.         /// <param name="iv"></param> 
  76.         /// <returns></returns> 
  77.         public static string AESDecrypt(string text, string password, string iv)  
  78.         {  
  79.             RijndaelManaged rijndaelCipher = new RijndaelManaged();  
  80.  
  81.             rijndaelCipher.Mode = CipherMode.CBC;  
  82.  
  83.             rijndaelCipher.Padding = PaddingMode.PKCS7;  
  84.  
  85.             rijndaelCipher.KeySize = 128;  
  86.  
  87.             rijndaelCipher.BlockSize = 128;  
  88.  
  89.             byte[] encryptedData = Convert.FromBase64String(text);  
  90.  
  91.             byte[] pwdBytes = System.Text.Encoding.UTF8.GetBytes(password);  
  92.  
  93.             byte[] keyBytes = new byte[16];  
  94.  
  95.             int len = pwdBytes.Length;  
  96.  
  97.             if (len > keyBytes.Length) len = keyBytes.Length;  
  98.  
  99.             System.Array.Copy(pwdBytes, keyBytes, len);  
  100.  
  101.             rijndaelCipher.Key = keyBytes;  
  102.  
  103.             byte[] ivBytes = System.Text.Encoding.UTF8.GetBytes(iv);  
  104.             rijndaelCipher.IV = ivBytes;  
  105.  
  106.             ICryptoTransform transform = rijndaelCipher.CreateDecryptor();  
  107.  
  108.             byte[] plainText = transform.TransformFinalBlock(encryptedData, 0, encryptedData.Length);  
  109.  
  110.             return Encoding.UTF8.GetString(plainText);  
  111.  
  112.         } 

 

本文转自linzheng 51CTO博客,原文链接:http://blog.51cto.com/linzheng/1078718



相关文章
|
1月前
|
Linux 数据安全/隐私保护 Windows
aes加密在linux下会生成随机key的解决办法
aes加密在linux下会生成随机key的解决办法
18 2
|
2月前
|
PHP 数据安全/隐私保护
在PHP中使用AES进行加密和解密
在PHP中使用AES进行加密和解密
|
3月前
|
存储 算法 安全
【加密算法】AES对称加密算法简介
【加密算法】AES对称加密算法简介
|
3月前
|
安全 小程序 数据安全/隐私保护
aes加密算法python版本
aes加密算法python版本
44 0
|
4月前
|
算法 安全 物联网
全面了解AES加密:入门指南(二)
全面了解AES加密:入门指南
|
20天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
4月前
|
存储 安全 算法
全面了解AES加密:入门指南(一)
全面了解AES加密:入门指南
|
4月前
|
存储 安全 Go
加密必备技能:深入理解RSA与AES
加密必备技能:深入理解RSA与AES
83 0
|
4月前
|
存储 前端开发 JavaScript
JavaScript学习 -- AES加密算法
JavaScript学习 -- AES加密算法
64 0
|
4月前
|
算法 Java 数据库连接
实现 MyBatis-Plus 中的配置加密功能(使用 AES 算法)
实现 MyBatis-Plus 中的配置加密功能(使用 AES 算法)
194 0