You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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/3i可替换为i/1/!,还有大小写的替换(比如M可以是Mm)。做一个字典,键是原字符,值是它所有可能的替换选项:

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万亿种组合,这根本不可能全部生成和存储。所以建议:

  • 先缩小范围:比如只记得某些字符有替换,其他字符固定,这样能大幅减少组合数
  • 不要一次性生成所有组合:可以边生成边写入文件,或者如果是要解锁某个东西,生成一个试一个(注意别触发账号锁定机制)

初学者上手小技巧

  1. 先拿短字符串练手:比如把原密码改成MyE,替换映射只做MyE的选项,看看生成的结果是否符合预期
  2. 理解itertools.product的作用:它接收多个可迭代对象,返回所有可能的元素组合,比如product([1,2], ['a','b'])会返回(1,a), (1,b), (2,a), (2,b)
  3. 调试时打印char_options:检查每个字符的替换列表是否正确,避免拼写错误

内容的提问来源于stack exchange,提问作者CurtisOnTheRoad

火山引擎 最新活动