C#.NET AES CBC 加密

发布时间 2023-08-04 14:26:44作者: 多见多闻

重点:

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 ,密文编码,明文编码这几项统一,和其它编程语言加解密就无障碍了。