c#AES加密解密
AES是一个对称密码,旨在取代DES成为广泛使用的标准。密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。
AES加密数据块分组长度必须为128比特,**长度可以是128比特、192比特、256比特中的任意一个(如果数据块及**长度不足时,会补齐)。AES加密有很多轮的重复和变换。大致步骤如下:1、**扩展(KeyExpansion),2、初始轮(Initial Round),3、重复轮(Rounds),每一轮又包括:SubBytes、ShiftRows、MixColumns、AddRoundKey,4、最终轮(Final Round),最终轮没有MixColumns。
注:经过个人测试,同一个字符串在不同设备,地域解密,加密是不一样的,必须加密和解密的秘钥要是一样的,才能解密成功;
下面我们就来学习一下C#里如何利用AES加密解密
其实AES加解密的代码大都一致,可以从网上复制过来直接调用的
1.创建一个web窗体Form1.cs来测试
如:
后台代码:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Security.Cryptography;//记得要引入该类库 using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace AES加密解密 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } /// <summary> /// AES加密 /// </summary> /// <param name="encryptStr">明文</param> /// <param name="key">**</param> /// <returns></returns> public static string Encrypt(string encryptStr, string key) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(encryptStr); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); }//ToBase64String的秘钥为32位 /// <summary> /// AES解密 /// </summary> /// <param name="decryptStr">密文</param> /// <param name="key">**</param> /// <returns></returns> internal static string Decrypt(string decryptStr, string key) { byte[] keyArray = UTF8Encoding.UTF8.GetBytes(key); byte[] toEncryptArray = Convert.FromBase64String(decryptStr); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return UTF8Encoding.UTF8.GetString(resultArray); } private void button1_Click(object sender, EventArgs e) {//加密 richTextBox1.Text =Encrypt(textBox1.Text,"12345678901234567890123456789012");//AES256加密要32位键值 }//秘钥位数不对也不能加解密成功 private void button2_Click(object sender, EventArgs e) {//解密 richTextBox2.Text = Decrypt(richTextBox1.Text, "12345678901234567890123456789012");//(密文,秘钥) } private void Form1_Load(object sender, EventArgs e) { } } }
2.运行结果
3.当你把解密后的字符串拿到网上在线解密时,诶呀,不一样
加密在一定程度上保证了你数据的安全
加密有对称加密和不对称加密,对称加密一般有两个秘钥,一个为公钥就是大家都知道的,一个为私钥只有自己知道。