一款实用的.NET Core加密解密工具类库
前言
在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的AES,RSA,MD5,SAH1,SAH256,DES等,这时候假如我们有一个封装的对应加密解密工具类可以直接调用,那这样可以节省不少的开发时间。今天推荐一款实用的.NET Core加密解密工具类库:NETCore.Encrypt。
项目介绍
NETCore.Encrypt是.NET Core加密解密工具类库,包括AES、RSA、MD5、SHA1、DES、SHA256、SHA384、SHA512等更多功能。
项目源码


MD5加密
封装方法
#region MD5
/// <summary>
/// MD5 hash
/// </summary>
/// <param name="srcString">The string to be encrypted.</param>
/// <param name="length">The length of hash result , default value is <see cref="MD5Length.L32"/>.</param>
/// <returns></returns>
public static string Md5(string srcString, MD5Length length = MD5Length.L32)
{
Check.Argument.IsNotEmpty(srcString, nameof(srcString));
string str_md5_out = string.Empty;
using (MD5 md5 = MD5.Create())
{
byte[] bytes_md5_in = Encoding.UTF8.GetBytes(srcString);
byte[] bytes_md5_out = md5.ComputeHash(bytes_md5_in);
str_md5_out = length == MD5Length.L32
? BitConverter.ToString(bytes_md5_out)
: BitConverter.ToString(bytes_md5_out, 4, 8);
str_md5_out = str_md5_out.Replace("-", "");
return str_md5_out;
}
}
#endregion
调用结果
public static void MD5_Test()
{
var srcString = "追逐时光者";
var hashed = EncryptProvider.Md5(srcString);
Console.WriteLine("MD5加密结果:" + hashed);
}


RSA加密&解密
封装方法
/// <summary>
/// RSA encrypt
/// </summary>
/// <param name="publicKey">public key</param>
/// <param name="srcString">src string</param>
/// <param name="padding">rsa encryptPadding <see cref="RSAEncryptionPadding"/> RSAEncryptionPadding.Pkcs1 for linux/mac openssl </param>
/// <param name="isPemKey">set key is pem format,default is false</param>
/// <returns>encrypted string</returns>
public static string RSAEncrypt(string publicKey, string srcString, RSAEncryptionPadding padding, bool isPemKey = false)
{
Check.Argument.IsNotEmpty(publicKey, nameof(publicKey));
Check.Argument.IsNotEmpty(srcString, nameof(srcString));
Check.Argument.IsNotNull(padding, nameof(padding));
RSA rsa;
if (isPemKey)
{
rsa = RsaProvider.FromPem(publicKey);
}
else
{
rsa = RSA.Create();
rsa.FromJsonString(publicKey);
}
using (rsa)
{
var maxLength = GetMaxRsaEncryptLength(rsa, padding);
var rawBytes = Encoding.UTF8.GetBytes(srcString);
if (rawBytes.Length > maxLength)
{
throw new OutofMaxlengthException($"'{srcString}' is out of max encrypt length {maxLength}", maxLength, rsa.KeySize, padding);
}
byte[] encryptBytes = rsa.Encrypt(rawBytes, padding);
return encryptBytes.ToHexString();
}
}
/// <summary>
/// RSA decrypt
/// </summary>
/// <param name="publicKey">public key</param>
/// <param name="srcString">src string</param>
/// <param name="padding">rsa encryptPadding <see cref="RSAEncryptionPadding"/> RSAEncryptionPadding.Pkcs1 for linux/mac openssl </param>
/// <param name="isPemKey">set key is pem format,default is false</param>
/// <returns>encrypted string</returns>
public static string RSADecrypt(string privateKey, string srcString, RSAEncryptionPadding padding, bool isPemKey = false)
{
Check.Argument.IsNotEmpty(privateKey, nameof(privateKey));
Check.Argument.IsNotEmpty(srcString, nameof(srcString));
Check.Argument.IsNotNull(padding, nameof(padding));
RSA rsa;
if (isPemKey)
{
rsa = RsaProvider.FromPem(privateKey);
}
else
{
rsa = RSA.Create();
rsa.FromJsonString(privateKey);
}
using (rsa)
{
byte[] srcBytes = srcString.ToBytes();
byte[] decryptBytes = rsa.Decrypt(srcBytes, padding);
return Encoding.UTF8.GetString(decryptBytes);
}
}
调用结果
#region Rsa加密&解密
public static void Rsa_Encrypt_Decrypt_Test(RsaSize size)
{
var rsaKey = EncryptProvider.CreateRsaKey(size);
var srcString = "追逐时光者";
var encrypted = EncryptProvider.RSAEncrypt(rsaKey.PublicKey, srcString);
Console.WriteLine("RSA加密结果:" + encrypted);
Console.WriteLine("\r\n");
var decrypted = EncryptProvider.RSADecrypt(rsaKey.PrivateKey, encrypted);
Console.WriteLine("RSA解密结果:" + decrypted);
}
#endregion

