重点:
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[] 转字符串时的编码,使用Base64。
--解密过程也大致相同。
1.先把密文字符串Base64 解码为 byte[] 。
2.解密后的byte[] ,再用UTF8编码还原为String.
解密过程
/// 解密
/// </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 ,密文编码,明文编码这几项统一,和其它编程语言加解密就无障碍了。