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密钥值,偏 ...
随机推荐
- 深入分析 Flutter 渲染性能
简介: Flutter 有很多优点,特别是对于开发者来说,跨平台多端支持,丰富的 UI 组件库和交互效果,声明式 UI,React 的更新方式,Hot-reload 提高开发效率等等.虽然它在渲染性能 ...
- “2021ISIG中国产业智能大会低代码峰会”即将开幕,钉钉宜搭叶周全受邀出席
简介:2021年12月8-9日,"2021ISIG中国产业智能大会" 将在上海举行.阿里巴巴资深技术专家,钉钉宜搭创始人叶周全将作为特邀嘉宾出席大会. 2021年12月8-9日, ...
- PostgreSQL数据目录深度揭秘
简介: PostgreSQL是一个功能非常强大的.源代码开放的客户/服务器关系型数据库管理系统(RDBMS),被业界誉为"先进的开源数据库",支持NoSQL数据类型,主要面向企业复 ...
- OLAP系列之分析型数据库clickhouse备份方式(五)
一.常见备份方式 1.1 备份方式 备份方式 特点 物理文件备份 对物理文件进行拷贝,备份期间禁止数据写入 dump数据导入导出 备份方式灵活,但备份速度慢 快照表备份 制作_bak表进行备份 FRE ...
- C++编程英语词汇
abstract抽象的 abstraction抽象性.抽象件 access访问 access level访问级别 access function访问函数 adapter适配器 address地址 ad ...
- 《Effective C++》第三版-3. 资源管理(Resource Management)
目录 条款13:以对象管理资源(Use objects to manage resources) 关键想法 智能指针 条款14:在资源管理类中小心copying行为(Think carefully a ...
- htts证书申请
https://freessl.cn/ 教程: https://www.bilibili.com/video/BV1Ug411673P/?spm_id_from=333.337.search-card ...
- docker-compose部署EFK
参考 docker_compose_efk elasticsearch.kibana.filebeat https://github.com/haimait/docker_compose_efk do ...
- 企业微信群机器人发送消息(三)java端如何控制
1.先在群里添加机器人,然后获取机器人的webhook地址: 假设webhook是:https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=693a9 ...
- d3d12龙书阅读----绘制几何体(下)
d3d12龙书阅读----绘制几何体(下) 本节在上一节的基础上,对整个绘制过程进行优化,将绘制单个几何体的内容拓展到了多个几何体,同时对根签名进行了进一步地探索. 帧资源 在之前绘制每帧的结尾,我们 ...