经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
一款实用的.NET Core加密解密工具类库
来源:cnblogs  作者:追逐时光者  时间:2023/11/20 8:57:23  对本文有异议

前言

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

调用结果

  1.         public static void MD5_Test()
            {
                var srcString = "追逐时光者";

                var hashed = EncryptProvider.Md5(srcString);

                Console.WriteLine("MD5加密结果:" + hashed);
            }

RSA加密&解密

封装方法

  1.         /// <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);
                }
            }

调用结果

  1.         #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加密&解密

封装方法

  1.         /// <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;
                            }
                        }
                    }
                }
            }

调用结果

  1.         #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加密&解密

封装方法

  1.         /// <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;
                }
            }

调用结果

  1.         #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

DotNetGuide技术社区交流群

  • DotNetGuide技术社区是一个面向.NET开发者的开源技术社区,旨在为开发者们提供全面的C#/.NET/.NET Core相关学习资料、技术分享和咨询、项目推荐、招聘资讯和解决问题的平台。
  • 在这个社区中,开发者们可以分享自己的技术文章、项目经验、遇到的疑难技术问题以及解决方案,并且还有机会结识志同道合的开发者。
  • 我们致力于构建一个积极向上、和谐友善的.NET技术交流平台,为广大.NET开发者带来更多的价值和成长机会。

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

原文链接:https://www.cnblogs.com/Can-daydayup/p/17843011.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号