我刚刚开始学习python,我正在尝试创建一个小型暴力程序,它会要求用户输入(密码),然后强制它检查它是否匹配。 我的问题:我被困在循环的计算中(正如你在源代码中看到的那样)
感谢您的帮助。
源代码:
L1=['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']
L2=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
L3=['0','1','2','3','4','5','6','7','8','9']
L4=L1+L2+L3
user=input("Enter your secret password here (maximum 4 characters): ")
sum=""
for i in range(0,len(L4)):
sum=L4[i]+L4[i+1]
print(sum)
if sum==user:
print("your cracked password is :", sum)
break;
答案 0 :(得分:4)
您可以在此处使用itertools.product
:
>>> from string import letters, digits
>>> strs = letters + digits
>>> from itertools import product
def pwd_checker(pwd):
if 0 <len(pwd) <5:
for i in xrange(1,5):
for per in product(strs, repeat = i):
if "".join(per) == pwd:
print 'your password is', "".join(per)
return
else:
print "Password's length must be between 1 to 4"
...
>>> pwd_checker('a')
your password is a
>>> pwd_checker('ab12')
your password is ab12
>>> pwd_checker('foo')
your password is foo
>>> pwd_checker('Ab1c')
your password is Ab1c
>>> pwd_checker('aaaa')
your password is aaaa
>>> pwd_checker('BaBa')
your password is BaBa
答案 1 :(得分:3)
这是所有可能密码的列表:
list(itertools.chain(
*[map(lambda x: ''.join(x), itertools.product(L4, repeat=i)) for i in range(5)])
)
您可以循环播放或使用find
(并抓住ValueError
)
答案 2 :(得分:2)
假设密码只能包含L4 = L1 + L2 + L3的元素,并假设它具有固定长度l。
此密码与重复L4中的l个元素组合。
然后,你的暴力算法应该通过重复L4中的1,2,3和4个元素来生成每个组合。您可以使用itertools
轻松完成此操作import itertools
for l in xrange(4):
for try_ in itertools.product(L4, repeat=l + 1):
if ''.join(try_) == user:
print("your cracked password is :", try_)
return
自己实现combination_with_replacement函数会很有趣,可以使用递归函数或堆栈轻松完成:)
答案 3 :(得分:0)
我会选择itertools解决方案来生成现成代码。
但是如果你想学习并编写自己的实现代码:
在一个简单的谷歌搜索后,here是一个排列算法,你可以查找并尝试用字符串而不是数字在python中重新实现。