探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!
前言
对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣,知其所以然那就达不到了,利用AES加密更加安全,上一篇园友又提出,所以借着这个机会刚好用到加密和解密,同时我也已将项目中DES加密已替换为AES,在这里介绍一下。
AES加密介绍
高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。它要求区块大小必须为128位,而密钥长度则可以为128、196、256位。基于此我们来实现.NET Framework版本和.NET Core版本。
在.NET Framework中实现AES加密和解密
AES加密
public static string EncryptText(string input, string key)
{ byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(input);
byte[] passwordBytes = Encoding.UTF8.GetBytes(key); passwordBytes = SHA256.Create().ComputeHash(passwordBytes); byte[] bytesEncrypted = AESEncryptBytes(bytesToBeEncrypted, passwordBytes); string result = Convert.ToBase64String(bytesEncrypted); return result;
}
public static byte[] AESEncryptBytes(byte[] bytesToBeEncrypted, byte[] passwordBytes)
{
byte[] encryptedBytes = null; var saltBytes = new byte[] { , , , , , , , ,}; using (var ms = new MemoryStream())
{
using (var AES = new RijndaelManaged())
{
AES.KeySize = ;
AES.BlockSize = ; var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, );
AES.Key = key.GetBytes();
AES.IV = key.GetBytes(); AES.Mode = CipherMode.CBC; using (var cs = new CryptoStream(ms, AES.CreateEncryptor(),
CryptoStreamMode.Write))
{
cs.Write(bytesToBeEncrypted, , bytesToBeEncrypted.Length);
cs.Close();
} encryptedBytes = ms.ToArray();
}
} return encryptedBytes;
}
上述盐字节必须为至少8个字节,否则报错如下:

AES解密
public static string DecryptText(string input, string key)
{
byte[] bytesToBeDecrypted = Convert.FromBase64String(input); byte[] passwordBytes = Encoding.UTF8.GetBytes(key); passwordBytes = SHA256.Create().ComputeHash(passwordBytes); byte[] bytesDecrypted = AESDecryptBytes(bytesToBeDecrypted, passwordBytes); string result = Encoding.UTF8.GetString(bytesDecrypted); return result;
}
public static byte[] AESDecryptBytes(byte[] bytesToBeDecrypted, byte[] passwordBytes)
{
byte[] decryptedBytes = null; var saltBytes = new byte[] { , , , , , , , ,}; using (var ms = new MemoryStream())
{
using (var AES = new RijndaelManaged())
{
AES.KeySize = ;
AES.BlockSize = ; var key = new Rfc2898DeriveBytes(passwordBytes, saltBytes, );
AES.Key = key.GetBytes();
AES.IV = key.GetBytes(); AES.Mode = CipherMode.CBC; using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(bytesToBeDecrypted, , bytesToBeDecrypted.Length);
cs.Close();
} decryptedBytes = ms.ToArray();
}
} return decryptedBytes;
}
测试如下:
var encrptText = "Jeffcky";
var key = Guid.NewGuid().ToString("N");
Console.WriteLine("加密前内容:" + encrptText);
var input = EncryptText(encrptText,key);
Console.WriteLine("加密后字符串为:" + input);
var text = DecryptText(input, key);
Console.WriteLine("解密后内容:" + text);

