一款实用的.NET Core加密解密工具类库

发布时间:2024年01月18日

图片

前言

在我们日常开发工作中,为了数据安全问题对数据加密、解密是必不可少的。加密方式有很多种如常见的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支持💖。

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

文章来源:https://blog.csdn.net/qq_37237487/article/details/135647742
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。