生成密码字典问题!

icehouse 2004-04-21 06:31:26
条件是a-z,A-Z,0-9.
生成1-7位密码字典!
字符 ASCII码直
a 97
A 65
0 48
请指教啊!
...全文
288 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ryuginka 2004-04-22
  • 打赏
  • 举报
回复
up
老吹老吹 2004-04-22
  • 打赏
  • 举报
回复
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
循环特别大。
老吹老吹 2004-04-22
  • 打赏
  • 举报
回复
对了,上面在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
老吹老吹 2004-04-22
  • 打赏
  • 举报
回复
用上面的一个是烦。我都觉得不好。
那就用下面一个吧。昨天晚上就想好了的。不过要关电了没时间说。
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

用这个方法可以得出全部的从0~zzzzzzz的所有密码。至于具体的代码
我想你自己应该知道怎么写了吧?如果实在写不出来我可以帮你写。
建议你尽量还是自己写。
icehouse 2004-04-22
  • 打赏
  • 举报
回复
另外我要所有的任意组合,允许有这样的情况出现,aAaAzZZ11
你能明白吗?
icehouse 2004-04-22
  • 打赏
  • 举报
回复
可是在数据排列上你的第一个方法好象不是很便捷,
如果我要生成7位密码的话,那起不是要写好多排列组合的代码了吗!严密一些的话,能否要个效率高的算法啊!把排列组合的问题搞定!至于附直你看看可以不可以用WHILE然后结合条件把他们的取直区间划分一下,到了特定是数值就执行相应的加操作然后变量直总是自加一,特定情况除外!这样行不呢?
icehouse 2004-04-22
  • 打赏
  • 举报
回复
没什么说的!感谢大家的指导!
大家费心了!我截贴!
应该说对我来说有收获!
老吹老吹 2004-04-22
  • 打赏
  • 举报
回复
还在讨论啊??没必要了。我觉得可以放弃了。
半个小时生成10几个文件。才到0001z
自己想想,要生成到zzzzzzz需要多长的时间
recollectpainer 2004-04-22
  • 打赏
  • 举报
回复
老大,你这个字典估计用不了哟
试想你破解的时候挂一个这样的字典
先不说你是不是在网上破解个什么玩意儿
就拿本地来说吧
你每一位的可能字符有62个(这还是没包括 ~!@#$%^& ... 等)
两位就有 62^2
三位就是 62^3
四位就是 62^4
.
.
.
七位就是 62^7

你自己用计算器算一下这件文件是多大吧
就是打开字典文件也够呛,还谈什么黑别人哟
所以建议你还是去有关系统安全的网站找找相关资料
用这种方法去破解是行不通的
northwolves 2004-04-22
  • 打赏
  • 举报
回复
生成4个:

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
recollectpainer 2004-04-22
  • 打赏
  • 举报
回复
Option Explicit


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

' .
' .
' .
' .
' .
' . 下同了,一直到7位

End Sub
老吹老吹 2004-04-22
  • 打赏
  • 举报
回复
我晕。我一个文件1000多K,花了半个小时左右,都生成10几个文件了。还一半都没完成。
老吹老吹 2004-04-22
  • 打赏
  • 举报
回复
由于生成的文件太大,我还没生成完就看到有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
老吹老吹 2004-04-21
  • 打赏
  • 举报
回复
全数字的 从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
不好意思。我不是高手,只能想到这么蠢的办法。
要关电了。。今天晚上做个梦,也许明天会有更好的办法。
icehouse 2004-04-21
  • 打赏
  • 举报
回复
比如说生成一个TXT文件(再比如说就要3位密码),它的内容要是这样的:
000 001 002 003 ···009 00a 00b ···00z 00A 00B ·· 00Z
010 011 012 013 ···019 01a 01b ···01z 01A 01B ·· 01Z
··································
··································
··································
a00 a01 a02 a03 ···a09 a0a a0b ···a0z a0A a0B ·· a0Z
b10 b11 b12 b13 ···b19 b1a b1b ···b1z b1A b1B ·· b1Z
这里我遇到的困难是想得到一个生成数据的思路。
flc 2004-04-21
  • 打赏
  • 举报
回复
????不明白

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