重点:
1. KEY 和 IV 转 byte[] 时的编码。
2.要加密的字符串转 byte[] 时的编码。
3.AES 的PADDING,MODE。
4.加密后的byte[] 转字符串时的编码。
先看加密代码:
public static string AesEncrypt(string content, string aesKey, string aesIV) { byte[] byteKEY = Encoding.UTF8.GetBytes(aesKey); byte[] byteIV = Encoding.UTF8.GetBytes(aesIV); byte[] byteContnet = Encoding.UTF8.GetBytes(content); var _aes = new RijndaelManaged(); _aes.Padding = PaddingMode.PKCS7; _aes.Mode = CipherMode.CBC; _aes.Key = byteKEY; _aes.IV = byteIV; var _crypto = _aes.CreateEncryptor(byteKEY, byteIV); byte[] decrypted = _crypto.TransformFinalBlock( byteContnet, 0, byteContnet.Length); _crypto.Dispose(); return Convert.ToBase64String(decrypted); }
byte[] byteKEY = Encoding.UTF8.GetBytes(aesKey);
byte[] byteIV = Encoding.UTF8.GetBytes(aesIV);
KEY 和 IV 转 byte[] 时的编码使用UTF8。
byte[] byteContnet = Encoding.UTF8.GetBytes(content);
要加密的字符串转 byte[] 时的编码使用UTF8。
_aes.Padding = PaddingMode.PKCS7;
_aes.Mode = CipherMode.CBC;
AES 的PADDING 为PKCS7 (对应JAVA的PKCS5Padding) ,MODE 为 CBC (CBC模式需要有IV,ECB模式不需要IV) 。
return Convert.ToBase64String(decrypted);
加密后的byte[] 转字符串时的编码,使用Base64。
--解密过程也大致相同。
1.先把密文字符串Base64 解码为 byte[] 。
2.解密后的byte[] ,再用UTF8编码还原为String.
解密代码:
/// <summary> /// 解密 /// </summary> /// <param name="decryptStr">要解密的串</param> /// <param name="aesKey">密钥</param> /// <param name="aesIV">IV</param> /// <returns></returns> public static string AesDecrypt(string decryptStr, string aesKey,string aesIV) { byte[] byteKEY = Encoding.UTF8.GetBytes(aesKey); byte[] byteIV = Encoding.UTF8.GetBytes(aesIV); byte[] byteDecrypt = System.Convert.FromBase64String(decryptStr); var _aes = new RijndaelManaged(); _aes.Padding = PaddingMode.PKCS7; _aes.Mode = CipherMode.CBC; _aes.Key = byteKEY; _aes.IV = byteIV; var _crypto = _aes.CreateDecryptor(byteKEY, byteIV); byte[] decrypted = _crypto.TransformFinalBlock( byteDecrypt, 0, byteDecrypt.Length); _crypto.Dispose(); return Encoding.UTF8.GetString(decrypted); }
--
完整的AES UTIL , AES CBC ,PCKS7。
using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; namespace Common.Utils { public static class AesUtil { /// <summary> /// 解密 /// </summary> /// <param name="decryptStr">要解密的串</param> /// <param name="aesKey">密钥</param> /// <param name="aesIV">IV</param> /// <returns></returns> public static string AesDecrypt(string decryptStr, string aesKey,string aesIV) { byte[] byteKEY = Encoding.UTF8.GetBytes(aesKey); byte[] byteIV = Encoding.UTF8.GetBytes(aesIV); byte[] byteDecrypt = System.Convert.FromBase64String(decryptStr); var _aes = new RijndaelManaged(); _aes.Padding = PaddingMode.PKCS7; _aes.Mode = CipherMode.CBC; _aes.Key = byteKEY; _aes.IV = byteIV; var _crypto = _aes.CreateDecryptor(byteKEY, byteIV); byte[] decrypted = _crypto.TransformFinalBlock( byteDecrypt, 0, byteDecrypt.Length); _crypto.Dispose(); return Encoding.UTF8.GetString(decrypted); } public static string AesEncrypt(string content, string aesKey, string aesIV) { byte[] byteKEY = Encoding.UTF8.GetBytes(aesKey); byte[] byteIV = Encoding.UTF8.GetBytes(aesIV); byte[] byteContnet = Encoding.UTF8.GetBytes(content); var _aes = new RijndaelManaged(); _aes.Padding = PaddingMode.PKCS7; _aes.Mode = CipherMode.CBC; _aes.Key = byteKEY; _aes.IV = byteIV; var _crypto = _aes.CreateEncryptor(byteKEY, byteIV); byte[] decrypted = _crypto.TransformFinalBlock( byteContnet, 0, byteContnet.Length); _crypto.Dispose(); return Convert.ToBase64String(decrypted); } } }
--
调用DEMO,WINFORM写的。
using Common.Utils; using System; using System.Windows.Forms; namespace AES加密 { public partial class Form1 : Form { string _aesKey = "1234567890123456"; string _aesIV = "abcdefghABCDEFGH"; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } /// <summary> /// 加密 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btmJiaMi_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtDaiJiaMi.Text)) { MessageBox.Show("待加密字符串 为空!"); return; } string content = txtDaiJiaMi.Text; txtJiaMiHou.Text = AesUtil.AesEncrypt(content, _aesKey, _aesIV); } catch (Exception ex) { MessageBox.Show(ex.Message); } } /// <summary> /// 解密 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnJieMi_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(txtJiaMiHou.Text)) { MessageBox.Show("加密后字符串 为空!"); return; } string content = txtJiaMiHou.Text; txtJieMiHou.Text = AesUtil.AesDecrypt(content, _aesKey, _aesIV); } catch (Exception ex) { MessageBox.Show(ex.Message); } } } }
--
只要 KEY ,IV , MODE,PADDING ,密文编码,明文编码这几项统一,和其它编程语言加解密就无障碍了。
--