DES加密&解密
封装方法
/// <summary>
/// DES encrypt
/// </summary>
/// <param name="data">Raw data byte array</param>
/// <param name="key">Key, requires 24 bits</param>
/// <param name="vector">IV,requires 8 bits</param>
/// <returns>Encrypted byte array</returns>
public static byte[] DESEncrypt(byte[] data, string key, string vector)
{
Check.Argument.IsNotEmpty(data, nameof(data));
Check.Argument.IsNotEmpty(key, nameof(key));
Check.Argument.IsEqualLength(key.Length, 24, nameof(key));
Check.Argument.IsNotEmpty(vector, nameof(vector));
Check.Argument.IsEqualLength(vector.Length, 8, nameof(vector));
return DESEncrypt(data, key, CipherMode.CBC, vector);
}
/// <summary>
/// DES encrypt
/// </summary>
/// <param name="data">Raw data</param>
/// <param name="key">Key, requires 24 bits</param>
/// <param name="cipherMode"><see cref="CipherMode"/></param>
/// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>
/// <param name="vector">IV,requires 8 bits</param>
/// <returns>Encrypted byte array</returns>
private static byte[] DESEncrypt(byte[] data, string key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7)
{
Check.Argument.IsNotEmpty(data, nameof(data));
Check.Argument.IsNotEmpty(key, nameof(key));
Check.Argument.IsEqualLength(key.Length, 24, nameof(key));
using (MemoryStream Memory = new MemoryStream())
{
using (TripleDES des = TripleDES.Create())
{
byte[] plainBytes = data;
byte[] bKey = new byte[24];
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
des.Mode = cipherMode;
des.Padding = paddingMode;
des.Key = bKey;
if (cipherMode == CipherMode.CBC)
{
byte[] bVector = new byte[8];
Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);
des.IV = bVector;
}
using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateEncryptor(), CryptoStreamMode.Write))
{
try
{
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
return Memory.ToArray();
}
catch (Exception ex)
{
return null;
}
}
}
}
}
/// <summary>
/// DES encrypt
/// </summary>
/// <param name="data">Raw data byte array</param>
/// <param name="key">Key, requires 24 bits</param>
/// <param name="vector">IV,requires 8 bits</param>
/// <returns>Encrypted byte array</returns>
public static byte[] DESDecrypt(byte[] data, string key, string vector)
{
Check.Argument.IsNotEmpty(data, nameof(data));
Check.Argument.IsNotEmpty(key, nameof(key));
Check.Argument.IsEqualLength(key.Length, 24, nameof(key));
Check.Argument.IsNotEmpty(vector, nameof(vector));
Check.Argument.IsEqualLength(vector.Length, 8, nameof(vector));
return DESDecrypt(data, key, CipherMode.CBC, vector);
}
/// <summary>
/// DES decrypt
/// </summary>
/// <param name="data">Encrypted data</param>
/// <param name="key">Key, requires 24 bits</param>
/// <param name="cipherMode"><see cref="CipherMode"/></param>
/// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>
/// <returns>Decrypted byte array</returns>
private static byte[] DESDecrypt(byte[] data, string key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7)
{
Check.Argument.IsNotEmpty(data, nameof(data));
Check.Argument.IsNotEmpty(key, nameof(key));
Check.Argument.IsEqualLength(key.Length, 24, nameof(key));
byte[] encryptedBytes = data;
byte[] bKey = new byte[24];
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
using (MemoryStream Memory = new MemoryStream(encryptedBytes))
{
using (TripleDES des = TripleDES.Create())
{
des.Mode = cipherMode;
des.Padding = paddingMode;
des.Key = bKey;
if (cipherMode == CipherMode.CBC)
{
byte[] bVector = new byte[8];
Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);
des.IV = bVector;
}
using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateDecryptor(), CryptoStreamMode.Read))
{
try
{
byte[] tmp = new byte[encryptedBytes.Length];
int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length);
byte[] ret = new byte[len];
Array.Copy(tmp, 0, ret, 0, len);
return ret;
}
catch
{
return null;
}
}
}
}
}
调用结果
#region DES加密&解密
public static void DES_Encrypt_Decrypt_Test()
{
var srcString = "TEST DES Encrypt Decrypt";
string key = EncryptProvider.CreateDesKey();
string iv = EncryptProvider.CreateDesIv();
var srsDatas = Encoding.UTF8.GetBytes(srcString);
var encrypted = EncryptProvider.DESEncrypt(srsDatas, key, iv);
Console.WriteLine("DES加密结果:" + encrypted);
Console.WriteLine("\r\n");
var decrypted = EncryptProvider.DESDecrypt(encrypted, key, iv);
var decryptedStr = Encoding.UTF8.GetString(decrypted);
Console.WriteLine("DES解密结果:" + decryptedStr);
}
#endregion

