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

--
C#.NET AES CBC 加密的更多相关文章
- JAVA AES CBC 加密 解密
AES 256 , KEY 的长度为 32字节(32*8=256bit). AES 128 , KEY 的长度为 16字节(16*8=128bit) CBC 模式需要IV, IV的值是固定写死,还是当 ...
- 【java工具】AES CBC加密
一.定义 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准.这个标准用来替代原先 ...
- Aes CBC加密
<?php namespace app\components; use yii; class Aes { /** * This was AES-128 / CBC / PKCS5Padding ...
- java PKCS7Padding 加密Cannot find any provider supporting AES/CBC/PKCS7Padding 解决办法
在java中用aes256进行加密,但是发现java里面不能使用PKCS7Padding,而java中自带的是PKCS5Padding填充,那解决办法是,通过BouncyCastle组件来让java里 ...
- AES在线加密解密-附AES128,192,256,CBC,CFB,ECB,OFB,PCBC各种加密解密源码
一.AES在线加密解密:AES 128/192/256位CBC/CFB/ECB/OFB/PCBC在线加密解密|在线工具|在线助手|在线生成|在线制作 http://www.it399.com/aes ...
- AES加密解密 助手类 CBC加密模式
"; string result1 = AESHelper.AesEncrypt(str); string result2 = AESHelper.AesDecrypt(result1); ...
- AES/CBC/PKCS7Padding加密方式
在网上找了大半天资料,终于找到一个可以用的 public static class AES { // 算法名称 final static String KEY_ALGORITHM = "AE ...
- linux上java解加密(AES/CBC)异常:java.lang.SecurityException: JCE cannot authenticate the provider BC办法
用mapreduce做数据清洗的时候,需要对数据进行解密,加密方法是:AES/CBC/PKCS7Padding,由于java本身不支持,需要添加依赖,用的依赖是: <dependency> ...
- php AES cbc模式 pkcs7 128位加密解密(微信小程序)
PHP AES CBC模式PKCS7 128位加密 加密: $key = '1234567812345678'; $iv = '1234567890123456'; $message = '12345 ...
- php实现AES/CBC/PKCS5Padding加密解密(又叫:对称加密)
今天在做一个和java程序接口的架接,java那边需要我这边(PHP)对传过去的值进行AES对称加密,接口返回的结果也是加密过的(就要用到解密),然后试了很多办法,也一一对应了AES的key密钥值,偏 ...
随机推荐
- Apsara Stack 技术百科 | 浅谈阿里云混合云新一代运维平台演进与实践
简介:随着企业业务规模扩大和复杂化及云计算.大数据等技术的不断发展,大量传统企业希望用上云来加速其数字化转型,以获得虚拟化.软件化.服务化.平台化的红利.在这个过程中,因为软件资产规模持续增大而导致 ...
- 案例|自建or现成工具?小型创业团队敏捷研发探索
简介: 实践和踩坑建议. 我是刘永良,是一名全栈开发者也是一名创业者,来自济南--一个目前被称为互联网洼地的地方.2020年4月和三位志同道合的朋友,在济南共同创建了山东旷野网络科技有限公司,主要从事 ...
- Nacos 开源、自研、商业化三位一体战略解读
简介: Nacos作为整个阿里云原生三位战略中的核心组成部分,我们在2018年以Configserver/VIPServer/Diamond为基础通过Nacos开源输出阿里十年沉淀的注册中心和配置中心 ...
- Roslyn 将构建时间写入到输出文件
我期望在每次构建完成之后,创建一个文件,在这个文件里面写入是什么时间构建的.这个需求实现非常简单,只需要使用 Target 在构建完成,使用 WriteLinesToFile 方法写入时间到输出文件即 ...
- MSBuild 输出日志可视化工具 MSBuild Structured Log Viewer 简介
感谢 Vatsan Madhavan 小伙伴推荐的 MSBuild 输出日志可视化工具,这个工具可以使用漂亮的 WPF 界面预览 MSBuild 复杂的输出内容 这是一个完全开源的工具,请看 Kiri ...
- 015_元器件BOM表的输出与打印
015_元器件BOM表的输出与打印 BOM表,选中dsn/tools/Bill of materials/Header后添加封装参数\tPCB Footprint,Combined property ...
- CRAPS赌博小游戏
游戏规则 代码实现 首先把这个规则用代码写出来 再在它基础上进行简单的可视化(主要是利用Easygui的界面) 最后查缺补漏,看看有没有什么Bug 利用pyinstaller -F -w -i xx. ...
- [2]自定义Lua解析方式
[2]自定义Lua解析方式 在上文中我们学会学会更改加载路径,加载对应文件夹下的Lua脚本. 默认解析加载的lua脚本存在的文件位置非AB包或者Resources文件夹下往往不能随包体更新,这显然不符 ...
- 07 mapping索引操作
目录 版本 获取健康值 获取所有索引的信息 创建索引 1. 自动推导 2. 自定义 判断索引是否存在 新增字段 新增记录 查询记录 获取mapping信息 删除索引 添加别名 查看别名 索引备份数据 ...
- ubuntu下安装php pdo扩展和导入数据库
默认安装的php不存在pdo扩展,因此在使用到的时候会报错,直接使用这个命令 apt-get install php-mysql 就可以成功安装pdo扩展 安装完数据库后需要导入sql语句,先进入数据 ...