算法如下
密码转换为大写 用户名也转为大写
pass1(就是密码第一位) user1(就是用户名第一位)
(pass1-41)*9+(pass2-41)*2=x
x mod 1a=y
(user1-41)与y比较 相等则OK
(pass2-41)*3*4+(pass1-41)+(pass2-41)*3=x1
x1 mod 1a=y1
(user2-41)与y1比较相等则OK
以下同 循环比较第3位第4位第5位第6位等等
全部通过验证就OK
然后逆推一下
假设用户名为kyol k=6b y=79
4b-41=[(pass1-41)*9+(pass2-41)*2] mod 1a
59-41=[(pass2-41)*3*4+(pass1-41)+(pass2-41)*3] mod 1a
因为都转换为了大写 再减41刚好等于在26个字符中的位置 因此上面方程可以转换为这样 (16进制也转为10进制,这样好看一些)
10=(pass1*9+pass2*2) mod 26
24=(pass1+pass2*15) mod 26 pass1=8 pass2=8
则pass1=49 为 i pass2=49 为 i
下面解第3位与第4位
o为第14个 l为第11个
14=(pass3*9+pass4*2) mod 26
11=(pass3+pass4*15) mod 26 pass3=2 pass4=11
则pass3=c pass4=l
所以 用户名为:kyol 密码为:iicl
为了写注册机 我算出了 上面方程的通解
如下:
pass2=(((9*user2-user1)+26*((9*user2-user1) mod 3))/3) mod 26
pass1=(user2-15*pass2) mod 26
根据这个通解 可写出如下注册机 VB写的 代码如下
Private Sub Command1_Click()
Dim tmp As Long
tmp = Len(Text1.Text)
If tmp < 4 Then
MsgBox ("用户名长度不能小于4")
Exit Sub
End If
tmp1 = tmp Mod 2
If tmp1 <> 0 Then
MsgBox ("用户名长度必须为偶数")
Exit Sub
End If
For i = 1 To tmp
tmp3 = Mid(Text1.Text, i, 1)
If (Asc(tmp3) < 97 And Asc(tmp3) > 90) Or (Asc(tmp3) > 122) Or (Asc(tmp3) < 65) Then
MsgBox ("用户名必须为a-z或者A-Z之间的字符")
Exit Sub
Exit For
End If
Next i
For ii = 1 To tmp
tmp4 = Asc(Mid(Text1.Text, ii, 1))
If tmp4 > 96 Then
tmp5 = tmp5 + Chr(tmp4 - 32)
Else
tmp5 = tmp5 + Chr(tmp4)
End If
Next ii
For p = 1 To tmp Step 2
Y1 = Asc(Mid(tmp5, p, 1)) - 65
Y2 = Asc(Mid(tmp5, p + 1, 1)) - 65
X2 = ((9 * Y2 - Y1 + 26 * ((9 * Y2 - Y1) Mod 3)) / 3) Mod 26
X1 = (Y2 - 15 * X2) Mod 26
If X1 < 0 Then
X1 = X1 + 26
End If
If X2 < 0 Then
X2 = X2 + 26
End If
tmp6 = tmp6 + Chr(X1 + 97)
tmp6 = tmp6 + Chr(X2 + 97)
Next p
Text2.Text = tmp6