一款实用的.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 datausing (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支持💖。

https://github.com/myloveCc/NETCore.Encrypt

优秀项目和框架精选

该项目已收录到C#/.NET/.NET Core优秀项目和框架精选中,关注优秀项目和框架精选能让你及时了解C#、.NET和.NET Core领域的最新动态和最佳实践,提高开发工作效率和质量。坑已挖,欢迎大家踊跃提交PR推荐或自荐(让优秀的项目和框架不被埋没🤞)。

https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetProjectPicks.md

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/705550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机JVM

虚拟机 1、定义jvm 假想计算机 运行在操作系统之上 和硬件之间没有直接交互 包括 一套字节码指令、寄存器、栈、垃圾回收、堆 一个存储方法域 jvm:承担一个翻译工作&#xff0c;动态的将java代码编译成操作系统可以识别的机器码。 从软件层面屏蔽了不同操作系统在底层硬件与指…

petalinux-config : command not found 和petalinux-build: command not found

发现这两个问题都是因为&#xff1a;没有先设置 petalinux 的作环境 先输入命令 先执行 source /opt/pkg/petalinux/2020.2/settings.sh 或者 sptl 然后切换目录&#xff0c;到相应的目录&#xff0c;就可以了

【设计模式】使用门面模式简化接口的复杂度

文章目录 1.概述2.门面模式的定义3.门面模式的应用场景4.总结 1.概述 门面模式&#xff08;Facade Pattern&#xff09;又叫做外观模式&#xff0c;它通过为子系统提供一个统一的高层入口的方式&#xff0c;达到简化复杂系统的使用以及降低客户端与子系统之间的耦合度的效果&a…

LeetCode53题:最大子数组和(python3)

代码思路&#xff1a; 动态规划&#xff0c;使用动态规划如果上一个数是大于0&#xff0c;则加上&#xff1b;如果小于0直接用0。这样做的好处就是最终直接是最大子数组和。 class Solution:def maxSubArray(self, nums: List[int]) -> int:for i in range(1,len(nums)):nu…

Docker Volume

"Ice in my vein" Docker Volume(存储卷) 什么是存储卷? 存储卷就是: “将宿主机的本地文件系统中存在的某个目录&#xff0c;与容器内部的文件系统上的某一目录建立绑定关系”。 存储卷与容器本身的联合文件系统&#xff1f; 在宿主机上的这个与容器形成绑定关系…

【kubernetes】关于k8s集群中kubectl的陈述式资源管理

目录 一、k8s集群资源管理方式分类&#xff1a; &#xff08;1&#xff09;陈述式资源管理方式&#xff1a;增删查比较方便&#xff0c;但是改非常不方便 &#xff08;2&#xff09;声明式资源管理方式&#xff1a;yaml文件管理 二、陈述式资源管理方法&#xff1a; 三、ku…

leetcode移动零

leetcode移动零 Given an integer array nums, move all 0’s to the end of it while maintaining the relative order of the non-zero elements. Note that you must do this in-place without making a copy of the array. Example 1: Input: nums [0,1,0,3,12] Output…

linux下gcc编译时默认是32位还是64位,怎么指定为32or64?

本来是想研究一下long的字节大小sizeof(long)&#xff0c;于是写了代码&#xff1a; #include <stdio.h> int main() {long a 10;printf("%d\n", sizeof(a));return 0; } 我当时使用的是win10系统&#xff0c;使用的是vs 2022&#xff0c;然后对以上代码进行…

[面试]我们常说的负载均衡是什么东西?

什么是负载均衡 如果用户量很多, 服务器的流量也随之增大, 此时出现两个问题, 软件性能下降 容易出现单点故障 为了解决这些问题, 引入了集群化架构, 也就是把一个软件同时部署在多个服务器上 集群化架构出现的问题 架构改变后又出现了两个问题 如何将请求均匀的发送到多…

3D WEB轻量化引擎HOOPS:促进3D软件的创新与协作

CAD软件一直以来都在现代工程、建筑、制造和设计领域发挥着至关重要的作用。在数字时代&#xff0c;CAD软件的开发者不断追求提高软件性能、增加功能和改善用户体验&#xff0c;在这一努力中&#xff0c;HOOPS技术&#xff08;高度优化的面向对象并行软件&#xff09;滑块露头角…

地图匹配+目标定位

1. 思路 掌握飞机位姿和吊舱位姿解算目标粗略GPS根据该GPS调用在线或离线卫星图将吊舱图像和卫星图进行匹配通过解算对目标进行精确定位&#xff0c;就很简单了 调用卫星图匹配 2. 高权值区 2.1 Cross-View Object Geo-Localization in a Local Region With Satellite Imag…

SpringBoot快速入门(黑马学习笔记)

需求 需求&#xff1a;基于SpringBoot的方式开发一个Web应用&#xff0c;浏览器发起请求/hello后&#xff0c;给浏览器返回字符串"Hello World~"。 开发步骤 第一步&#xff1a;创建SpringBoot工程项目 第二步&#xff1a;定义HelloController类&#xff0c;添加方…

python Matplotlib Tkinter-->tab切换1

环境 python:python-3.12.0-amd64 包: matplotlib 3.8.2 pillow 10.1.0 import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk import tkinter as tk import tkinter.messagebox as messagebox import …

股票三种行情的最佳买卖点,分时图与K线图分析案例教学

一、教程描述 本套股票行情教程&#xff0c;大小5.40G&#xff0c;共有50个文件。 二、教程目录 股票教程01&#xff1a;上升行情之股票运行轨迹.mp4 股票教程02&#xff1a;上升行情之千金难买牛回头.mp4 股票教程03&#xff1a;上升行情之一线一量走天下.mp4 股票教程0…

Qt程序设计-钟表自定义控件实例

本文讲解Qt钟表自定义控件实例。 效果如下: 创建钟表类 #ifndef TIMEPIECE_H #define TIMEPIECE_H#include <QWidget> #include <QPropertyAnimation> #include <QDebug> #include <QPainter> #include <QtMath>#include <QTimer>#incl…

苹果上架App被拒绝的原因

苹果上架App被拒绝的原因有很多种&#xff0c;主要包括以下几个方面&#xff1a; 1.功能问题&#xff1a;苹果认为你的App存在功能问题&#xff0c;不符合App Store的要求。比如&#xff0c;你的App可能存在漏洞&#xff0c;会影响用户体验或者安全性&#xff0c;或者涉及到隐…

php伪协议 [SWPUCTF 2022 新生赛]ez_ez_php(revenge)

打开题目 题目源代码如下 <?php error_reporting(0); if (isset($_GET[file])) {if ( substr($_GET["file"], 0, 3) "php" ) {echo "Nice!!!";include($_GET["file"]);} else {echo "Hacker!!";} }else {highlight_fi…

【非比较排序】计算排序算法

目录 CountSort计数排序 整体思想 图解分析 代码实现 时间复杂度&优缺分析 CountSort计数排序 计数排序是一种非比较排序&#xff0c;不需要像前面的排序一样去比较。 计数排序的特性总结&#xff1a; 1. 计数排序在数据范围集中时&#xff0c;效率很高&#xff0c;但…

[C++]使用C++实现监控文件是否被修改

软件开发过程中经常会用到配置文件,某些应用场景要求在软件运行时动态修改配置文件,此时就需要监控配置文件是否被修改,下面我们就来看看如何使用C实现这一功能吧 软件开发过程中经常会用到配置文件&#xff0c;某些应用场景要求在软件运行时动态修改配置文件&#xff0c;此时…

微信公众号关键词自动回复

今天主要给大家讲一下如何实现微信公众号关键词的自动回复功能&#xff0c;就如网站的文章而言&#xff0c;进行人机识别&#xff0c;需要关注公众号回复验证码获取到验证码从而展示文章内容&#xff0c;&#xff0c;具体效果如下图。 springboot 2.3.2RELEASE 1、微信公众平台…