一个网上学来的验证方法(附C#加密算法)
做软件开发的人,尤其是做共享软件的,最终都要对自己的软件加以保护。《加密与解密》上说网上80%的软件,都是通过序列号来实现保护的,具体做法是根据一个私人信息(如用户名、邮箱、硬件序列号等),经过一定的加密算法,得到软件注册号(序列号)。这种方式的缺点是,解密者能通过分析加密算法,比较容易写出同样的加密算法,也就是注册机。当然,解密者需要较深厚的编程功底。
个人认为,通过分析别人的加密算法,再应用到自己的程序中,对程序员来讲,不适为一种自我提高的捷径。
以下是我分析破解的某知名通讯软件的用户验证方法:
1、过程分析
因为是网络软件,所以分了服务器端,和客户端。服务器端负责发送随机字串GUID和记录Session,客户端根据GUID进行加密得到EncryptKey,再将EncryptKey发往服务器端进行验证。
分析的切入点是客户端,我们是无法控制服务器端(黑客方法除外)。从客户端,我们能得到接收到的参数GUID和加密过程。
2、加密算法分析
这是我通过多次跟踪后,得到的EXE中的加密函数
从上面分析看出,这个加密过程用到了两次md5加密,第一次结果的处理后,交由第二次加密。
3、加密算法还原C#代码
弄清楚了过程,写还原代码就简单了,以下是用C#实现的代码
个人认为,通过分析别人的加密算法,再应用到自己的程序中,对程序员来讲,不适为一种自我提高的捷径。
以下是我分析破解的某知名通讯软件的用户验证方法:
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(4, 5), strID, tmpStr.Substring(19, 5), 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
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(4, 5), strID, tmpStr.Substring(19, 5), 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