AES加密&解密
封装方法
/// <summary>
/// AES encrypt ( no IV)
/// </summary>
/// <param name="data">Raw data</param>
/// <param name="key">Key, requires 32 bits</param>
/// <returns>Encrypted string</returns>
public static string AESEncrypt(string data, string key)
{
Check.Argument.IsNotEmpty(data, nameof(data));
Check.Argument.IsNotEmpty(key, nameof(key));
Check.Argument.IsEqualLength(key.Length, 32, nameof(key));
using (MemoryStream memory = new MemoryStream())
{
using (Aes aes = Aes.Create())
{
byte[] plainBytes = Encoding.UTF8.GetBytes(data);
byte[] bKey = new byte[32];
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = 256;
aes.Key = bKey;
using (CryptoStream cryptoStream = new CryptoStream(memory, aes.CreateEncryptor(), CryptoStreamMode.Write))
{
try
{
cryptoStream.Write(plainBytes, 0, plainBytes.Length);
cryptoStream.FlushFinalBlock();
return Convert.ToBase64String(memory.ToArray());
}
catch (Exception ex)
{
return null;
}
}
}
}
}
/// <summary>
/// AES decrypt( no IV)
/// </summary>
/// <param name="data">Encrypted data</param>
/// <param name="key">Key, requires 32 bits</param>
/// <returns>Decrypted string</returns>
public static string AESDecrypt(string data, string key)
{
Check.Argument.IsNotEmpty(data, nameof(data));
Check.Argument.IsNotEmpty(key, nameof(key));
Check.Argument.IsEqualLength(key.Length, 32, nameof(key));
byte[] encryptedBytes = Convert.FromBase64String(data);
byte[] bKey = new byte[32];
Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
try
{
byte[] decryptedData = null; // decrypted data
using (MemoryStream memory = new MemoryStream(encryptedBytes))
{
using (Aes aes = Aes.Create())
{
aes.Mode = CipherMode.ECB;
aes.Padding = PaddingMode.PKCS7;
aes.KeySize = 256;
aes.Key = bKey;
using (CryptoStream decryptor = new CryptoStream(memory, aes.CreateDecryptor(), CryptoStreamMode.Read))
{
using (MemoryStream tempMemory = new MemoryStream())
{
byte[] buffer = new byte[1024];
Int32 readBytes = 0;
while ((readBytes = decryptor.Read(buffer, 0, buffer.Length)) > 0)
{
tempMemory.Write(buffer, 0, readBytes);
}
decryptedData = tempMemory.ToArray();
return Encoding.UTF8.GetString(decryptedData);
}
}
}
}
}
catch
{
return null;
}
}
调用结果
#region AES加密&解密
public static void Aes_Encrypt_Decrypt_Test()
{
var aesKey = EncryptProvider.CreateAesKey();
var key = aesKey.Key;
var srcString = "追逐时光者";
var encrypted = EncryptProvider.AESEncrypt(srcString, key);
Console.WriteLine("AES加密结果:" + encrypted);
Console.WriteLine("\r\n");
var decrypted = EncryptProvider.AESDecrypt(encrypted, key);
Console.WriteLine("AES解密结果:" + decrypted);
}
#endregion

