• 一款实用的.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加密

    封装方法

    1.         #region MD5
    2.         /// <summary>
    3.         /// MD5 hash
    4.         /// </summary>
    5.         /// <param name="srcString">The string to be encrypted.</param>
    6.         /// <param name="length">The length of hash result , default value is <see cref="MD5Length.L32"/>.</param>
    7.         /// <returns></returns>
    8.         public static string Md5(string srcString, MD5Length length = MD5Length.L32)
    9.         {
    10.             Check.Argument.IsNotEmpty(srcString, nameof(srcString));
    11.             string str_md5_out = string.Empty;
    12.             using (MD5 md5 = MD5.Create())
    13.             {
    14.                 byte[] bytes_md5_in = Encoding.UTF8.GetBytes(srcString);
    15.                 byte[] bytes_md5_out = md5.ComputeHash(bytes_md5_in);
    16.                 str_md5_out = length == MD5Length.L32
    17.                     ? BitConverter.ToString(bytes_md5_out)
    18.                     : BitConverter.ToString(bytes_md5_out, 48);
    19.                 str_md5_out = str_md5_out.Replace("-""");
    20.                 return str_md5_out;
    21.             }
    22.         }
    23.         #endregion

    调用结果

            public static void MD5_Test()
            {
                var srcString = "追逐时光者";
    
                var hashed = EncryptProvider.Md5(srcString);
    
                Console.WriteLine("MD5加密结果:" + hashed);
            }

    RSA加密&解密

    封装方法

    1.         /// <summary>
    2.         /// RSA encrypt
    3.         /// </summary>
    4.         /// <param name="publicKey">public key</param>
    5.         /// <param name="srcString">src string</param>
    6.         /// <param name="padding">rsa encryptPadding <see cref="RSAEncryptionPadding"/> RSAEncryptionPadding.Pkcs1 for linux/mac openssl </param>
    7.         /// <param name="isPemKey">set key is pem format,default is false</param>
    8.         /// <returns>encrypted string</returns>
    9.         public static string RSAEncrypt(string publicKey, string srcString, RSAEncryptionPadding padding, bool isPemKey = false)
    10.         {
    11.             Check.Argument.IsNotEmpty(publicKey, nameof(publicKey));
    12.             Check.Argument.IsNotEmpty(srcString, nameof(srcString));
    13.             Check.Argument.IsNotNull(padding, nameof(padding));
    14.             RSA rsa;
    15.             if (isPemKey)
    16.             {
    17.                 rsa = RsaProvider.FromPem(publicKey);
    18.             }
    19.             else
    20.             {
    21.                 rsa = RSA.Create();
    22.                 rsa.FromJsonString(publicKey);
    23.             }
    24.             using (rsa)
    25.             {
    26.                 var maxLength = GetMaxRsaEncryptLength(rsa, padding);
    27.                 var rawBytes = Encoding.UTF8.GetBytes(srcString);
    28.                 if (rawBytes.Length > maxLength)
    29.                 {
    30.                     throw new OutofMaxlengthException($"'{srcString}' is out of max encrypt length {maxLength}", maxLength, rsa.KeySize, padding);
    31.                 }
    32.                 byte[] encryptBytes = rsa.Encrypt(rawBytes, padding);
    33.                 return encryptBytes.ToHexString();
    34.             }
    35.         }
    36.         
    37.         /// <summary>
    38.         /// RSA decrypt
    39.         /// </summary>
    40.         /// <param name="publicKey">public key</param>
    41.         /// <param name="srcString">src string</param>
    42.         /// <param name="padding">rsa encryptPadding <see cref="RSAEncryptionPadding"/> RSAEncryptionPadding.Pkcs1 for linux/mac openssl </param>
    43.         /// <param name="isPemKey">set key is pem format,default is false</param>
    44.         /// <returns>encrypted string</returns>
    45.         public static string RSADecrypt(string privateKey, string srcString, RSAEncryptionPadding padding, bool isPemKey = false)
    46.         {
    47.             Check.Argument.IsNotEmpty(privateKey, nameof(privateKey));
    48.             Check.Argument.IsNotEmpty(srcString, nameof(srcString));
    49.             Check.Argument.IsNotNull(padding, nameof(padding));
    50.             RSA rsa;
    51.             if (isPemKey)
    52.             {
    53.                 rsa = RsaProvider.FromPem(privateKey);
    54.             }
    55.             else
    56.             {
    57.                 rsa = RSA.Create();
    58.                 rsa.FromJsonString(privateKey);
    59.             }
    60.             using (rsa)
    61.             {
    62.                 byte[] srcBytes = srcString.ToBytes();
    63.                 byte[] decryptBytes = rsa.Decrypt(srcBytes, padding);
    64.                 return Encoding.UTF8.GetString(decryptBytes);
    65.             }
    66.         }

    调用结果

    1.         #region Rsa加密&解密
    2.         public static void Rsa_Encrypt_Decrypt_Test(RsaSize size)
    3.         {
    4.             var rsaKey = EncryptProvider.CreateRsaKey(size);
    5.             var srcString = "追逐时光者";
    6.             var encrypted = EncryptProvider.RSAEncrypt(rsaKey.PublicKey, srcString);
    7.             Console.WriteLine("RSA加密结果:" + encrypted);
    8.             Console.WriteLine("\r\n");
    9.             var decrypted = EncryptProvider.RSADecrypt(rsaKey.PrivateKey, encrypted);
    10.             Console.WriteLine("RSA解密结果:" + decrypted);
    11.         }
    12.         #endregion

    DES加密&解密

    封装方法

    1.         /// <summary>
    2.         /// DES encrypt
    3.         /// </summary>
    4.         /// <param name="data">Raw data byte array</param>
    5.         /// <param name="key">Key, requires 24 bits</param>
    6.         /// <param name="vector">IV,requires 8 bits</param>
    7.         /// <returns>Encrypted byte array</returns>
    8.         public static byte[] DESEncrypt(byte[] datastring keystring vector)
    9.         {
    10.             Check.Argument.IsNotEmpty(data, nameof(data));
    11.             Check.Argument.IsNotEmpty(key, nameof(key));
    12.             Check.Argument.IsEqualLength(key.Length24, nameof(key));
    13.             Check.Argument.IsNotEmpty(vector, nameof(vector));
    14.             Check.Argument.IsEqualLength(vector.Length8, nameof(vector));
    15.             return DESEncrypt(datakey, CipherMode.CBC, vector);
    16.         }
    17.         /// <summary>
    18.         /// DES encrypt
    19.         /// </summary>
    20.         /// <param name="data">Raw data</param>
    21.         /// <param name="key">Key, requires 24 bits</param>
    22.         /// <param name="cipherMode"><see cref="CipherMode"/></param>
    23.         /// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>
    24.         /// <param name="vector">IV,requires 8 bits</param>
    25.         /// <returns>Encrypted byte array</returns>
    26.         private static byte[] DESEncrypt(byte[] datastring key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7)
    27.         {
    28.             Check.Argument.IsNotEmpty(data, nameof(data));
    29.             Check.Argument.IsNotEmpty(key, nameof(key));
    30.             Check.Argument.IsEqualLength(key.Length24, nameof(key));
    31.             using (MemoryStream Memory = new MemoryStream())
    32.             {
    33.                 using (TripleDES des = TripleDES.Create())
    34.                 {
    35.                     byte[] plainBytes = data;
    36.                     byte[] bKey = new byte[24];
    37.                     Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
    38.                     des.Mode = cipherMode;
    39.                     des.Padding = paddingMode;
    40.                     des.Key = bKey;
    41.                     if (cipherMode == CipherMode.CBC)
    42.                     {
    43.                         byte[] bVector = new byte[8];
    44.                         Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);
    45.                         des.IV = bVector;
    46.                     }
    47.                     using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateEncryptor(), CryptoStreamMode.Write))
    48.                     {
    49.                         try
    50.                         {
    51.                             cryptoStream.Write(plainBytes, 0, plainBytes.Length);
    52.                             cryptoStream.FlushFinalBlock();
    53.                             return Memory.ToArray();
    54.                         }
    55.                         catch (Exception ex)
    56.                         {
    57.                             return null;
    58.                         }
    59.                     }
    60.                 }
    61.             }
    62.         }
    63.         
    64.         /// <summary>
    65.         /// DES encrypt
    66.         /// </summary>
    67.         /// <param name="data">Raw data byte array</param>
    68.         /// <param name="key">Key, requires 24 bits</param>
    69.         /// <param name="vector">IV,requires 8 bits</param>
    70.         /// <returns>Encrypted byte array</returns>
    71.         public static byte[] DESDecrypt(byte[] datastring keystring vector)
    72.         {
    73.             Check.Argument.IsNotEmpty(data, nameof(data));
    74.             Check.Argument.IsNotEmpty(key, nameof(key));
    75.             Check.Argument.IsEqualLength(key.Length24, nameof(key));
    76.             Check.Argument.IsNotEmpty(vector, nameof(vector));
    77.             Check.Argument.IsEqualLength(vector.Length8, nameof(vector));
    78.             return DESDecrypt(datakey, CipherMode.CBC, vector);
    79.         }
    80.         /// <summary>
    81.         /// DES decrypt
    82.         /// </summary>
    83.         /// <param name="data">Encrypted data</param>
    84.         /// <param name="key">Key, requires 24 bits</param>
    85.         /// <param name="cipherMode"><see cref="CipherMode"/></param>
    86.         /// <param name="paddingMode"><see cref="PaddingMode"/> default is PKCS7</param>
    87.         /// <returns>Decrypted byte array</returns>
    88.         private static byte[] DESDecrypt(byte[] datastring key, CipherMode cipherMode, string vector = "", PaddingMode paddingMode = PaddingMode.PKCS7)
    89.         {
    90.             Check.Argument.IsNotEmpty(data, nameof(data));
    91.             Check.Argument.IsNotEmpty(key, nameof(key));
    92.             Check.Argument.IsEqualLength(key.Length24, nameof(key));
    93.             byte[] encryptedBytes = data;
    94.             byte[] bKey = new byte[24];
    95.             Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
    96.             using (MemoryStream Memory = new MemoryStream(encryptedBytes))
    97.             {
    98.                 using (TripleDES des = TripleDES.Create())
    99.                 {
    100.                     des.Mode = cipherMode;
    101.                     des.Padding = paddingMode;
    102.                     des.Key = bKey;
    103.                     if (cipherMode == CipherMode.CBC)
    104.                     {
    105.                         byte[] bVector = new byte[8];
    106.                         Array.Copy(Encoding.UTF8.GetBytes(vector.PadRight(bVector.Length)), bVector, bVector.Length);
    107.                         des.IV = bVector;
    108.                     }
    109.                     using (CryptoStream cryptoStream = new CryptoStream(Memory, des.CreateDecryptor(), CryptoStreamMode.Read))
    110.                     {
    111.                         try
    112.                         {
    113.                             byte[] tmp = new byte[encryptedBytes.Length];
    114.                             int len = cryptoStream.Read(tmp, 0, encryptedBytes.Length);
    115.                             byte[] ret = new byte[len];
    116.                             Array.Copy(tmp, 0, ret, 0, len);
    117.                             return ret;
    118.                         }
    119.                         catch
    120.                         {
    121.                             return null;
    122.                         }
    123.                     }
    124.                 }
    125.             }
    126.         }

    调用结果

    1.         #region DES加密&解密
    2.         public static void DES_Encrypt_Decrypt_Test()
    3.         {
    4.             var srcString = "TEST DES Encrypt Decrypt";
    5.             string key = EncryptProvider.CreateDesKey();
    6.             string iv = EncryptProvider.CreateDesIv();
    7.             var srsDatas = Encoding.UTF8.GetBytes(srcString);
    8.             var encrypted = EncryptProvider.DESEncrypt(srsDatas, key, iv);
    9.             Console.WriteLine("DES加密结果:" + encrypted); 
    10.             
    11.             Console.WriteLine("\r\n");
    12.             var decrypted = EncryptProvider.DESDecrypt(encrypted, key, iv);
    13.             var decryptedStr = Encoding.UTF8.GetString(decrypted);
    14.             Console.WriteLine("DES解密结果:" + decryptedStr);
    15.         }
    16.         #endregion

    AES加密&解密

    封装方法

    1.         /// <summary>
    2.         /// AES encrypt ( no IV)
    3.         /// </summary>
    4.         /// <param name="data">Raw data</param>
    5.         /// <param name="key">Key, requires 32 bits</param>
    6.         /// <returns>Encrypted string</returns>
    7.         public static string AESEncrypt(string datastring key)
    8.         {
    9.             Check.Argument.IsNotEmpty(data, nameof(data));
    10.             Check.Argument.IsNotEmpty(key, nameof(key));
    11.             Check.Argument.IsEqualLength(key.Length32, nameof(key));
    12.             using (MemoryStream memory = new MemoryStream())
    13.             {
    14.                 using (Aes aes = Aes.Create())
    15.                 {
    16.                     byte[] plainBytes = Encoding.UTF8.GetBytes(data);
    17.                     byte[] bKey = new byte[32];
    18.                     Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
    19.                     aes.Mode = CipherMode.ECB;
    20.                     aes.Padding = PaddingMode.PKCS7;
    21.                     aes.KeySize = 256;
    22.                     aes.Key = bKey;
    23.                     using (CryptoStream cryptoStream = new CryptoStream(memory, aes.CreateEncryptor(), CryptoStreamMode.Write))
    24.                     {
    25.                         try
    26.                         {
    27.                             cryptoStream.Write(plainBytes, 0, plainBytes.Length);
    28.                             cryptoStream.FlushFinalBlock();
    29.                             return Convert.ToBase64String(memory.ToArray());
    30.                         }
    31.                         catch (Exception ex)
    32.                         {
    33.                             return null;
    34.                         }
    35.                     }
    36.                 }
    37.             }
    38.         }
    39.         
    40.         /// <summary>
    41.         /// AES decrypt( no IV)
    42.         /// </summary>
    43.         /// <param name="data">Encrypted data</param>
    44.         /// <param name="key">Key, requires 32 bits</param>
    45.         /// <returns>Decrypted string</returns>
    46.         public static string AESDecrypt(string datastring key)
    47.         {
    48.             Check.Argument.IsNotEmpty(data, nameof(data));
    49.             Check.Argument.IsNotEmpty(key, nameof(key));
    50.             Check.Argument.IsEqualLength(key.Length32, nameof(key));
    51.             byte[] encryptedBytes = Convert.FromBase64String(data);
    52.             byte[] bKey = new byte[32];
    53.             Array.Copy(Encoding.UTF8.GetBytes(key.PadRight(bKey.Length)), bKey, bKey.Length);
    54.             try
    55.             {
    56.                 byte[] decryptedData = null// decrypted data
    57.                 using (MemoryStream memory = new MemoryStream(encryptedBytes))
    58.                 {
    59.                     using (Aes aes = Aes.Create())
    60.                     {
    61.                         aes.Mode = CipherMode.ECB;
    62.                         aes.Padding = PaddingMode.PKCS7;
    63.                         aes.KeySize = 256;
    64.                         aes.Key = bKey;
    65.                         using (CryptoStream decryptor = new CryptoStream(memory, aes.CreateDecryptor(), CryptoStreamMode.Read))
    66.                         {
    67.                             using (MemoryStream tempMemory = new MemoryStream())
    68.                             {
    69.                                 byte[] buffer = new byte[1024];
    70.                                 Int32 readBytes = 0;
    71.                                 while ((readBytes = decryptor.Read(buffer, 0, buffer.Length)) > 0)
    72.                                 {
    73.                                     tempMemory.Write(buffer, 0, readBytes);
    74.                                 }
    75.                                 decryptedData = tempMemory.ToArray();
    76.                                 return Encoding.UTF8.GetString(decryptedData);
    77.                             }
    78.                         }
    79.                     }
    80.                 }
    81.             }
    82.             catch
    83.             {
    84.                 return null;
    85.             }
    86.         }

    调用结果

    1.         #region AES加密&解密
    2.         public static void Aes_Encrypt_Decrypt_Test()
    3.         {
    4.             var aesKey = EncryptProvider.CreateAesKey();
    5.             var key = aesKey.Key;
    6.             var srcString = "追逐时光者";
    7.             var encrypted = EncryptProvider.AESEncrypt(srcString, key);
    8.             Console.WriteLine("AES加密结果:" + encrypted);
    9.             Console.WriteLine("\r\n");
    10.             var decrypted = EncryptProvider.AESDecrypt(encrypted, key);
    11.             Console.WriteLine("AES解密结果:" + decrypted);
    12.         }
    13.         #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技术社区微信交流群👪

  • 相关阅读:
    git stash 问题记录
    ps命令介绍及常用操作和参数说明
    拦截器与过滤器的区别
    Linux-安装tomcat以及开启防火墙
    STM32F103VET6基于ENC28J60移植LWIP1.4.1(标准库,无RTOS)
    AndroidStudio 运行报错:Invalid keystore format
    闲聊互联网经济的现代化
    (Java版)大小写转换设计一个程序, 输入一行字符串, 将其中大写转为小写, 小写转为大写. 其余字符不变
    2021-09-07-Cookie&&Session
    eclipse svn插件安装
  • 原文地址:https://blog.csdn.net/qq_37237487/article/details/134498350