سلام ما یک تابع داریم به اسم تابع ساخت یوزرنیم.CUN
نقل قول: Private Function CreateProgramUserName() As String
VBMath.Randomize
Dim expression As String = ""
Dim num As Byte = 1
Do
expression = (expression & Strings.Mid(Support.Format(VBMath.Rnd, "0.0000", FirstDayOfWeek.Sunday, FirstWeekOfYear.Jan1), 3))
num = CByte((num + 1))
Loop While (num <= 3)
Return Support.Format(expression, "000000000000", FirstDayOfWeek.Sunday, FirstWeekOfYear.Jan1).Replace("0"c, "5"c)
End Function
یک تابع دیگه به نام ساخت پسوردCPW
نقل قول: Private Function CreateProgramPassword(ByVal UserName As String) As String
Dim num2 As Byte = 0
Dim str3 As String = ""
Dim start As Byte = 0
UserName = UserName.Replace(" ", "")
UserName = Strings.StrReverse(UserName)
UserName = UserName.TrimStart(New Char() { "0"c })
start = Conversions.ToByte(Strings.Mid(UserName, 1, 1))
str3 = Strings.Mid(UserName, 2, 1)
UserName = Strings.Mid(UserName, start)
num2 = CByte(Strings.Len(UserName))
Dim list As New List(Of String)
Dim num4 As Byte = num2
Dim i As Byte = 1
Do While (i <= num4)
start = CByte((start + 1))
Dim item As String = Strings.Right(Conversions.ToString(CLng((start Xor Conversions.ToLong(Strings.Mid(UserName, i, 1))))), 1)
If (item = "0") Then
item = str3
End If
list.Add(item)
i = CByte((i + 1))
Loop
Return Strings.StrReverse(Strings.Join(list.ToArray, "").Replace(" ", ""))
End Function
و در نهایت تابعی به اسم ExtractPsswordCountor که در اینجا بهش می گیم EPC
نقل قول: Private Function ExtractPsswordCountor(ByVal Password As String, ByRef Countor As Integer) As String
Dim str2 As String = ""
Try
Dim str3 As String = Strings.Mid(Password, 2, 2)
Password = (Strings.Mid(Password, 1, 1) & Strings.Mid(Password, 4))
Dim str4 As String = Strings.Mid(Password, 1, CInt(Math.Round(CDbl((Conversion.Int(CDbl((CDbl(Strings.Len(Password)) / 2))) - 1)))))
Countor = Conversions.ToInteger(Strings.Mid(Password, CInt(Math.Round(Conversion.Int(CDbl((CDbl(Strings.Len(Password)) / 2))))), 2))
Countor = CInt(Math.Round(CDbl((CDbl(Countor) * Conversions.ToDouble(str3)))))
Dim str5 As String = Strings.Mid(Password, CInt(Math.Round(CDbl((Conversion.Int(CDbl((CDbl(Strings.Len(Password)) / 2))) + 2)))))
str2 = (str4 & str5)
Catch exception1 As Exception
ProjectData.SetProjectError(exception1)
Dim exception As Exception = exception1
Information.Err.Clear
ProjectData.ClearProjectError
End Try
Return str2
End Function
خوب اول برنامه با استفاده از CNU یک کد تولید می کنه Code1
بعد کد تولید شده رو داخل EPC می زاره و کد جدیدی به دست میاد Code2
در نهایت با استفاده از Code1 در تابع CPW کد نهایی آماده می شه Code3
حالا اگر Code3 با Code2 برابر بود برنامه اجرا خواهد شد.
نقل قول: Public Function CheckProgramUserNamePassword(ByVal UserName As String, ByVal Password As String) As Integer
Dim countor As Integer = 0
Password = Me.ExtractPsswordCountor(Password, countor)
If (Me.CreateProgramPassword(UserName) = Password) Then
Return countor
End If
Return 0
End Function
حالا ما برای تولید کد باید این روند رو برعکس طی کنیم
یعنی اول با استفاده از یوزرنیمی که برنامه بهمون داده Code1 و قراردادن اون داخل CPW یک کد بدست بیاریمCode3
بعد با معکوس کردن الگوریتم تابع EPC کاری کنید که با دادن Code3 به ما کد Code2 رو بده.
این Code2 در واقع همون کدی هست که باید در برنامه به جای سریال وارد کنیم.
حالا سوال اینه معکوس الگوریتم تابع EPC چی میشه؟