项目源码地址
更多项目实用功能和特性欢迎前往项目开源地址查看,别忘了给项目一个Star支持。
优秀项目和框架精选
该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没)。
https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md
DotNetGuide技术社区交流群
- DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
- 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
- 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。
一款实用的.NET Core加密解密工具类库的更多相关文章
- 使用jframe编写一个base64加密解密工具
该工具可以使用exe4j来打包成exe工具(如何打包自己百度) 先上截图功能 运行main方法后,会弹出如下窗口 输入密文 然后点击解密,在点格式化 代码分享 package tools;import ...
- Base64加密解密工具类
使用Apache commons codec类Base64进行加密解密 maven依赖 <dependency> <groupId>commons-codec</grou ...
- java 加密解密工具类(实用!!!)
最近发现了一个加密解密的好例子,很方便使用,可以作为平时开发的工具集,记录一下. package com.sh.springboottdemo2.util; import com.sun.org.ap ...
- DES带IV向量加密解密工具
链接:http://pan.baidu.com/s/1kVAV80J 密码:sgys 鉴于网上的DES加密解密都是不带IV向量的 我就自制了一个带IV向量的DES加密解密的小工具 © 2016-20 ...
- 自己写的AES和RSA加密解密工具
package com.sdyy.common.utils; import java.security.Key; import java.security.KeyFactory; import jav ...
- 加密解密工具类(Java,DES)
一个Java版的DES加密工具类,能够用来进行网络传输数据加密,保存password的时候进行加密. import java.security.Key; import java.security.sp ...
- .Net(c#)加密解密工具类:
/// <summary> /// .Net加密解密帮助类 /// </summary> public class NetCryptoHelper { #region des实 ...
- Java AES加密解密工具 -- GUI 、在线传输文件
原理 对于任意长度的明文,AES首先对其进行分组,每组的长度为128位.分组之后将分别对每个128位的明文分组进行加密. 对于每个128位长度的明文分组的加密过程如下: (1)将128位AES ...
- java加密解密工具类
package com.founder.mrp.util; import java.nio.charset.StandardCharsets; import java.security.Key; im ...
- des 加密解密工具类
最近在做des的双对称加密解密,特此记录一下. des对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码 ...
随机推荐
- Django: request.query_params取值
取值 request.query_params.dict(),将querydict对象转换为字典 参考链接 https://www.jianshu.com/p/f2f73c426623 https:/ ...
- Vue笔记(一)
1. Vue.js是什么? 1). 一位华裔前Google工程师(尤雨溪)开发的前端js库 2). 作用: 动态构建用户界面 3). 特点: * 遵循MVVM模式 * 编码简洁, 体积小, 运行效率高 ...
- Proxmox VE软件防火墙的配置
1 软件防火墙的基本概念 防火墙是计算机网络中用于保护网络安全的关键技术.防火墙可以是硬件设备部署在网络出口,也可以是软件部署在终端设备出口.本文主要介绍软件防火墙. 软件防火墙可以根据网络流量的方向 ...
- [故障处理]nfs导致系统负载异常
目录 情况 排查 原因 解决 情况 某台虚拟机服务器系统负载极高,但是cpu.内存.IO都正常.home目录下无法使用ls,也无法使用 df -h. 排查 top看cpu和内存,正常. iotop看i ...
- Python怎么通过url下载网络文件到本地
以下代码演示Python怎么从网络下载一个文件至本地并保存在当前文件夹download import os import requests from urllib.parse import urlpa ...
- Midjourney 创建私人画图机器人(保姆级教程)
本教程收集于:AIGC从入门到精通教程汇总 之前给大家介绍过了Midjourney 的注册教程:AI绘画:Midjourney 注册(保姆级教程) 也有Stable Diffusion(开源)的本地搭 ...
- pythonapi接口怎么对接?
Python API接口对接是使用Python语言开发应用程序时,与外部API接口进行交互的一种方式.API(应用程序接口)是一种定义了程序或系统如何与另一个程序或系统进行交互的协议.通过使用Py ...
- 万字长文深度解读Java线程池,硬核源码分析
前言 本文将深入分析Java线程池的源码,包括线程池的创建.任务提交.工作线程的执行和线程池的关闭等过程.通过对线程池源码的解析,我们能够更好地理解线程池的原理和机制,为我们在实际开发中合理使用线程池 ...
- Spring Cache + Caffeine实现本地缓存
Caffeine简介 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是 Guava Cache 的优化加强版 依赖 <dependency& ...
- 「joisc 2019 - d2t2」ふたつの料理 Two Dishes
[link.](E - ふたつの料理 (Two Dishes) (atcoder.jp) 我要放假 神仙题. 首先可以把两根轴拉成平面(which is a common trick),把决策的过程看 ...