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