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