如何用Python生成非随机字典密码及自定义字符变体密码?
嘿,很高兴你拿这个当第一个Python学习案例,这俩问题其实挺适合练手的,咱们一个个来聊:
1. 如何用Python生成非随机字典密码?
非随机的字典密码,核心是基于预定义的单词库(比如常见英文单词列表),按照固定规则生成,完全避开纯随机的不确定性。比如你可以指定“单词+数字+特殊字符”的固定模式,或者按顺序遍历单词组合,生成确定性的密码列表。
举个简单的可运行例子:
# 自定义单词库(你可以根据需求扩展这个列表) word_list = ["apple", "banana", "cherry", "date"] numbers = ["1", "2", "3"] special_chars = ["!", "@", "#"] # 按固定规则生成所有非随机组合:单词1 + 特殊字符 + 单词2 + 数字 for word1 in word_list: for char in special_chars: for word2 in word_list: for num in numbers: password = f"{word1}{char}{word2}{num}" print(password) # 也可以写入文件保存,避免控制台输出过多 # with open("passwords.txt", "a") as f: # f.write(password + "\n")
这个脚本会严格按顺序生成所有符合规则的密码,完全是非随机的,每个组合都能被遍历到。
2. 生成密码的所有字符替换组合
首先告诉你个好消息:不需要装任何第三方库,Python内置的itertools模块就能完美解决这个问题!作为初学者,咱们一步步拆解操作:
步骤1:定义字符替换映射
先把每个可能有替换的字符列出来,比如你提到的E可替换为E/e/3,i可替换为i/1/!,还有大小写的替换(比如M可以是M或m)。做一个字典,键是原字符,值是它所有可能的替换选项:
replace_map = { 'M': ['M', 'm'], 'y': ['Y', 'y'], 'E': ['E', 'e', '3'], 'x': ['X', 'x'], '-': ['-'], # 不需要替换的字符,就只放自己 'G': ['G', 'g'], 'i': ['i', '1', '!'], 'r': ['R', 'r'], 'l': ['L', 'l'], 'F': ['F', 'f'], 'n': ['N', 'n'], 'd': ['D', 'd'], 'I': ['I', 'i', '1', '!'], 's': ['S', 's'], 'A': ['A', 'a'], 'u': ['U', 'u'], 't': ['T', 't'] }
注意:要确保原密码MyEx-GirlFriendIsAnInsult里的每个字符都在这个映射里,别遗漏。
步骤2:把原字符串转换成替换选项列表
遍历原密码的每个字符,从映射里取出对应的替换列表:
original_password = "MyEx-GirlFriendIsAnInsult" char_options = [replace_map[char] for char in original_password]
步骤3:用itertools.product生成所有组合
itertools.product会帮你计算所有替换选项的笛卡尔积(也就是所有可能的字符组合):
import itertools # 生成所有可能的密码组合 for combo in itertools.product(*char_options): # 把组合里的字符拼接成完整密码 candidate_password = ''.join(combo) print(candidate_password) # 建议写入文件保存,避免控制台输出溢出 # with open("candidate_passwords.txt", "a") as f: # f.write(candidate_password + "\n")
重要提醒!
这里有个新手容易踩的坑:如果替换选项太多,组合数会爆炸式增长!比如假设每个字符平均有2.5种替换,20个字符的话就是2.5^20 ≈ 95万亿种组合,这根本不可能全部生成和存储。所以建议:
- 先缩小范围:比如只记得某些字符有替换,其他字符固定,这样能大幅减少组合数
- 不要一次性生成所有组合:可以边生成边写入文件,或者如果是要解锁某个东西,生成一个试一个(注意别触发账号锁定机制)
初学者上手小技巧
- 先拿短字符串练手:比如把原密码改成
MyE,替换映射只做M、y、E的选项,看看生成的结果是否符合预期 - 理解
itertools.product的作用:它接收多个可迭代对象,返回所有可能的元素组合,比如product([1,2], ['a','b'])会返回(1,a), (1,b), (2,a), (2,b) - 调试时打印
char_options:检查每个字符的替换列表是否正确,避免拼写错误
内容的提问来源于stack exchange,提问作者CurtisOnTheRoad