上述利用 RijndaelManaged 来实例化AES,最终该类继承自 SymmetricAlgorithm 对称算法类。通过我们实例化一个 Rfc2898DeriveBytes 来对密钥密钥和盐循环迭代1000次从而实现加密,同理解密反向操作。
在.NET Core中实现AES加密和解密
在.NET Core中对于对称加密统一接口不再利用不同类而实现,对于非对称加密当然和对称加密接口就不同了,创建起来格外方便,不再是实例化对应的类,如下
//对称加密
var aes = Aes.Create();
var tripleDES = TripleDES.Create(); //非对称加密
var rsa = RSA.Create();
由下可以看出直接定义了一个静态方法来创建加密
public abstract class Aes : SymmetricAlgorithm
{
protected Aes(); public override KeySizes[] LegalBlockSizes { get; }
public override KeySizes[] LegalKeySizes { get; } public static Aes Create();
}
public abstract class RSA : AsymmetricAlgorithm
{
protected RSA(); public static RSA Create();
...
}
当然命名空间依然是 System.Security.Cryptography 。我们直接看实现。
AES加密
public static string AESEncrypt(string input, string key)
{
var encryptKey = Encoding.UTF8.GetBytes(key); using (var aesAlg = Aes.Create())
{
using (var encryptor = aesAlg.CreateEncryptor(encryptKey, aesAlg.IV))
{
using (var msEncrypt = new MemoryStream())
{
using (var csEncrypt = new CryptoStream(msEncrypt, encryptor,
CryptoStreamMode.Write)) using (var swEncrypt = new StreamWriter(csEncrypt))
{
swEncrypt.Write(input);
} var iv = aesAlg.IV; var decryptedContent = msEncrypt.ToArray(); var result = new byte[iv.Length + decryptedContent.Length]; Buffer.BlockCopy(iv, , result, , iv.Length);
Buffer.BlockCopy(decryptedContent, , result,
iv.Length, decryptedContent.Length); return Convert.ToBase64String(result);
}
}
}
}
AES解密(修改:2019-11-13)
public static string AESDecrypt(string input, string key)
{
var fullCipher = Convert.FromBase64String(input); var iv = new byte[];
var cipher = new byte[fullCipher.Length-iv.Length]; Buffer.BlockCopy(fullCipher, , iv, , iv.Length);
Buffer.BlockCopy(fullCipher, iv.Length, cipher, , fullCipher.Length- iv.Length);
var decryptKey = Encoding.UTF8.GetBytes(key); using (var aesAlg = Aes.Create())
{
using (var decryptor = aesAlg.CreateDecryptor(decryptKey, iv))
{
string result;
using (var msDecrypt = new MemoryStream(cipher))
{
using (var csDecrypt = new CryptoStream(msDecrypt,
decryptor, CryptoStreamMode.Read))
{
using (var srDecrypt = new StreamReader(csDecrypt))
{
result = srDecrypt.ReadToEnd();
}
}
} return result;
}
}
}
测试如下:
var key = Guid.NewGuid().ToString("N");
var name = "Jeffcky";
Console.WriteLine($"加密字符串为{name}");
var encryptStr = AESEncrypt(name, key);
Console.WriteLine($"加密后结果为:{encryptStr}");
var decryptStr = AESDecrypt(encryptStr, key);
Console.WriteLine($"解密后字符串为{decryptStr}");

