大学生
 
- 金币
- 2095
- 好评
- 1
- 信誉
- 100
|
发表于
2025-12-22 14:42:09
|
显示全部楼层
来自 江苏
也看了一下算法的地方
public static boolean g(String str, String str2) {
b bVar = f1727a; 这个函数是标准的MD5
a.y = a(bVar.m(a.f(str.substring(0, 5) + "-41231".substring(1, 5))));
f(str2);
String e2 = e(str2);
if (str2.length() != 15) {
return false;
}
if (!a.y.equals(e2)) {
a.z = false;
return false;
}
a.z = true;
return true;
}
}
1. str 为机器码 str2为注册码 通过函数g来比较
2. a.y = a(bVar.m(a.f(str.substring(0, 5) + "-41231".substring(1, 5)))); 这样实际是取机器码前5位与4123链接成9位 进行f 函数运算,bVar.m这个函数是标准的MD5
下面查看f函数
public static String f(String str) {
int length = str.length();
if (length <= 0) {
return "";
}
long j2 = 0;
for (int i2 = 0; i2 < length; i2++) {
byte charAt = (byte) str.charAt(i2);
int i3 = charAt + 7;
int i4 = charAt * 5;
j2 = (j2 + ((long) j(charAt, i3, i4)) + ((long) k(charAt, i3, i4)) + ((long) l(charAt, i3, i4))) * ((long) (m(charAt, i3, i4) + 12));
if (j2 > 100000000) {
j2 = (long) Integer.parseInt(String.valueOf(j2).substring(String.valueOf(j2).length() - 7));
}
}
String valueOf = String.valueOf(j2);
return valueOf.length() >= 6 ? valueOf.substring(valueOf.length() - 6) : String.valueOf(j2 + 523109);
} public static int j(int i2, int i3, int i4) {
return (i2 << 2) | (i3 & i4);
}
public static int k(int i2, int i3, int i4) {
return i2 & i4 & ((i3 << 3) | i4);
}
public static int l(int i2, int i3, int i4) {
return (i2 & (i4 << 2)) | ((i3 << 3) & i4);
}
public static int m(int i2, int i3, int i4) {
return (i2 << 4) & (i4 << 2) & ((i3 << 2) | i4);
} 里面调用到是j\k\l\m4个函数
3.经过变换后取MD5值
4.将MD5值进入a函数
public static String a(String str) {
String str2;
String str3 = "";
if (str.length() > 0) {
str2 = str3;
for (int i2 = 0; i2 < str.length(); i2++) {
char charAt = str.charAt(i2);
if (Character.isDigit(charAt)) {
str2 = str2 + charAt;
}
}
} else {
str2 = str3;
} 到这一步实际是取MD5值的数字,字母去除
if (str2.length() >= 12) {
str2 = str2.substring(2, 6) + str2.substring(5, 9) + str2.substring(8, 12);
}
int i3 = 0;
while (i3 < str2.length()) {
int i4 = i3 + 1;
str3 = str3 + String.valueOf(Integer.parseInt(str2.substring(i3, i4)) ^ 4);
i3 = i4;
}
if (str3.length() > 12) {
str3 = str3.substring(0, 12);
}
String valueOf = String.valueOf(Long.parseLong(str3) + 10832712602L);
return valueOf.substring(3, 5) + valueOf.substring(8, 10) + valueOf.substring(6, 8); 得到6位值
5. 再来看看下面的比较
String e2 = e(str2); 取注册码进入函数e
if (str2.length() != 15) { 注册码为15位
return false;
}
if (!a.y.equals(e2)) { 不等,注册不成功
a.z = false;
return false;
}
a.z = true; 否则注册成功
return true; public static String e(String str) {
return str.substring(2, 5) + str.substring(11, 14); 注册码3-5及12-14这6位的值
} 6.最后注册码实际是比较6个位的值,通过机器码算出6位值,分别与注册码3-5及12-14这6位的值比较
7.1-2位好象暂时没用到,随机取88吧;6-11位对应的是到期时间对应年月日,最后一位也没发现,随机取8吧
如机器码:F586817E-41231 注册码:884453812127828 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
|