重点:

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

--

 

C#.NET AES CBC 加密的更多相关文章

  1. JAVA AES CBC 加密 解密

    AES 256 , KEY 的长度为 32字节(32*8=256bit). AES 128 , KEY 的长度为 16字节(16*8=128bit) CBC 模式需要IV, IV的值是固定写死,还是当 ...

  2. 【java工具】AES CBC加密

    一.定义 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先 ...

  3. Aes CBC加密

    <?php namespace app\components; use yii; class Aes { /** * This was AES-128 / CBC / PKCS5Padding ...

  4. java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法

    在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...

  5. AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密解密源码

    一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...

  6. AES加密解密 助手类 CBC加密模式

    "; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...

  7. AES/CBC/PKCS7Padding加密方式

    在网上找了大半天资料,终于找到一个可以用的 public static class AES { // 算法名称 final static String KEY_ALGORITHM = "AE ...

  8. linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法

    用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...

  9. php AES cbc模式 pkcs7 128位加密解密(微信小程序)

    PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '12345 ...

  10. php实现AES/CBC/PKCS5Padding加密解密(又叫:对称加密)

    今天在做一个和java程序接口的架接,java那边需要我这边(PHP)对传过去的值进行AES对称加密,接口返回的结果也是加密过的(就要用到解密),然后试了很多办法,也一一对应了AES的key密钥值,偏 ...

随机推荐

  1. 力扣9(java)-回文数(简单)

    题目: 给你一个整数 x ,如果 x 是一个回文整数,返回 true :否则,返回 false . 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 例如,121 是回文,而 123 不 ...

  2. CF1857G Counting Graphs 题解

    题目描述 给定一棵最小生成树,求有多少张图的最小生成树是给定的树,并且这张图的所有边边权不超过 \(S\). 思路 考虑在最小生成树中加边. 我们回顾一下 Kruskal 的过程: 找到没被用过的,最 ...

  3. 阿里云PolarDB开源数据库社区与 Tapdata 联合共建开放数据技术生态

    ​简介:近日,阿里云PolarDB开源数据库社区宣布将与 Tapdata 联合共建开放数据技术生态. 近日,阿里云PolarDB开源数据库社区宣布将与 Tapdata 联合共建开放数据技术生态.在此之 ...

  4. 阿里巴巴云原生混部系统 Koordinator 正式开源

    ​简介: 脱胎于阿里巴巴内部,经过多年双 11 打磨,每年为公司节省数十亿的混部系统 Koordinator 今天宣布正式开源.通过开源,我们希望将更好的混部能力.调度能力开放到整个行业,帮助企业客户 ...

  5. Apsara Stack 技术百科 | 标准化的云时代:一云多芯

    ​简介:随着今年云栖大会现场平头哥的自研云芯片倚天710发布,以及众多新兴厂商的芯片发布,将有越来越多的类型芯片进入到主流市场,"多芯"的架构将在数据中心中越来越常见,阿里云混合云 ...

  6. 技术实践第二期|Flutter异常捕获

    ​简介:应用性能稳定是良好用户体验中非常关键的一环,为了更好保障应用性能稳定,异常捕获在保证线上产品稳定中扮演着至关重要的角色.我们团队在推出了U-APM移动应用性能监控的产品后,帮助开发者定位并解决 ...

  7. IphoneX(10) 重启/关机, 强制重启/关机

    正常关机是同时长按 音量+ 和 右侧电源键,屏幕出现滑动按钮进行关机. 注意截图是同时短按 音量+ 和 右侧电源键. 强制关机是按照顺序按三个键:音量+   音量-  长按右侧键 Other:苹果X怎 ...

  8. Centos下虚拟环境的创建以及python3安装

    1.python3自己安装 ln -s /usr/local/python3/bin/python3.6 /usr/bin/python3 ln -s /usr/local/python3/bin/p ...

  9. 大模型_2:Prompt Engineering

    目录: 1.提示工程简介 2.如何写好提示词 2.1 描述清晰 2.2 角色扮演 2.3 提供示例 2.4 复杂任务分解 2.5 使用格式符区分语义 2.6 情感和物质激励 2.7 使用英语 2.8  ...

  10. 这几个好用的 Google 搜索技巧,让你飞起!

    搜索能力是被绝大多数人低估一项基本素质,绝大部分做编程技术相关的朋友应该都知道如何使用 Google,但是并不知道如何利用它的潜力.其实不管是 Google 还是 百度,会搜索的人一样都可以查找到需要 ...