首页 > 其他分享 >自制密码穷举工具

自制密码穷举工具

时间:2024-11-24 17:30:46浏览次数:9  
标签:column 自制 密码 grid tk 穷举 root self row

事情是这样的,我的比特币钱包的密码忘记了,这个密码是可以无限尝试的,于是用python制作了一个简单的工具暴力破解,虽然还没有成功找回,但觉得挺好用,无偿分享给需要的朋友,仅供学习交流。已经打包好,直接下载打开就能使用。下面是源代码:

import itertools
import string
import pyautogui
import time
import tkinter as tk
from tkinter import messagebox
import random  # 引入random模块

class PasswordCrackerApp:
    def __init__(self, root):
        self.root = root
        self.root.title("密码穷举工具(MAKEY制作)")

        # 界面布局
        self.create_widgets()

    def create_widgets(self):
        tk.Label(self.root, text="密码长度范围:").grid(row=0, column=0, padx=10, pady=5, sticky="e")
        tk.Label(self.root, text="最小长度:").grid(row=1, column=0, padx=10, pady=5, sticky="e")
        self.entry_min_length = tk.Entry(self.root)
        self.entry_min_length.grid(row=1, column=1, padx=10, pady=5)
        self.entry_min_length.insert(0, "1")  # 默认最小长度为1

        tk.Label(self.root, text="最大长度:").grid(row=2, column=0, padx=10, pady=5, sticky="e")
        self.entry_max_length = tk.Entry(self.root)
        self.entry_max_length.grid(row=2, column=1, padx=10, pady=5)
        self.entry_max_length.insert(0, "8")  # 默认最大长度为8

        tk.Label(self.root, text="部分已知密码:").grid(row=3, column=0, padx=10, pady=5, sticky="e")
        self.entry_known = tk.Entry(self.root)
        self.entry_known.grid(row=3, column=1, padx=10, pady=5)

        tk.Label(self.root, text="部分已知密码位置:").grid(row=4, column=0, padx=10, pady=5, sticky="e")
        self.var_position = tk.StringVar(value="start")
        tk.Radiobutton(self.root, text="开头", variable=self.var_position, value="start").grid(row=4, column=1, sticky="w")
        tk.Radiobutton(self.root, text="中间", variable=self.var_position, value="middle").grid(row=5, column=1, sticky="w")
        tk.Radiobutton(self.root, text="末尾", variable=self.var_position, value="end").grid(row=6, column=1, sticky="w")

        tk.Label(self.root, text="包含字符类型:").grid(row=7, column=0, padx=10, pady=5, sticky="ne")
        self.var_lowercase = tk.BooleanVar(value=True)
        self.var_uppercase = tk.BooleanVar(value=True)
        self.var_digits = tk.BooleanVar(value=True)
        self.var_special = tk.BooleanVar(value=False)
        tk.Checkbutton(self.root, text="小写字母 (a-z)", variable=self.var_lowercase).grid(row=7, column=1, sticky="w")
        tk.Checkbutton(self.root, text="大写字母 (A-Z)", variable=self.var_uppercase).grid(row=8, column=1, sticky="w")
        tk.Checkbutton(self.root, text="数字 (0-9)", variable=self.var_digits).grid(row=9, column=1, sticky="w")
        tk.Checkbutton(self.root, text="特殊字符 (!@#$)", variable=self.var_special).grid(row=10, column=1, sticky="w")

        # 选择回车次数
        tk.Label(self.root, text="密码输入后按键:").grid(row=11, column=0, padx=10, pady=5, sticky="e")
        self.var_enter_count = tk.IntVar(value=2)  # 默认两次回车
        tk.Radiobutton(self.root, text="一次回车", variable=self.var_enter_count, value=1).grid(row=11, column=1, sticky="w")
        tk.Radiobutton(self.root, text="两次回车", variable=self.var_enter_count, value=2).grid(row=12, column=1, sticky="w")

        # 设置输入间隔(秒)
        tk.Label(self.root, text="输入间隔(秒):").grid(row=13, column=0, padx=10, pady=5, sticky="e")
        self.entry_delay = tk.Entry(self.root)
        self.entry_delay.grid(row=13, column=1, padx=10, pady=5)
        self.entry_delay.insert(0, "0.1")  # 默认输入间隔为0.1秒

        # 开始按钮
        self.start_button = tk.Button(self.root, text="开始穷举", command=self.start_bruteforce)
        self.start_button.grid(row=14, column=0, columnspan=2, pady=10)

    def start_bruteforce(self):
        try:
            # 获取最小和最大密码长度
            min_length = int(self.entry_min_length.get())
            max_length = int(self.entry_max_length.get())
            if min_length <= 0 or max_length <= 0 or min_length > max_length:
                raise ValueError
        except ValueError:
            messagebox.showerror("错误", "请输入有效的密码长度范围!")
            return

        # 获取字符选择
        include_lowercase = self.var_lowercase.get()
        include_uppercase = self.var_uppercase.get()
        include_digits = self.var_digits.get()
        include_special = self.var_special.get()
        known_part = self.entry_known.get()
        known_position = self.var_position.get()

        # 构建字符集合
        characters = ""
        if include_lowercase:
            characters += string.ascii_lowercase
        if include_uppercase:
            characters += string.ascii_uppercase
        if include_digits:
            characters += string.digits
        if include_special:
            characters += string.punctuation

        if not characters:
            messagebox.showerror("错误", "请至少选择一种字符类型!")
            return

        # 验证部分已知密码长度是否合法
        if len(known_part) > max_length:
            messagebox.showerror("错误", "部分已知密码长度不能大于总密码长度!")
            return

        # 获取用户选择的回车次数
        enter_count = self.var_enter_count.get()

        # 获取输入间隔(延迟时间)
        try:
            delay = float(self.entry_delay.get())
            if delay < 0.01 or delay > 100:
                raise ValueError
        except ValueError:
            messagebox.showerror("错误", "请输入有效的输入间隔(0.01秒到100秒之间)!")
            return

        # 准备开始穷举
        messagebox.showinfo("提示", "请切换到目标对话框,程序将在 5 秒后开始!")
        time.sleep(5)  # 给用户时间切换到目标窗口

        try:
            for length in range(min_length, max_length + 1):
                unknown_length = length - len(known_part)
                for attempt in itertools.product(characters, repeat=unknown_length):
                    unknown_part = ''.join(attempt)

                    # 拼接完整密码
                    if known_position == "start":
                        password = known_part + unknown_part
                    elif known_position == "end":
                        password = unknown_part + known_part
                    elif known_position == "middle":
                        mid_index = (length - len(known_part)) // 2
                        password = unknown_part[:mid_index] + known_part + unknown_part[mid_index:]

                    # 模拟输入和按键
                    pyautogui.typewrite(password, interval=0.01)  # 减少输入间隔,加速
                    pyautogui.press('enter')
                    if enter_count == 2:
                        pyautogui.press('enter')  # 如果需要两次回车,按第二次回车
                    print(f"尝试密码: {password}")

                    # 输入后等待指定的延迟时间
                    time.sleep(delay)  # 调整速度,根据用户设置的输入间隔

        except KeyboardInterrupt:
            messagebox.showinfo("提示", "操作被用户中断。")
            return

        messagebox.showinfo("完成", "穷举已完成,未找到正确密码。")


