2021.09.06 23:07:15
你知道52的7次方有多大吗?我算过,如果存储这么多个7位密码,大概需要13TiB的存储空间。
这就是我写了两个版本字典生成方法的原因:如果真的要全部生成完再去跑字典,那几乎是不可能的事。
这是一个相当简单粗暴的算法。
def gen_with_for(length, letters, result = ''):
= int(length)
length = str(letters)
letters if length == 1:
= []
ls for i in letters:
+i)
ls.append(resultreturn ls
else:
= []
ls for i in letters:
+= gen_with_for(length-1,letters,result+i)
ls return ls
这个算法优点就是简单。只需要知道密码长度,密码包含的所有字符就可以穷举出所有组合。
不过缺点也很明显。随着循环层数的增加,最内层循环次数指数级增加。如果密码稍长一点,电脑内存可能就炸了。
穷举密码的本质,其实也就是将对应的十进制数转换成用一些符号表达的p进制数。
def gen_with_convert(number, letters):
= len(letters)
length = ''
result while number:
= divmod(number-1, length)
number, rest = letters[rest] + result
result return result
相比前一个算法,这个算法虽然慢一些,但是内存占用不会像前一个那么嚣张(
不过,我要生成所有7位含52个符号的密码,需要从第几个密码开始生成呢?
我也不知道。所以,我又写了这个函数。
def loop_time_calc(length, l_length):
if length == 0:
return 1
return pow(l_length, length) + loop_time_calc(length -1, l_length)
这样,就大大简化了调用过程。同时因为密码是逐个返回的,所以完全可以把它和破解指令丢在同一个for里,破解和生成同步进行,可以减少破解耗时。
完整版是这样:
#!/usr/bin/python
import optparse
def gen(number, letters):
= len(letters)
length = ''
result while number:
= divmod(number-1, length)
number, rest = letters[rest] + result
result return result
def loop_time_calc(length, l_length):
if length == 0:
return 1
return pow(l_length, length) + loop_time_calc(length -1, l_length)
def main():
= optparse.OptionParser("Param: -l <Length> -c <Characters>")
parse "-l", dest="length", help="get password length")
parse.add_option("-c", dest="characters", help="get characters in password")
parse.add_option(= parse.parse_args()
(options, args) if (options.length == None) | (options.characters == None):
print(parse.usage)
else:
= options.length
length = options.characters
characters = loop_time_calc(int(length)-1,len(characters)), loop_time_calc(int(length),len(characters))
_s, _e for i in range(_s, _e):
print(gen(i, characters))
main()
调用格式:
root@xeonds:~# ./pass_gen.py -l 4 -c 0123456789 > pass.txt
上面的指令生成所有四位纯数字密码。
所以说纯数字密码不安全嘛.jpg(
用[[Python|Python]]做这种东西很方便。不过在解密压缩包上,已经有很好用的HashCat了。
就算法方面来说,说到底,还是要数学好嘛(摊)。进制转换好像小学奥数就有讲?无所谓,反正我已经忘了(逃