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

GitHub - myloveCc/NETCore.Encrypt: NETCore encrypt and decrypt tool,Include aes,des,rsa,md5,sha1,sha256,sha384,sha512

优秀项目和框架精选

该项目已收录到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开发者带来更多的价值和成长机会。

欢迎加入DotNetGuide技术社区微信交流群👪

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

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

相关文章

Ps:变换

可以向选区、整个图层、多个图层或图层蒙版应用变换 Transform&#xff0c;还可以向路径、矢量形状、矢量蒙版、选区边界或 Alpha 通道应用变换。 若要变换栅格&#xff08;像素&#xff09;图像&#xff0c;建议先将其转换为智能对象&#xff0c;以便进行非破坏性的变换。 Ps菜…

ICASSP2023年SPGC多语言AD检测的论文总结

文章目录 引言正文AbstractRelated ArticleNo.1: CONSEN: COMPLEMENTARY AND SIMULTANEOUS ENSEMBLE FOR ALZHEIMERSDISEASE DETECTION AND MMSE SCORE PREDICTION特征相关模型结构数据处理结果分析 No.2: CROSS-LINGUAL TRANSFER LEARNING FOR ALZHEIMERS DETECTION FROM SPON…

PyTorch神经网络-激励函数

在PyTorch 神经网络当中&#xff0c;使用激励函数处理非线性的问题&#xff0c;普通的神经网络出来的数据一般是线性的关系&#xff0c;但是遇到比较复杂的数据的话&#xff0c;需要激励函数处理一些比较难以处理的问题&#xff0c;非线性结果就是其中的情况之一。 FAQ:为什么要…

Spring 配置

配置文件最主要的目的 : 解决硬编码的问题(代码写死) SpringBoot 的配置文件,有三种格式 1.properties 2.yaml 3.yml(是 yaml 的简写) SpringBoot 只支持三个文件 1.application.properties 2.application.yaml 3.application.yml yaml 和 yml 是一样的,学会一个就行…

代码随想录算法训练营第二十八天| 78 子集 90 子集|| 93 复原IP地址

78 子集 由题意可知数组中的元素互不相同&#xff0c;所以在dfs中我们可以将当前的path直接加入到res中。 class Solution {List<List<Integer>>res new ArrayList<>();List<Integer>path new LinkedList<>();public List<List<Integer…

高精度算法【Java】(待更新中~)

高进度加法 在Java中可以使用BigInteger进行高精度计算&#xff0c;除此也可以仿照竖式相加的计算原理进行计算。 BigInteger 提供所有 Java 的基本整数操作符的对应物&#xff0c;并提供 java.lang.Math 的所有相关方法。另外&#xff0c;BigInteger 还提供以下运算&#xff1…

CentOS 7 安装CMake指定版本3.21.2

背景&#xff1a;今天在CentOS 7 电脑上安装C 日志框架SpdLog-1.12.0&#xff0c;提示如下错误信息&#xff1a; [rootlocalhost build]# cmake .. && make -j CMake Error at CMakeLists.txt:3 (cmake_minimum_required):CMake 3.10...3.21 or higher is required. …

5 redis的GEO操作

一、GEO Redis 3.2版本提供了GEO(地理信息定位)功能&#xff0c;支持存储地理位置信息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。 有效纬度从-85.05112878度到85.05112878度 注意&#xff1a;当坐标位置超出上述指定范围时&#xff0c;将会返回一个错误。 …

函数式编程框架 functionaljava 简介

文章目录 一、函数式编程起源二、functionaljava 框架简介 一、函数式编程起源 ​ 函数式编程起源于数理逻辑&#xff08;范畴论&#xff0c;Category Theory&#xff09;&#xff0c;起源于λ演算&#xff0c;这是一种演算法&#xff0c;它定义一些基础的数据结构&#xff0c…

【Java】网络编程基础—InetAddress类和URL编程

&#x1f33a;个人主页&#xff1a;Dawn黎明开始 &#x1f380;系列专栏&#xff1a;Java ⭐每日一句&#xff1a;为了那个远方&#xff0c;你要奋不顾身 &#x1f4e2;欢迎大家&#xff1a;关注&#x1f50d;点赞&#x1f44d;评论&#x1f4dd;收藏⭐️ 文章目录 一.&#x…

Python编程技巧 – 使用字符串(Strings)

Python编程技巧 – 使用字符串&#xff08;Strings) Python Programming Essentials – Using Strings 本文简要介绍如何使用字符串&#xff0c;来进行Python编程。字符串有很多用途&#xff0c;包括输出结果、反馈状态、数据处理以及切片和文本筛选等 1. 字符串 字符串(St…

Java21新增特性

版本介绍 Java 21是Java平台的一个新版本&#xff0c;于2023年9月19日由Oracle公司正式发布。这个版本包含了数千个性能、稳定性和安全性更新&#xff0c;以及几十个新功能和增强。其中&#xff0c;15个增强被赋予了自己的JDK增强提案&#xff08;JEP&#xff09;&#xff0c;…