# 创建 GUI 界面
root = tk.Tk()
app = PasswordCrackerApp(root)

# 启动 GUI 主循环
root.mainloop()

标签:column,自制,密码,grid,tk,穷举,root,self,row
From: https://blog.csdn.net/u011701632/article/details/144009995

相关文章

  • 鸿蒙NEXT开发案例:随机密码生成
    【引言】本案例将实现一个随机密码生成器。用户可以自定义密码的长度以及包含的字符类型(大写字母、小写字母、数字、特殊字符),最后通过点击按钮生成密码,并提供一键复制功能。【环境准备】•操作系统:Windows10•开发工具:DevEcoStudioNEXTBeta1BuildVersion:5.0.3.806......
  • dedeCMS 后台账号或密码忘记了怎么办
    问题:后台管理员账号或密码忘记。解决办法:数据库修改:打开数据库中的 dede_admin 表,找到管理员记录,将 pwd 字段的值改成 f297a57a5a743894a0e4,密码将被重置为 admin。重置工具:下载织梦后台管理员密码重置工具,将 resetpwd.php 放在网站根目录。在浏览器上打开 h......
  • 密码学入门总结&古典密码&现代密码学&RSA入门原理
    密码学入门总结&古典密码&现代密码学&RSA入门原理文章目录密码学入门总结&古典密码&现代密码学&RSA入门原理前言一、古典密码1.单表替换密码1.1凯撒密码1.2Atbash密码1.3摩斯密码1.4仿射密码2.多表替换密码2.1维吉尼亚密码2.2自动密钥密码3.其他类型密码3.1栅栏密......
  • 六步取消win11开机密码
    0.前言新买的电脑打开后首先要进行一系列的操作激活操作系统。在这些操作中最令人讨厌的是设置开机密码(pin)。也许有很多人的电脑需要保密,限制别人登录,这时使用登录pin是很有必要的。而还有很多人跟我的情况差不多,台式电脑在家里使用,没有什么保密的内容。设置了开机密码,每次开机......
  • Nginx配置auth_basic认证,让用户访问指定页面时输入用户名密码认证
    配置方法:[root@localhost~]#yum-yinstallhttpd-toolsLoadedplugins:fastestmirrorLoadingmirrorspeedsfromcachedhostfileResolvingDependencies-->Runningtransactioncheck--->Packagehttpd-tools.x86_640:2.4.6-99.el7.centos.1willbeinstall......
  • JZOJ【基础】素数密码学//注意:后面有彩蛋
    VIP以下是一个C++程序,该程序接受一个合数n作为输入,并尝试将其分解为两个素数的乘积。如果成功找到这样的分解,它将输出所有可能的分解方式;如果找不到,它将输出"error"。#include<bits/stdc++.h>usingnamespacestd;boolisPrime(intnum){if(num<=1){ returnfa......
  • 怎么给docker的redis设置密码
    怎么给docker的redis设置密码设置密码方式1:启动容器时设置dockerrun-itd--nameredis-v1-p6379:6379redis--requirepass123456说明:--name(启动容器的名称)-p宿主机映射端口:容器里的redis启动端口--requirepass启动密码设置密码方式2:修改配置文件1.......
  • 批量自动分发Linux密码
    2.批量自动分发密钥(完整版)#本shell脚本是基于DSA加密方式进行加密的,测试的环境为centOS7.5,若要使用别的加密方式,请修改源代码,此脚本可以自动发现IP地址,并分发分发,同一网段的IP地址,目前还不可以分发多网段的IP地址。#可以实现SSH密钥基于DSA方式密钥的分发及创建新密钥并进行分......
  • 基于Multisim的密码锁的控制电路设计与仿真
    设计一个密码锁的控制电路,当输入正确代码时,输出开锁信号以推动执行机构工作,用红灯亮、绿灯熄灭表示关锁,用绿灯亮、红灯熄灭表示开锁;在锁的控制电路中储存一个可以修改的4位代码,当开锁按钮开关(可设置成6位至8位,其中实际有效为4位,其余为虚设)的输入代码等于储存代码时,开锁从第一......
  • 数据库修改网站密码?网站管理后台修改?
    数据库修改网站密码备份数据库:在直接操作数据库之前,确保先备份数据库,以防出现意外情况。访问数据库:通过数据库管理工具(如phpMyAdmin)或命令行工具(如MySQL命令行客户端)连接到数据库。定位用户表:找到存储用户信息的表,通常命名为 users 或类似的名称。查找用户记录:根据用户名或......