• C#.NET AES CBC 加密


    重点:

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

    --

     
  • 相关阅读:
    .net 自带的oracleclient 的一点小问题
    重新感受Windows 的激情
    三点定面的算法实现
    回归.NET的世界
    .NET 基础题, 可以做面试题, 不断更新 20111
    C#根据字符串生成唯一的数字
    最近看的书
    代码中的注释, 需要面向功能注释,而非使用注释
    html 页面嵌入 Silverlight , Silverlight控件覆盖悬浮HTML元素的解决方法.
    gitlab clone或者pull 仓库
  • 原文地址:https://www.cnblogs.com/runliuv/p/13247119.html
Copyright © 2020-2023  润新知