什么是暴力破解?
Key Bruteforcing
我需要找到一个密码密钥。密钥长度为10个字符,密钥中字母的顺序为3,7,2,1,4,5,6,10,8 ,9。我也知道密钥的md5。
所以我写了
mystring = "abcdefghijklmnopqrstuvwxyz"
for letter3 in mystring:
for letter7 in mystring[mystring.index(letter3):]:
for letter2 in mystring[:mystring.index(letter7)]:
for letter1 in mystring[:mystring.index(letter2)]:
for letter4 in mystring[mystring.index(letter1):]:
for letter5 in mystring[mystring.index(letter4):]:
for letter6 in mystring[mystring.index(letter4):]:
for letter10 in mystring[mystring.index(leter6):]:
for letter8 in mystring[:mystring.index(letter10)]:
for letter9 in mystring[mystring.index(letter8):]:
strr = "".join([letter1,letter2,letter3,letter4,letter5,letter6,letter7,letter8,letter9,letter10])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
字符顺序:
关键:
|letter1|letter2|letter3|letter4|letter5|letter6|letter7|letter8|letter9|letter10|
密钥按字母顺序排序:
|letter3|letter7|letter2|letter1|letter4|letter5|letter6|letter10|letter8|letter9|
问题是时间(在外部循环中进行一次迭代大约需要 6 个小时)。有什么建议可以优化 for 循环的范围吗?
如果你把它编译成机器码,你会发现for循环有四个部分。首先从内存中加载当前迭代整数,然后加载给定数组中的字母。然后执行 for 循环中的任何内容,最后递增索引,如果条件仍然成立,则执行条件跳转回到 for 循环的开头。
优化过程的唯一方法(虽然我不能声称 python;我已经尝试优化 C 的 for 循环)是摆脱增量部分并使用常量代替。即手动布局字母的迭代。也就是说,摆脱 for 循环并复制并粘贴数千行代码。这显然不是很理想并且不可重用,我们着手优化的 for 循环已经消失了。
我想我想说的是 for 循环已经非常优化,是汇编中非常基础的东西。毕竟你是在尝试暴力破解它。
解决方法在最下面
你非常接近。你要的是这个...
mystring = "abcdefghijklmnopqrstuvwxyz"
for letter1 in mystring:
for letter2 in mystring[mystring.index(letter1):]:
for letter3 in mystring[mystring.index(letter2):]:
for letter4 in mystring[mystring.index(letter3):]:
for letter5 in mystring[mystring.index(letter4):]:
for letter6 in mystring[mystring.index(letter5):]:
for letter7 in mystring[mystring.index(letter6):]:
for letter8 in mystring[mystring.index(leter7):]:
for letter9 in mystring[mystring.index(letter8):]:
for letter10 in mystring[mystring.index(letter9):]:
strr = "".join([letter3,letter7,letter2,letter1,letter4,letter5,letter6,letter10,letter8,letter9])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
该循环大大减少了迭代次数,因为您搜索的字符少了很多。每个循环搜索的字符少于其外部循环。请注意,每个循环都在同一方向搜索,它是如何更有条理的。
但它也非常慢因为mystring.index()
是一个很慢的操作。我们可以通过不使用 mystring.index()
...
来使其更快
mystring = "abcdefghijklmnopqrstuvwxyz"
for i1 in range(len(mystring)):
for i2 in range(i1, len(mystring)):
for i3 in range(i2, len(mystring)):
for i4 in range(i3, len(mystring)):
for i5 in range(i4, len(mystring)):
for i6 in range(i5, len(mystring)):
for i7 in range (i6, len(mystring)):
for i8 in range (i7, len(mystring)):
for i9 in range (i8, len(mystring)):
for i10 in range (i9, len(mystring)):
strr = "".join([mystring[i3], mystring[i7], mystring[i2], mystring[i1], mystring[i4], mystring[i5], mystring[i6], mystring[i10], mystring[i8], mystring[i9]])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
虽然这仍然非常慢,只是因为它的迭代次数很多。
这里的技巧是 itertools...
mystring = "abcdefghijklmnopqrstuvwxyz"
import itertools
for L1, L2, L3, L4, L5, L6, L7, L8, L9, L10 in itertools.combinations_with_replacement(mystring, 10):
strr = "".join([L3, L7, L2, L1, L4, L5, L6, L10, L8, L9])
if hashlib.md5(strr).hexdigest() == 'a50e38475041f76219748ee22c4377d4':
print ('key = {}'.format(strr))
break
itertools.combinations_with_replacement()
是您处理这些嵌套循环的方式,其中 A >= B >= C >= &ct in python 并且它非常快。这是最快的解决方案 afaik。
我需要找到一个密码密钥。密钥长度为10个字符,密钥中字母的顺序为3,7,2,1,4,5,6,10,8 ,9。我也知道密钥的md5。
所以我写了
mystring = "abcdefghijklmnopqrstuvwxyz"
for letter3 in mystring:
for letter7 in mystring[mystring.index(letter3):]:
for letter2 in mystring[:mystring.index(letter7)]:
for letter1 in mystring[:mystring.index(letter2)]:
for letter4 in mystring[mystring.index(letter1):]:
for letter5 in mystring[mystring.index(letter4):]:
for letter6 in mystring[mystring.index(letter4):]:
for letter10 in mystring[mystring.index(leter6):]:
for letter8 in mystring[:mystring.index(letter10)]:
for letter9 in mystring[mystring.index(letter8):]:
strr = "".join([letter1,letter2,letter3,letter4,letter5,letter6,letter7,letter8,letter9,letter10])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
字符顺序:
关键:
|letter1|letter2|letter3|letter4|letter5|letter6|letter7|letter8|letter9|letter10|
密钥按字母顺序排序:
|letter3|letter7|letter2|letter1|letter4|letter5|letter6|letter10|letter8|letter9|
问题是时间(在外部循环中进行一次迭代大约需要 6 个小时)。有什么建议可以优化 for 循环的范围吗?
如果你把它编译成机器码,你会发现for循环有四个部分。首先从内存中加载当前迭代整数,然后加载给定数组中的字母。然后执行 for 循环中的任何内容,最后递增索引,如果条件仍然成立,则执行条件跳转回到 for 循环的开头。
优化过程的唯一方法(虽然我不能声称 python;我已经尝试优化 C 的 for 循环)是摆脱增量部分并使用常量代替。即手动布局字母的迭代。也就是说,摆脱 for 循环并复制并粘贴数千行代码。这显然不是很理想并且不可重用,我们着手优化的 for 循环已经消失了。
我想我想说的是 for 循环已经非常优化,是汇编中非常基础的东西。毕竟你是在尝试暴力破解它。
解决方法在最下面
你非常接近。你要的是这个...
mystring = "abcdefghijklmnopqrstuvwxyz"
for letter1 in mystring:
for letter2 in mystring[mystring.index(letter1):]:
for letter3 in mystring[mystring.index(letter2):]:
for letter4 in mystring[mystring.index(letter3):]:
for letter5 in mystring[mystring.index(letter4):]:
for letter6 in mystring[mystring.index(letter5):]:
for letter7 in mystring[mystring.index(letter6):]:
for letter8 in mystring[mystring.index(leter7):]:
for letter9 in mystring[mystring.index(letter8):]:
for letter10 in mystring[mystring.index(letter9):]:
strr = "".join([letter3,letter7,letter2,letter1,letter4,letter5,letter6,letter10,letter8,letter9])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
该循环大大减少了迭代次数,因为您搜索的字符少了很多。每个循环搜索的字符少于其外部循环。请注意,每个循环都在同一方向搜索,它是如何更有条理的。
但它也非常慢因为mystring.index()
是一个很慢的操作。我们可以通过不使用 mystring.index()
...
mystring = "abcdefghijklmnopqrstuvwxyz"
for i1 in range(len(mystring)):
for i2 in range(i1, len(mystring)):
for i3 in range(i2, len(mystring)):
for i4 in range(i3, len(mystring)):
for i5 in range(i4, len(mystring)):
for i6 in range(i5, len(mystring)):
for i7 in range (i6, len(mystring)):
for i8 in range (i7, len(mystring)):
for i9 in range (i8, len(mystring)):
for i10 in range (i9, len(mystring)):
strr = "".join([mystring[i3], mystring[i7], mystring[i2], mystring[i1], mystring[i4], mystring[i5], mystring[i6], mystring[i10], mystring[i8], mystring[i9]])
if hashlib.md5(strr).hexdigest() == md5:
print "key = " ,strr
break
虽然这仍然非常慢,只是因为它的迭代次数很多。
这里的技巧是 itertools...
mystring = "abcdefghijklmnopqrstuvwxyz"
import itertools
for L1, L2, L3, L4, L5, L6, L7, L8, L9, L10 in itertools.combinations_with_replacement(mystring, 10):
strr = "".join([L3, L7, L2, L1, L4, L5, L6, L10, L8, L9])
if hashlib.md5(strr).hexdigest() == 'a50e38475041f76219748ee22c4377d4':
print ('key = {}'.format(strr))
break
itertools.combinations_with_replacement()
是您处理这些嵌套循环的方式,其中 A >= B >= C >= &ct in python 并且它非常快。这是最快的解决方案 afaik。