Option Explicit
Dim Num1 As Integer
Dim Num2 As Integer
Dim Num3 As Integer
Dim Num4 As Integer
Dim Num5 As Integer
Dim Num6 As Integer
Dim Num7 As Integer
Dim I, J, K As Integer
Dim FileName As String
Dim FileNum As Integer
Dim Pass As String
Dim Pass1 As String
Private Sub Form_Load()
Me.Show
If Len(App.Path) = 3 Then
FileName = App.Path & App.EXEName & ".txt"
Else
FileName = App.Path & "\" & App.EXEName & ".txt"
End If
FileNum = FreeFile()
Open FileName For Output As #FileNum
GetPass
End Sub
Private Sub GetPass()
For Num1 = 48 To 122
DoEvents
If Num1 > 57 And Num1 < 65 Then Num1 = 65
If Num1 > 90 And Num1 < 97 Then Num1 = 97
For Num2 = 48 To 122
DoEvents
If Num2 > 57 And Num2 < 65 Then Num2 = 65
If Num2 > 90 And Num2 < 97 Then Num2 = 97
For Num3 = 48 To 122
DoEvents
If Num3 > 57 And Num3 < 65 Then Num3 = 65
If Num3 > 90 And Num3 < 97 Then Num3 = 97
For Num4 = 48 To 122
DoEvents
If Num4 > 57 And Num4 < 65 Then Num4 = 65
If Num4 > 90 And Num4 < 97 Then Num4 = 97
For Num5 = 48 To 122
DoEvents
If Num5 > 57 And Num5 < 65 Then Num5 = 65
If Num5 > 90 And Num5 < 97 Then Num5 = 97
For Num6 = 48 To 122
DoEvents
If Num6 > 57 And Num6 < 65 Then Num6 = 65
If Num6 > 90 And Num6 < 97 Then Num6 = 97
For Num7 = 48 To 122
DoEvents
If Num7 > 57 And Num7 < 65 Then Num7 = 65
If Num7 > 90 And Num7 < 97 Then Num7 = 97
Pass = Chr(Num1) & Chr(Num2) & Chr(Num3) & Chr(Num4) & Chr(Num5) & Chr(Num6) & Chr(Num7)
J = 0
For I = 1 To 7
If Mid(Pass, I, 1) = 0 Then
J = J + 1
Else
Exit For
End If
Next I
For K = 0 To J
Pass1 = Right(Pass, Len(Pass) - K)
Print #FileNum, Pass1
Next K
Next
Next
Next
Next
Next
Next
Next
MsgBox "完成。"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Close #FileNum
End Sub
循环特别大。
对了,上面在for 之后判断asc 的时候也不是全加1的。
由于判断的代码有点儿多。你可以另写一个子程序来调 用。
在七个主循环中
for i(n)=48 to 122 ‘49是“0”的ASCII,122是“z“的ASCII
if asc>57 AND asc<65 then asc=65 '当大于9小于A则取A
if asc>90 AND asc<97 then asc=97 '当大于Z小于a则取a
用上面的一个是烦。我都觉得不好。
那就用下面一个吧。昨天晚上就想好了的。不过要关电了没时间说。
for i1=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i2=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i3=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i4=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i5=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i6=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i7=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
pass=asc(i1) & asc(i2) & ... &asc(i7)
‘语句就在这里加入。
next
.
.
.
next
就下面一个就行了,几本上全都包括了。有一个问题就是
0,00,000,0000,00000,000000,0000000 这几个不是数字
所以需要在循环体中加入一个语句。
这个语句是判断PASS这个字符串前头有几个0
如果有一个0则生成两个密码:
eg1: pass='012abdd'
写入后,再让
pass='12abdd'
eg2: pass='0000000'
写入
pass='000000'
..
pass='0'
注意:在这里你可以用两个循环就可以了完成上面的操作。
eg: j=0
for i=1 to 7
if mid(pass,i,1)="0" then
j=j+1
else
exit for '如果检测到不为0,就没必要再往下测了
end if
next for
’然后进行去0
for k=1 to j
pass1=right(pass,len(pass)-k)
next k
Private Sub Command1_Click()
On Error Resume Next
Dim a(1 To 62) As String, temp As String
For i = 1 To 26
a(i) = Chr(i + 64)
a(i + 26) = Chr(i + 97)
a(i + 52) = i
Next
For i = 1 To 62
For j = 1 To 62
For k = 1 To 62
'For l = 1 To 62
Debug.Print a(i); a(j); a(k); a(l)
'Next
Next
Next
Next
End Sub
Private Sub Form_Load()
Dim CharCollect(1 To 62) As String
Dim i As Integer
Dim J1 As Integer, J2 As Integer, J3 As Integer, J4 As Integer
Dim J5 As Integer, J6 As Integer, J7 As Integer
For i = 0 To 9
CharCollect(i + 1) = i
Next i
For i = 1 To 26
CharCollect(i + 10) = Chr(Asc("a") + i - 1)
Next i
For i = 1 To 26
CharCollect(i + 36) = Chr(Asc("A") + i - 1)
Next i
' 这样就得到了一个数组了,里面每一个项都是字典里要用到的字符
' 因字典文件中需要的数据为所有可能的项,所以不考虑字符被重复使用的问题
Dim ResultString(1 To 7) As String
Dim WriteString As String
For i = 1 To 7
ResultString(i) = ""
Next i
For J1 = LBound(CharCollect) To UBound(CharCollect)
ResultString(1) = CharCollect(J1)
WriteString = ResultString(1) ' 此处可将所有一位的串写入字典文件中
Next J1
For J1 = LBound(CharCollect) To UBound(CharCollect)
ResultString(1) = CharCollect(J1)
For J2 = LBound(CharCollect) To UBound(CharCollect)
ResultString(2) = CharCollect(J2)
WriteString = ResultString(1) & ResultString(2) ' 写入2位的
Next J2
Next J1
For J1 = LBound(CharCollect) To UBound(CharCollect)
ResultString(1) = CharCollect(J1)
For J2 = LBound(CharCollect) To UBound(CharCollect)
ResultString(2) = CharCollect(J2)
For J3 = LBound(CharCollect) To UBound(CharCollect)
ResultString(3) = CharCollect(J3)
WriteString = ResultString(1) & ResultString(2) & ResultString(3) ' 写入3位的
Next J3
Next J2
Next J1
由于生成的文件太大,我还没生成完就看到有N多M了。
生成完恐怕会有10几M 吧??我用记事本打开还没生成完的
差点儿死机。下面是改进过的。我是把这个字典存成了多个文件。
不知道这样会不会影响。
Option Explicit
Dim Num1 As Integer
Dim Num2 As Integer
Dim Num3 As Integer
Dim Num4 As Integer
Dim Num5 As Integer
Dim Num6 As Integer
Dim Num7 As Integer
Dim I, J, K As Integer
Dim FileName As String
Dim FileNum As Integer
Dim FName As String
Dim Pass As String
Dim Pass1 As String
Private Sub Form_Load()
Me.Show
FName = "1"
OpenFile FName
GetPass
End Sub
Private Sub OpenFile(FName)
If Len(App.Path) = 3 Then
FileName = App.Path & FName & ".txt"
Else
FileName = App.Path & "\" & FName & ".txt"
End If
FileNum = FreeFile()
Open FileName For Output As #FileNum
End Sub
Private Sub GetPass()
For Num1 = 48 To 122
DoEvents
If Num1 > 57 And Num1 < 65 Then Num1 = 65
If Num1 > 90 And Num1 < 97 Then Num1 = 97
For Num2 = 48 To 122
DoEvents
If Num2 > 57 And Num2 < 65 Then Num2 = 65
If Num2 > 90 And Num2 < 97 Then Num2 = 97
For Num3 = 48 To 122
DoEvents
If Num3 > 57 And Num3 < 65 Then Num3 = 65
If Num3 > 90 And Num3 < 97 Then Num3 = 97
For Num4 = 48 To 122
DoEvents
If Num4 > 57 And Num4 < 65 Then Num4 = 65
If Num4 > 90 And Num4 < 97 Then Num4 = 97
For Num5 = 48 To 122
DoEvents
If Num5 > 57 And Num5 < 65 Then Num5 = 65
If Num5 > 90 And Num5 < 97 Then Num5 = 97
For Num6 = 48 To 122
DoEvents
If Num6 > 57 And Num6 < 65 Then Num6 = 65
If Num6 > 90 And Num6 < 97 Then Num6 = 97
For Num7 = 48 To 122
DoEvents
If Num7 > 57 And Num7 < 65 Then Num7 = 65
If Num7 > 90 And Num7 < 97 Then Num7 = 97
Pass = Chr(Num1) & Chr(Num2) & Chr(Num3) & Chr(Num4) & Chr(Num5) & Chr(Num6) & Chr(Num7)
J = 0
For I = 1 To 7
If Mid(Pass, I, 1) = 0 Then
J = J + 1
Else
Exit For
End If
Next I
For K = 0 To J
Pass1 = Right(Pass, Len(Pass) - K)
If FileLen(FileName) > 1200000 Then
Close #FileNum
FName = CStr(Val(FName) + 1)
OpenFile FName
End If
Print #FileNum, Pass1
Next K
Next
Next
Next
Next
Next
Next
Next
MsgBox "完成。"
End Sub
Private Sub Form_Unload(Cancel As Integer)
Close #FileNum
End Sub
全数字的 从0~9999999
全小写字母的 从a~zzzzzzz
全大写字线的 从A~ZZZZZZZ
混排:
单的就不用排了,都排过了。
从二位密码开始
for i=0 to 9
for j=asc("a") to asc("z")
'两位密码的所有排列
pass=i & chr(j)
写入文件
pass=i & chr(j-32)
写入文件
pass=chr(j) & i
写入文件
pass=chr(j-32) & i
写入文件
pass=chr(j) & chr(j-32)
写入文件
pass=chr(j-32) & chr(j)
写入文件
’三位密码的所有排列
...
'四位密码的所有排列
...
...
'七位密码的所有排列
next j
next i
多加几个EVENTS
对了,又想到一种方法似乎要好些。
for i1=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i2=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i3=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i4=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i5=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i6=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
for i7=最小asc值 to 最大asc值
if asc取到中间不需要的值就把asc加1
pass=asc(i1) & asc(i2) & ... &asc(i7)
next
.
.
.
next
不好意思。我不是高手,只能想到这么蠢的办法。
要关电了。。今天晚上做个梦,也许明天会有更好的办法。