总结
在.NET Core中实现对称加密和非对称加密无论是实现还是创建都更加简洁,之前也并未去具体了解加密和解密相关内容,借此机会稍微了解下对应的加密所以花了一点时间。对于AES加密还没怎么具体去了解内部原理,只是参照了一点资料,以此作为备忘录,目前.NET Core仅支持AES、TripleDES、RSA。希望对在.NET Core项目中需要实现加密的童鞋提供一点帮助。接下来有时间我们继续巩固下线程基础知识,敬请期待,待我学习完毕再来更新博客和大家一起分享。
探讨.NET Core中实现AES加密和解密以及.NET Core为我们提供了什么方便!的更多相关文章
- 探讨数据进行AES加密和解密以及.NET Core对加密和解密为我们提供了什么?
前言 对于数据加密和解密每次我都是从网上拷贝一份,无需有太多了解,由于在.net core中对加密和解密目前全部是统一了接口,只是做具体的实现,由于遇到过问题,所以将打算基本了解下其原理,知其然足矣, ...
- OPENSSL安装 以及使用openssl中的AES加密和解密
OPENSSL安装:(VS) 1:第一步和所有的软件安装一样. 2:将OPENSSL中INLUCDE 和 LIB 分别拷贝到VS中VC的INLUCDE 和LIB目录下(我的机器上的目录是:C:\Pro ...
- 探讨.NET Core数据进行3DES加密和解密问题
前言 一直困扰着我关于数据加密这一块,24号晚上用了接近3个小时去完成一项任务,本以为立马能解决,但是为了保证数据的安全性,我们开始去对数据进行加密,然后接下来3个小时专门去研究加密这一块,然而用着用 ...
- 探讨NET Core数据进行3DES加密或解密弱密钥问题
前言 之前写过一篇<探讨.NET Core数据进行3DES加密和解密问题>,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文解决 ...
- 使用as3crypto在Flex中实现AES加密
要在Flex中实现AES加密,可以通过as3crypto实现.但是as3crypto本身的用法比较复杂,一般是封装一下再调用. 下面是9RIA上的一篇文章给出的一个实现,使用中稍感不方便(见注释): ...
- Php AES加密、解密与Java互操作的问题
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html 内部邀请码:C8E245J (不写邀请码,没有现金送) 国 ...
- java独立小程序实现AES加密和解密
一.需求: web项目中配置文件配置的密码是明文的, 现在需要修改成密文, 加密方式采用AES, 于是写了个工具类用于加密和解密. 又因为这个密码是由客户来最终确定, 所以为了部署时方便起见, 写了个 ...
- java与C#、.NET AES加密、解密 解决方案
1.情景展示 Java提供的密钥,C#无法解密. 2.原因分析 在Java中,AES的实际密钥需要用到KeyGenerator 和 SecureRandom,但是C#和.NET 里面没有这2个类, ...
- AES加密、解密工具类
AES加密.解密工具类代码如下: package com.util; import java.io.IOException; import java.io.UnsupportedEncodingExc ...
随机推荐
- Simplest Python K-Way Merging Sort|最简单的Python k路归并排序
想做这个好长时间了,因为有一篇Dreamworks的论文<Coherent Out-of-Core Point-Based Global Illumination>提到了这个,一直没时间做 ...
- Java synchronized解析
多线程三大特性: 可见性.原子性.有序性 synchronize的特性: 1.同一时刻只有一个线程访问临界资源 2.其它未获取到锁执行权的线程必须排队等待 3.保证共享资源的原子性.可见性和有序性 4 ...
- 计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误
计算机图形学(第2版 于万波 于硕 编著)第45页的Bresenham算法有错误: 书上本来要写的是以x为阶越步长的方法,但是他写的是用一部分y为阶越步长的方法(其实也写的不对),最后以x为阶越步长的 ...
- Reporting Service 2008 “报表服务器数据库内出错。此错误可能是因连接失败、超时或数据库中磁盘空间不足而导致的”
今天遇到了两个关于Reporting Service的问题, 出现问题的环境为Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) .具体情况 ...
- win7 中 sql server2005 卸载简介
注:卸载前一定要做好备份,一定要清理干净,不然重装会出错(只针对完全卸载,没试过只删除一个版本的) 工具:①Windows Install Clean Up ②SrvInstw.exe 1.停止所有 ...
- IIS 部署问题 404
在部署IIS环境中,偶尔会遇到 404 错误,就算以前遇到过,也因为时间久了导致大概知道是什么错了,具体解决方案觉忘了,所以留下一个记录,留给自己,也是给大家一点提醒.(注:错误信息也懒得截图了,希望 ...
- python——作用域之LEGB规则
1 变量的作用域 Python是静态作用域,也就是说在Python中,变量的作用域源于它在代码中的位置:在不同的位置,可能有不同的命名空间.命名空间是变量作用域的体现形式. 2 LEGB各自代表的含义 ...
- June 2. 2018 Week 22nd Saturday
Try not to become a man of success but rather try to become a man of value. 不要为成功而努力,要为做一个有价值的人而努力. ...
- 023合并K个链表并排序
#include "000库函数.h" struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), n ...
- leetcode刷题--两数之和(简单)
一.序言 第一次刷leetcode的题,之前从来没有刷题然后去面试的概念,直到临近秋招,或许是秋招结束的时候才有这个意识,原来面试是需要刷题的,面试问的问题都是千篇一律的,只要刷够了题就差不多了,当然 ...