• 一个网上学来的验证方法(附C#加密算法)


        做软件开发的人,尤其是做共享软件的,最终都要对自己的软件加以保护。《加密与解密》上说网上80%的软件,都是通过序列号来实现保护的,具体做法是根据一个私人信息(如用户名、邮箱、硬件序列号等),经过一定的加密算法,得到软件注册号(序列号)。这种方式的缺点是,解密者能通过分析加密算法,比较容易写出同样的加密算法,也就是注册机。当然,解密者需要较深厚的编程功底。
        个人认为,通过分析别人的加密算法,再应用到自己的程序中,对程序员来讲,不适为一种自我提高的捷径。

        以下是我分析破解的某知名通讯软件的用户验证方法:
    1、过程分析
        因为是网络软件,所以分了服务器端,和客户端。服务器端负责发送随机字串GUID和记录Session,客户端根据GUID进行加密得到EncryptKey,再将EncryptKey发往服务器端进行验证。
        分析的切入点是客户端,我们是无法控制服务器端(黑客方法除外)。从客户端,我们能得到接收到的参数GUID和加密过程。

    2、加密算法分析
        这是我通过多次跟踪后,得到的EXE中的加密函数
     
    Code

    从上面分析看出,这个加密过程用到了两次md5加密,第一次结果的处理后,交由第二次加密。

    3、加密算法还原C#代码
         弄清楚了过程,写还原代码就简单了,以下是用C#实现的代码
     1        /// <summary>
     2        /// 加密函数
     3        /// </summary>
     4        /// <param name="strKey">RandomKey.aspx得到的随机字串</param>
     5        /// <param name="strID">某ID字串</param>
     6        /// <returns>加密文本</returns>

     7        public string GetEncrypKey(string strKey, string strID)
     8        {
     9            string result = "";
    10            //第一次加密
    11            MD5 md5 = new MD5CryptoServiceProvider();
    12            byte[] buffer = System.Text.Encoding.Default.GetBytes(strKey);
    13            byte[] EncrypArray = md5.ComputeHash(buffer);
    14            for (int i = 0; i < EncrypArray.Length; i++)
    15            {
    16                result += string.Format("{0:X2}", EncrypArray[i]);
    17            }

    18
    19            //为第二次加密准备数据
    20            string tmpStr = result.ToLower();
    21            string str2 = string.Format("{0}{1}{2}{3}", tmpStr.Substring(45), strID, tmpStr.Substring(195), strKey);
    22
    23            //第二次加密
    24            buffer = System.Text.Encoding.Default.GetBytes(str2);
    25            EncrypArray = md5.ComputeHash(buffer);
    26            result = "";
    27            for (int i = 0; i < EncrypArray.Length; i++)
    28            {
    29                result += string.Format("{0:X2}", EncrypArray[i]);
    30            }

    31            return result.ToLower();
    32        }

    33

  • 相关阅读:
    如何安装mysql
    07 登录接口开发
    06 跨域问题
    05 实体校验
    04 异常处理
    03 整合shiro+jwt 会话共享
    02 统一结果封装
    01 新建SpringBoot项目 整合Mybatis Plus(Spring Boot 前后端分离)
    结合Scikit-learn介绍几种常用的特征选择方法
    Set_ML
  • 原文地址:https://www.cnblogs.com/yuanbao/p/1103338.html
Copyright © 2020-2023  润新知