19
2020
12

MD5加密算法-自定义变换

有人说MD5已经被破解,不安全了

没事研究一下有可能过时的MD5,看看到底有没过时?


算法:

    //using System.Security.Cryptography;
    public class EncryptHelper
    {
        private static Dictionary<char, string> customeMd5Dict = new Dictionary<char, string>();
        static EncryptHelper()
        {
            string customeMd5Key = "0123456789ABCDEF";//可自定义修改或调换顺序
            string customeMd5Value = "ABCDEF0123456789";//可自定义修改或调换顺序
            for(var i=0;i<customeMd5Key.Length;i++){
                customeMd5Dict.Add(customeMd5Key.ElementAt(i), customeMd5Value.Substring(i,1));
            }
            
        }

        /// <summary>
        /// MD5 hash加密【默认自定义-更复杂】
        /// </summary>
        /// <param name="str"></param>
        /// <returns></returns>
        public static string MD5(string str, bool isCustomed = true)
        {
            if (str == null)
            {
                throw new ArgumentException("加密内容为NULL", "str");
            }
            str = str.Replace(" ", "");
            using (var md5Provider = new MD5CryptoServiceProvider())
            {
                //长度32位
                var md5 = string.Empty;
                if (isCustomed)//自定义md5
                {
                    string securityCode = "EncRYptMd5010100";//安全码,可自定义修改,PS:其他方式,一般需要登录的系统可使用(用户名+密码再做一些变换)加密后作为密码
                    
                    //原生字符串+安全码进行MD5
                    md5 = BitConverter.ToString(md5Provider.ComputeHash(Encoding.UTF8.GetBytes(str.Trim() + securityCode))).Replace("-", "");
                    string left = "", right = "";
                    //经过5次固定抽取5个字符拼接
                    left += (char.IsDigit(md5, 6) ? md5.Substring(5, 1) : md5.Substring(7, 1));
                    left += (char.IsDigit(md5, 13) ? md5.Substring(12, 1) : md5.Substring(14, 1));
                    right += (char.IsDigit(md5, 20) ? md5.Substring(19, 1) : md5.Substring(21, 1));
                    right += (char.IsDigit(md5, 27) ? md5.Substring(26, 1) : md5.Substring(28, 1));
                    string middle = (char.IsDigit(md5, 14) ? md5.Substring(13, 1) : md5.Substring(15, 1));
                    md5 = (left + md5 + right).Insert(18, middle);//32+5=37位
                    left = "";
                    right = "";
                    for (int i = 23; i < 37; i++)//后14位变换
                    {
                        right += customeMd5Dict[md5.ElementAt(i)];
                    }
                    for (int i = 0; i < 13; i++)//前13位变换
                    {
                        left += customeMd5Dict[md5.ElementAt(i)];
                    }
                    md5 = left + md5 + right;//长度64位
                }
                else
                {
                    //标准MD5,长度32位
                    md5 = BitConverter.ToString(md5Provider.ComputeHash(Encoding.UTF8.GetBytes(str.Trim()))).Replace("-", "");
                }
                return md5;
            }
        }
    }


测试:

        public static void test()
        {
            string originalKey = "Pwd123$";
            var md5 = EncryptHelper.MD5(originalKey, true);
            Console.WriteLine("原始密码:" + originalKey);
            Console.WriteLine("加密后:" + md5);
            Console.WriteLine("length:" + md5.Length);
            Console.ReadKey();
        }


效果:



这自定义算法可还ok?有没有人能写出破解算法?

欢迎交流!



版权声明:
作者:真爱无限 出处:http://www.pukuimin.top 本文为博主原创文章版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接.
« 上一篇下一篇 »

相关文章:

评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。