最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python+PyQt5開發(fā)智能密碼字典生成器(附完整源碼)

 更新時(shí)間:2026年03月12日 09:44:38   作者:創(chuàng)客白澤  
這篇文章主要為大家詳細(xì)介紹了如何基于Python+PyQt5開發(fā)智能密碼字典生成器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

概述

在網(wǎng)絡(luò)安全領(lǐng)域,密碼破解是滲透測(cè)試的重要環(huán)節(jié)。據(jù)統(tǒng)計(jì),85%的成功入侵都源于弱密碼或基于個(gè)人信息設(shè)置的密碼。本文將詳細(xì)介紹一款基于PyQt5開發(fā)的社會(huì)工程學(xué)密碼字典生成器,它能夠根據(jù)目標(biāo)個(gè)人信息智能生成高命中率的密碼組合。

核心價(jià)值:通過分析姓名、生日、手機(jī)號(hào)等20+個(gè)人信息維度,結(jié)合300+常見弱密碼模式,實(shí)現(xiàn)精準(zhǔn)密碼預(yù)測(cè)。

功能特性

多維度信息采集

  • 基礎(chǔ)身份信息(中英文姓名、生日、身份證)
  • 聯(lián)系方式(手機(jī)、QQ、微信、郵箱)
  • 網(wǎng)絡(luò)身份(域名、常用ID)
  • 社交關(guān)系(伴侶信息)

智能組合引擎

# 示例:姓名與弱密碼組合算法
def name_and_weak(self, name, name_ab):
    self.password_list.append(name)
    for weak in weak_password:
        self.password_list.append(name + weak)
        for i in name_ab:
            if i:  # 確保簡(jiǎn)稱不為空
                self.password_list.append(i + weak)

輸出控制

  • 實(shí)時(shí)計(jì)數(shù)顯示
  • 結(jié)果預(yù)覽與文件導(dǎo)出
  • 生成選項(xiàng)自定義

界面展示

交互設(shè)計(jì)亮點(diǎn)

  • 分組式信息錄入
  • 狀態(tài)感知的按鈕配色
  • 響應(yīng)式布局(支持窗口縮放)

開發(fā)詳解

技術(shù)架構(gòu)

核心算法解析

中文姓名處理

def get_pinyin_variations(self, chinese_name):
    pinyin_list = pypinyin.lazy_pinyin(chinese_name)  # 不帶聲調(diào)
    pinyin_tone_list = [item[0] for item in pypinyin.pinyin(chinese_name)]
    initials = [item[0] for item in pypinyin.lazy_pinyin(chinese_name)]
    
    variants = {
        ''.join(pinyin_list),        # zhangsan
        '.'.join(pinyin_list),      # zhang.san
        ''.join(pinyin_tone_list),   # zhāngsān
        ''.join(initials)            # zs
    }
    return list(variants)

密碼組合策略

組合類型算法復(fù)雜度示例輸出
姓名+生日O(n*m)zhangsan1990
手機(jī)尾號(hào)+弱密碼O(n)5678qwerty
域名縮寫+常見數(shù)字O(n^2)baidu123

關(guān)鍵代碼解讀

生日處理模塊

def birthday_and_weak(self, birthday_list):
    for birth in birthday_list:
        # 基礎(chǔ)變形
        variants = {
            birth,                  # 19990101
            birth[2:],              # 990101
            birth[4:]+birth[:4],    # 01011999
            birth[:4]+'love'+birth[4:]  # 1999love0101
        }
        self.password_list.extend(variants)

異常處理機(jī)制

try:
    if len(IDC) != 18:
        raise ValueError("身份證長(zhǎng)度錯(cuò)誤")
except Exception as e:
    QMessageBox.critical(self, '錯(cuò)誤', f'驗(yàn)證失敗: {str(e)}')

源碼下載

import sys
import pypinyin
from PyQt5.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, 
                            QLabel, QLineEdit, QPushButton, QTextEdit, QGroupBox, 
                            QCheckBox, QFileDialog, QMessageBox, QSplitter)
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QFont, QIcon

# 默認(rèn)弱密碼和數(shù)字組合
number_value_1 = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]
number_value_2 = ["00", "01", "02", "03", "04", "05", "06", "07",
                  "10", "11", "12", "13", "20", "22", "30", "33",
                  "08", "09", "40", "44", "50", "55", "60",
                  "66", "70", "77", "80", "88", "90", "99"]
number_value_3 = ["000", "001", "101", "110", "111", "121", "123",
                  "212", "222", "250", "333", "444", "520", "555",
                  "666", "777", "888", "999"]
number_value_4 = ["000000", "111111", "110120", "123321",
                  "123456", "123123",
                  "222222", "333333", "666666", "654321",
                  "888888", "999999", "1234", "1314",
                  "5201314", "1212", "1111", "0000",
                  "123456789", "123123123", "666666666",
                  "888888888", "999999999", "000000000"]

weak_password = ["a", "qwerty", "qwert", "ab", "abc", "qazwsx",
                 "1q2w3e4r", "abcd", "qwer", "qwe",
                 "aa", "woaini", "asdf", "iloveyou",
                 "zxc", "password", "admin", "welcome"]

class PasswordGeneratorApp(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowIcon(QIcon('key.ico'))
        
    def initUI(self):
        self.setWindowTitle('社會(huì)工程學(xué)密碼字典生成器')
        self.setGeometry(300, 300, 887, 707)  # 增加窗口高度
        
        # 主窗口部件
        main_widget = QWidget()
        self.setCentralWidget(main_widget)
        
        # 主布局
        main_layout = QVBoxLayout()
        main_widget.setLayout(main_layout)
        
        # 標(biāo)題
        title_label = QLabel('??社會(huì)工程學(xué)密碼字典生成器 ')
        title_label.setFont(QFont('Arial', 18, QFont.Bold))
        title_label.setAlignment(Qt.AlignCenter)
        title_label.setStyleSheet("color: #2c3e50; margin-bottom: 20px;")
        main_layout.addWidget(title_label)
        
        # 創(chuàng)建輸入?yún)^(qū)域的分割器
        input_splitter = QSplitter(Qt.Horizontal)
        
        # 左側(cè)信息欄
        left_info = QWidget()
        left_layout = QVBoxLayout()
        left_info.setLayout(left_layout)
        
        # 基本信息組
        basic_group = QGroupBox('?? 基本信息')
        basic_layout = QVBoxLayout()
        
        # 姓名輸入
        name_layout = QHBoxLayout()
        name_label = QLabel('姓 名:')
        self.name_edit = QLineEdit()
        self.name_edit.setPlaceholderText('例如: 張三 或 zhang.san 或 san.zhang')
        name_layout.addWidget(name_label)
        name_layout.addWidget(self.name_edit)
        basic_layout.addLayout(name_layout)
        
        # 英文名輸入
        en_name_layout = QHBoxLayout()
        en_name_label = QLabel('英文名:')
        self.en_name_edit = QLineEdit()
        self.en_name_edit.setPlaceholderText('例如: John 或 John.Smith')
        en_name_layout.addWidget(en_name_label)
        en_name_layout.addWidget(self.en_name_edit)
        basic_layout.addLayout(en_name_layout)
        
        # 生日輸入
        birthday_layout = QHBoxLayout()
        birthday_label = QLabel('生 日:')
        self.birthday_edit = QLineEdit()
        self.birthday_edit.setPlaceholderText('例如: 19990101')
        birthday_layout.addWidget(birthday_label)
        birthday_layout.addWidget(self.birthday_edit)
        basic_layout.addLayout(birthday_layout)
        
        # 身份證輸入
        idc_layout = QHBoxLayout()
        idc_label = QLabel('身份證號(hào):')
        self.idc_edit = QLineEdit()
        self.idc_edit.setPlaceholderText('18位身份證號(hào)碼')
        idc_layout.addWidget(idc_label)
        idc_layout.addWidget(self.idc_edit)
        basic_layout.addLayout(idc_layout)
        
        basic_group.setLayout(basic_layout)
        left_layout.addWidget(basic_group)
        
        # 聯(lián)系方式組
        contact_group = QGroupBox('?? 聯(lián)系方式')
        contact_layout = QVBoxLayout()
        
        # 手機(jī)號(hào)輸入
        phone_layout = QHBoxLayout()
        phone_label = QLabel('手機(jī)號(hào):')
        self.phone_edit = QLineEdit()
        self.phone_edit.setPlaceholderText('例如: 13933893931')
        phone_layout.addWidget(phone_label)
        phone_layout.addWidget(self.phone_edit)
        contact_layout.addLayout(phone_layout)
        
        # QQ號(hào)輸入
        qq_layout = QHBoxLayout()
        qq_label = QLabel('QQ號(hào):')
        self.qq_edit = QLineEdit()
        self.qq_edit.setPlaceholderText('例如: 12312345')
        qq_layout.addWidget(qq_label)
        qq_layout.addWidget(self.qq_edit)
        contact_layout.addLayout(qq_layout)
        
        contact_group.setLayout(contact_layout)
        left_layout.addWidget(contact_group)
        
        # 右側(cè)信息欄
        right_info = QWidget()
        right_layout = QVBoxLayout()
        right_info.setLayout(right_layout)
        
        # 微信號(hào)輸入
        wechat_group = QGroupBox('?? 微信信息')
        wechat_layout = QVBoxLayout()
        
        wechat_input_layout = QHBoxLayout()
        wechat_label = QLabel('微信號(hào):')
        self.wechat_edit = QLineEdit()
        self.wechat_edit.setPlaceholderText('例如: john123')
        wechat_input_layout.addWidget(wechat_label)
        wechat_input_layout.addWidget(self.wechat_edit)
        wechat_layout.addLayout(wechat_input_layout)
        
        # 郵箱輸入
        mail_layout = QHBoxLayout()
        mail_label = QLabel('郵 箱:')
        self.mail_edit = QLineEdit()
        self.mail_edit.setPlaceholderText('例如: xxxx@xx.com')
        mail_layout.addWidget(mail_label)
        mail_layout.addWidget(self.mail_edit)
        wechat_layout.addLayout(mail_layout)
        
        wechat_group.setLayout(wechat_layout)
        right_layout.addWidget(wechat_group)
        
        # 其他信息組
        other_group = QGroupBox('?? 其他信息')
        other_layout = QVBoxLayout()
        
        # 域名輸入
        domain_layout = QHBoxLayout()
        domain_label = QLabel('域 名:')
        self.domain_edit = QLineEdit()
        self.domain_edit.setPlaceholderText('例如: www.baidu.com')
        domain_layout.addWidget(domain_label)
        domain_layout.addWidget(self.domain_edit)
        other_layout.addLayout(domain_layout)
        
        # 常用ID輸入
        id_layout = QHBoxLayout()
        id_label = QLabel('常用ID:')
        self.id_edit = QLineEdit()
        self.id_edit.setPlaceholderText('例如: look')
        id_layout.addWidget(id_label)
        id_layout.addWidget(self.id_edit)
        other_layout.addLayout(id_layout)
        
        other_group.setLayout(other_layout)
        right_layout.addWidget(other_group)
        
        # 伴侶信息組
        partner_group = QGroupBox('?? 伴侶信息')
        partner_layout = QVBoxLayout()
        
        # 伴侶姓名
        partner_name_layout = QHBoxLayout()
        partner_name_label = QLabel('伴侶姓名:')
        self.partner_name_edit = QLineEdit()
        self.partner_name_edit.setPlaceholderText('例如: 李四 或 li.si')
        partner_name_layout.addWidget(partner_name_label)
        partner_name_layout.addWidget(self.partner_name_edit)
        partner_layout.addLayout(partner_name_layout)
        
        # 伴侶生日
        partner_birth_layout = QHBoxLayout()
        partner_birth_label = QLabel('伴侶生日:')
        self.partner_birth_edit = QLineEdit()
        self.partner_birth_edit.setPlaceholderText('例如: 19950214')
        partner_birth_layout.addWidget(partner_birth_label)
        partner_birth_layout.addWidget(self.partner_birth_edit)
        partner_layout.addLayout(partner_birth_layout)
        
        partner_group.setLayout(partner_layout)
        right_layout.addWidget(partner_group)
        
        # 將左右信息欄添加到分割器
        input_splitter.addWidget(left_info)
        input_splitter.addWidget(right_info)
        input_splitter.setStretchFactor(0, 1)
        input_splitter.setStretchFactor(1, 1)
        
        main_layout.addWidget(input_splitter)
        
        # 選項(xiàng)區(qū)域
        options_group = QGroupBox('?? 生成選項(xiàng)')
        options_layout = QVBoxLayout()
        
        # 姓名相關(guān)選項(xiàng)
        name_options = QHBoxLayout()
        self.name_weak_check = QCheckBox('姓名+弱密碼組合')
        self.name_weak_check.setChecked(True)
        self.name_birth_check = QCheckBox('姓名+生日組合')
        self.name_birth_check.setChecked(True)
        self.name_domain_check = QCheckBox('姓名+域名組合')
        self.name_domain_check.setChecked(True)
        self.name_id_check = QCheckBox('姓名+ID組合')
        self.name_id_check.setChecked(True)
        name_options.addWidget(self.name_weak_check)
        name_options.addWidget(self.name_birth_check)
        name_options.addWidget(self.name_domain_check)
        name_options.addWidget(self.name_id_check)
        options_layout.addLayout(name_options)
        
        # 伴侶相關(guān)選項(xiàng)
        partner_options = QHBoxLayout()
        self.partner_name_check = QCheckBox('伴侶姓名組合')
        self.partner_name_check.setChecked(True)
        self.partner_birth_check = QCheckBox('伴侶生日組合')
        self.partner_birth_check.setChecked(True)
        partner_options.addWidget(self.partner_name_check)
        partner_options.addWidget(self.partner_birth_check)
        options_layout.addLayout(partner_options)
        
        # 其他選項(xiàng)
        other_options = QHBoxLayout()
        self.wechat_check = QCheckBox('微信號(hào)組合')
        self.wechat_check.setChecked(True)
        self.english_name_check = QCheckBox('英文名組合')
        self.english_name_check.setChecked(True)
        other_options.addWidget(self.wechat_check)
        other_options.addWidget(self.english_name_check)
        options_layout.addLayout(other_options)
        
        options_group.setLayout(options_layout)
        main_layout.addWidget(options_group)
        
        # 按鈕區(qū)域
        button_layout = QHBoxLayout()
        
        self.generate_btn = QPushButton('?? 生成密碼字典')
        self.generate_btn.setStyleSheet("background-color: #3498db; color: white; font-weight: bold;")
        self.generate_btn.clicked.connect(self.generate_passwords)
        
        self.save_btn = QPushButton('?? 保存到文件')
        self.save_btn.setStyleSheet("background-color: #2ecc71; color: white; font-weight: bold;")
        self.save_btn.clicked.connect(self.save_to_file)
        
        self.clear_btn = QPushButton('?? 清除所有')
        self.clear_btn.setStyleSheet("background-color: #e74c3c; color: white; font-weight: bold;")
        self.clear_btn.clicked.connect(self.clear_all)
        
        button_layout.addWidget(self.generate_btn)
        button_layout.addWidget(self.save_btn)
        button_layout.addWidget(self.clear_btn)
        main_layout.addLayout(button_layout)
        
        # 輸出區(qū)域 - 現(xiàn)在放在底部
        output_group = QGroupBox('?? 生成的密碼字典 (共生成 0 條)')
        self.output_group = output_group  # 保存引用以便更新計(jì)數(shù)
        output_layout = QVBoxLayout()
        
        self.output_edit = QTextEdit()
        self.output_edit.setReadOnly(True)
        self.output_edit.setStyleSheet("background-color: #f8f9fa;")
        
        output_layout.addWidget(self.output_edit)
        output_group.setLayout(output_layout)
        main_layout.addWidget(output_group)
        
        # 設(shè)置布局比例
        main_layout.setStretch(0, 1)  # 標(biāo)題
        main_layout.setStretch(1, 5)  # 輸入?yún)^(qū)域
        main_layout.setStretch(2, 1)  # 選項(xiàng)區(qū)域
        main_layout.setStretch(3, 1)  # 按鈕區(qū)域
        main_layout.setStretch(4, 3)  # 輸出區(qū)域
        
        # 狀態(tài)欄
        self.statusBar().showMessage('準(zhǔn)備就緒')
    
    # 以下是原有的所有方法,保持不變
    def generate_passwords(self):
        """生成密碼字典"""
        try:
            # 獲取輸入值
            name = self.name_edit.text().strip()
            en_name = self.en_name_edit.text().strip()
            birthday = self.birthday_edit.text().strip()
            IDC = self.idc_edit.text().strip()
            phone_number = self.phone_edit.text().strip()
            qq_number = self.qq_edit.text().strip()
            wechat = self.wechat_edit.text().strip()
            mail = self.mail_edit.text().strip()
            domain = self.domain_edit.text().strip()
            id_value = self.id_edit.text().strip()
            partner_name = self.partner_name_edit.text().strip()
            partner_birth = self.partner_birth_edit.text().strip()
            
            # 初始化結(jié)果列表
            self.password_list = []
            
            # 處理姓名
            name_ab = []
            name_pinyin = []
            if name:
                # 判斷是中文還是拼音
                if any('\u4e00' <= char <= '\u9fff' for char in name):
                    # 中文姓名,轉(zhuǎn)換為拼音
                    name_pinyin = self.get_pinyin_variations(name)
                    name_list = name_pinyin
                else:
                    # 拼音姓名,直接處理
                    name_list = name.split('.')
                
                if not all(name_list):  # 檢查是否有空的名字部分
                    QMessageBox.warning(self, '警告', '姓名格式不正確,請(qǐng)使用點(diǎn)(.)分隔且不要有空的部分')
                    return
                
                # 生成姓名縮寫和變體
                name_a = ''.join([i[0] for i in name_list])  # 首字母縮寫
                name_ab = [name_a, name_list[0]]  # 縮寫和名字第一部分
                name_combined = ''.join(name_list)  # 組合名
                
                # 姓名與弱口令組合
                if self.name_weak_check.isChecked():
                    self.name_and_weak(name_combined, name_ab)
            
            # 處理英文名
            en_name_variants = []
            if en_name:
                en_name_parts = en_name.split('.')
                en_name_variants = [en_name.replace('.', ''), en_name_parts[0]]
                if len(en_name_parts) > 1:
                    en_name_variants.append(en_name_parts[0][0] + en_name_parts[1][0])  # 首字母縮寫
                
                # 英文名與弱口令組合
                if self.english_name_check.isChecked():
                    for en_var in en_name_variants:
                        self.name_and_weak(en_var, [en_var, en_name_parts[0]])
            
            # 處理生日
            birthday_list = []
            if birthday:
                if len(birthday) != 8 or not birthday.isdigit():
                    QMessageBox.warning(self, '警告', '生日格式不正確,應(yīng)為8位數(shù)字(如19990101)')
                    return
                
                birthday_list = [birthday, birthday[0:4], birthday[2:], birthday[4:]]
                
                # 生日與弱口令組合
                self.birthday_and_weak(birthday_list)
                
                # 姓名與生日組合
                if name and self.name_birth_check.isChecked():
                    self.name_and_birthday(name_combined, name_ab, birthday_list)
                
                # 英文名與生日組合
                if en_name and self.english_name_check.isChecked():
                    for en_var in en_name_variants:
                        self.name_and_birthday(en_var, [en_var, en_name_parts[0]], birthday_list)
            
            # 處理身份證
            if IDC:
                if len(IDC) != 18 or not IDC[:-1].isdigit():
                    QMessageBox.warning(self, '警告', '身份證號(hào)碼格式不正確,應(yīng)為18位數(shù)字(最后一位可以是X)')
                    return
                
                # 從身份證提取生日(如果生日未填寫)
                if not birthday:
                    birthday = IDC[6:14]
                    birthday_list = [birthday, birthday[0:4], birthday[2:], birthday[4:]]
                
                # 身份證與弱口令組合
                self.IDC_and_weak(IDC)
                
                # 身份證與姓名組合
                if name:
                    self.IDC_and_name(IDC, name_combined, name_ab)
                
                # 身份證與英文名組合
                if en_name:
                    for en_var in en_name_variants:
                        self.IDC_and_name(IDC, en_var, [en_var, en_name_parts[0]])
            
            # 處理手機(jī)號(hào)
            if phone_number:
                if not phone_number.isdigit() or len(phone_number) != 11:
                    QMessageBox.warning(self, '警告', '手機(jī)號(hào)格式不正確,應(yīng)為11位數(shù)字')
                    return
                
                # 手機(jī)號(hào)與弱口令組合
                self.phone_number_and_weak(phone_number)
                
                # 手機(jī)號(hào)與姓名組合
                if name:
                    self.phone_number_and_name(phone_number, name_combined, name_ab)
                
                # 手機(jī)號(hào)與英文名組合
                if en_name:
                    for en_var in en_name_variants:
                        self.phone_number_and_name(phone_number, en_var, [en_var, en_name_parts[0]])
            
            # 處理QQ號(hào)
            if qq_number:
                if not qq_number.isdigit():
                    QMessageBox.warning(self, '警告', 'QQ號(hào)格式不正確,應(yīng)為數(shù)字')
                    return
                
                # QQ和弱密碼組合
                self.qq_and_weak(qq_number)
                
                # 名稱與QQ組合
                if name:
                    self.qq_and_name(qq_number, name_combined, name_ab)
                
                # 英文名與QQ組合
                if en_name:
                    for en_var in en_name_variants:
                        self.qq_and_name(qq_number, en_var, [en_var, en_name_parts[0]])
            
            # 處理微信號(hào)
            if wechat:
                # 微信號(hào)與弱口令組合
                if self.wechat_check.isChecked():
                    self.id_and_weak(wechat)
                
                # 微信號(hào)與姓名組合
                if name and self.wechat_check.isChecked():
                    self.id_and_name(wechat, name_combined, name_ab)
                
                # 微信號(hào)與英文名組合
                if en_name and self.wechat_check.isChecked():
                    for en_var in en_name_variants:
                        self.id_and_name(wechat, en_var, [en_var, en_name_parts[0]])
            
            # 處理域名
            if domain:
                domain_list = []
                domain_split = domain.split('.')
                
                if len(domain_split) >= 2:  # 至少有一個(gè)點(diǎn)
                    if len(domain_split) == 2:  # 如 example.com
                        domain_list = [
                            domain, 
                            domain_split[0], 
                            domain_split[1],
                            domain_split[0] + domain_split[1]]
                    elif len(domain_split) == 3:  # 如 www.example.com
                        domain_list = [
                            domain,
                            domain_split[1], 
                            domain_split[1] + '.' + domain_split[2],
                            domain_split[0] + domain_split[1] + domain_split[2],
                            domain_split[1] + domain_split[2]]
                    elif len(domain_split) == 4:  # 如 www.example.co.uk
                        domain_list = [
                            domain,
                            domain_split[1], 
                            domain_split[1] + '.' + domain_split[2] + '.' + domain_split[3],
                            domain_split[0] + domain_split[1] + domain_split[2] + domain_split[3],
                            domain_split[1] + domain_split[2] + domain_split[3]]
                    else:
                        QMessageBox.warning(self, '警告', '域名格式不支持,請(qǐng)使用標(biāo)準(zhǔn)域名格式')
                        return
                    
                    # 域名與弱口令組合
                    self.domain_and_weak(domain_list)
                    
                    # 域名與姓名組合
                    if name and self.name_domain_check.isChecked():
                        self.name_and_domain(name_combined, name_ab, domain_list)
                    
                    # 域名與英文名組合
                    if en_name and self.english_name_check.isChecked():
                        for en_var in en_name_variants:
                            self.name_and_domain(en_var, [en_var, en_name_parts[0]], domain_list)
                else:
                    QMessageBox.warning(self, '警告', '域名格式不正確,應(yīng)包含至少一個(gè)點(diǎn)(如example.com)')
                    return
            
            # 處理ID
            if id_value:
                # ID與弱口令組合
                self.id_and_weak(id_value)
                
                # ID與姓名組合
                if name and self.name_id_check.isChecked():
                    self.id_and_name(id_value, name_combined, name_ab)
                
                # ID與英文名組合
                if en_name and self.english_name_check.isChecked():
                    for en_var in en_name_variants:
                        self.id_and_name(id_value, en_var, [en_var, en_name_parts[0]])
            
            # 處理伴侶信息
            partner_name_ab = []
            partner_name_pinyin = []
            if partner_name and (self.partner_name_check.isChecked() or self.partner_birth_check.isChecked()):
                # 判斷是中文還是拼音
                if any('\u4e00' <= char <= '\u9fff' for char in partner_name):
                    # 中文姓名,轉(zhuǎn)換為拼音
                    partner_name_pinyin = self.get_pinyin_variations(partner_name)
                    partner_name_list = partner_name_pinyin
                else:
                    # 拼音姓名,直接處理
                    partner_name_list = partner_name.split('.')
                
                if not all(partner_name_list):  # 檢查是否有空的名字部分
                    QMessageBox.warning(self, '警告', '伴侶姓名格式不正確,請(qǐng)使用點(diǎn)(.)分隔且不要有空的部分')
                    return
                
                # 生成伴侶姓名縮寫和變體
                partner_name_a = ''.join([i[0] for i in partner_name_list])  # 首字母縮寫
                partner_name_ab = [partner_name_a, partner_name_list[0]]  # 縮寫和名字第一部分
                partner_name_combined = ''.join(partner_name_list)  # 組合名
                
                # 伴侶姓名與弱口令組合
                if self.partner_name_check.isChecked():
                    self.name_and_weak(partner_name_combined, partner_name_ab)
                
                # 伴侶姓名與主姓名組合
                if name and self.partner_name_check.isChecked():
                    self.name_and_name(name_combined, name_ab, partner_name_combined, partner_name_ab)
            
            # 處理伴侶生日
            partner_birthday_list = []
            if partner_birth and self.partner_birth_check.isChecked():
                if len(partner_birth) != 8 or not partner_birth.isdigit():
                    QMessageBox.warning(self, '警告', '伴侶生日格式不正確,應(yīng)為8位數(shù)字(如19950214)')
                    return
                
                partner_birthday_list = [partner_birth, partner_birth[0:4], partner_birth[2:], partner_birth[4:]]
                
                # 伴侶生日與弱口令組合
                self.birthday_and_weak(partner_birthday_list)
                
                # 伴侶姓名與伴侶生日組合
                if partner_name and self.partner_birth_check.isChecked():
                    self.name_and_birthday(partner_name_combined, partner_name_ab, partner_birthday_list)
                
                # 主姓名與伴侶生日組合
                if name and self.partner_birth_check.isChecked():
                    self.name_and_birthday(name_combined, name_ab, partner_birthday_list)
            
            # 顯示結(jié)果
            self.output_edit.setPlainText('\n'.join(self.password_list))
            self.output_group.setTitle(f'?? 生成的密碼字典 (共生成 {len(self.password_list)} 條)')
            self.statusBar().showMessage(f'成功生成 {len(self.password_list)} 條密碼組合')
            
        except Exception as e:
            QMessageBox.critical(self, '錯(cuò)誤', f'生成密碼時(shí)出錯(cuò): {str(e)}')
            self.statusBar().showMessage('生成密碼時(shí)出錯(cuò)')
    
    def get_pinyin_variations(self, chinese_name):
        """將中文姓名轉(zhuǎn)換為拼音的各種變體"""
        # 獲取不帶聲調(diào)的拼音
        pinyin_list = pypinyin.lazy_pinyin(chinese_name)
        
        # 獲取帶聲調(diào)的拼音
        pinyin_tone_list = [item[0] for item in pypinyin.pinyin(chinese_name)]
        
        # 獲取首字母
        initials = [item[0] for item in pypinyin.lazy_pinyin(chinese_name)]
        
        # 生成各種變體
        variants = set()
        
        # 全拼組合 (張三 -> zhangsan)
        variants.add(''.join(pinyin_list))
        
        # 帶點(diǎn)分隔 (張三 -> zhang.san)
        variants.add('.'.join(pinyin_list))
        
        # 帶聲調(diào)全拼 (張三 -> zhāngsān)
        variants.add(''.join(pinyin_tone_list))
        
        # 首字母組合 (張三 -> zs)
        variants.add(''.join(initials))
        
        # 姓全拼+名首字母 (張三 -> zhangs)
        if len(pinyin_list) > 1:
            variants.add(pinyin_list[0] + initials[1])
        
        # 姓首字母+名全拼 (張三 -> zsan)
        if len(pinyin_list) > 1:
            variants.add(initials[0] + pinyin_list[1])
        
        return list(variants)
    
    def name_and_name(self, name1, name1_ab, name2, name2_ab):
        """兩個(gè)姓名之間的組合"""
        try:
            # 全名組合
            self.password_list.extend([name1 + name2, name2 + name1])
            
            # 縮寫組合
            for ab1 in name1_ab:
                for ab2 in name2_ab:
                    self.password_list.extend([ab1 + ab2, ab2 + ab1])
            
            # 全名與縮寫組合
            for ab1 in name1_ab:
                self.password_list.extend([ab1 + name2, name2 + ab1])
            
            for ab2 in name2_ab:
                self.password_list.extend([name1 + ab2, ab2 + name1])
            
            # 添加常見分隔符
            separators = ['', '.', '_', '-', '520', '1314', 'love']
            for sep in separators:
                self.password_list.extend([name1 + sep + name2, name2 + sep + name1])
                for ab1 in name1_ab:
                    for ab2 in name2_ab:
                        self.password_list.extend([ab1 + sep + ab2, ab2 + sep + ab1])
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理姓名組合時(shí)出錯(cuò): {str(e)}')
    
    def save_to_file(self):
        """保存密碼字典到文件"""
        if not hasattr(self, 'password_list') or not self.password_list:
            QMessageBox.warning(self, '警告', '沒有可保存的密碼字典,請(qǐng)先生成密碼')
            return
            
        file_path, _ = QFileDialog.getSaveFileName(self, '保存密碼字典', '', '文本文件 (*.txt);;所有文件 (*)')
        if file_path:
            try:
                with open(file_path, 'w', encoding='utf-8') as f:
                    f.write('\n'.join(self.password_list))
                self.statusBar().showMessage(f'密碼字典已保存到: {file_path}')
                QMessageBox.information(self, '成功', '密碼字典保存成功')
            except Exception as e:
                QMessageBox.critical(self, '錯(cuò)誤', f'保存文件時(shí)出錯(cuò): {str(e)}')
                self.statusBar().showMessage('保存文件時(shí)出錯(cuò)')
    
    def clear_all(self):
        """清除所有輸入和輸出"""
        self.name_edit.clear()
        self.en_name_edit.clear()
        self.birthday_edit.clear()
        self.idc_edit.clear()
        self.phone_edit.clear()
        self.qq_edit.clear()
        self.wechat_edit.clear()
        self.mail_edit.clear()
        self.domain_edit.clear()
        self.id_edit.clear()
        self.partner_name_edit.clear()
        self.partner_birth_edit.clear()
        self.output_edit.clear()
        
        self.name_weak_check.setChecked(True)
        self.name_birth_check.setChecked(True)
        self.name_domain_check.setChecked(True)
        self.name_id_check.setChecked(True)
        self.partner_name_check.setChecked(True)
        self.partner_birth_check.setChecked(True)
        self.wechat_check.setChecked(True)
        self.english_name_check.setChecked(True)
        
        if hasattr(self, 'password_list'):
            del self.password_list
        
        self.output_group.setTitle('?? 生成的密碼字典 (共生成 0 條)')
        self.statusBar().showMessage('已清除所有輸入和輸出')
    
    # 以下是各種密碼生成方法
    def name_and_weak(self, name, name_ab):
        """姓名與弱口令字段、常用數(shù)字組合"""
        try:
            self.password_list.append(name)
            for weak in weak_password:
                self.password_list.append(name + weak)
                for i in name_ab:
                    if i:  # 確保簡(jiǎn)稱不為空
                        self.password_list.append(i + weak)

            for number_1 in number_value_1:
                self.password_list.append(name + number_1)

            for number_2 in number_value_2:
                self.password_list.append(name + number_2)

            for number_3 in number_value_3:
                self.password_list.append(name + number_3)

            for number_4 in number_value_4:
                for i in name_ab:
                    if i:  # 確保簡(jiǎn)稱不為空
                        self.password_list.append(i + number_4)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理姓名和弱密碼組合時(shí)出錯(cuò): {str(e)}')

    def domain_and_weak(self, domain_list):
        """域名與弱口令"""
        try:
            for domain_i in domain_list:
                if domain_i:  # 確保不為空
                    self.password_list.append(domain_i)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理域名時(shí)出錯(cuò): {str(e)}')

    def name_and_domain(self, name, name_ab, domain_list):
        """域名與姓名結(jié)合"""
        try:
            for domain_i in domain_list:
                if domain_i:  # 確保不為空
                    self.password_list.extend([name+domain_i, domain_i+name])
                    for z in name_ab:
                        if z:  # 確保簡(jiǎn)稱不為空
                            self.password_list.extend([z+domain_i, domain_i+z])
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理域名和姓名組合時(shí)出錯(cuò): {str(e)}')

    def birthday_and_weak(self, birthday_list):
        """生日與弱口令字段組合"""
        try:
            for birth in birthday_list:
                if birth:  # 確保不為空
                    # 幾種常見的生日組合
                    self.password_list.extend([birth, birth[2:], birth[4:]+birth[:4]])
                    for weak in weak_password:
                        self.password_list.append(birth + weak)
                        self.password_list.append(weak + birth)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理生日和弱密碼組合時(shí)出錯(cuò): {str(e)}')

    def name_and_birthday(self, name, name_ab, birthday_list):
        """名稱與生日組合"""
        try:
            for birth in birthday_list:
                if birth:  # 確保不為空
                    # 全稱+生日
                    self.password_list.append(name + birth)
                    # 簡(jiǎn)稱+生日
                    for i in name_ab:
                        if i:  # 確保簡(jiǎn)稱不為空
                            self.password_list.append(i + birth)

                    for weak in weak_password:
                        # 簡(jiǎn)稱與生日與弱口令
                        for i in name_ab:
                            if i:  # 確保簡(jiǎn)稱不為空
                                self.password_list.append(i + birth + weak)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理姓名和生日組合時(shí)出錯(cuò): {str(e)}')

    def IDC_and_weak(self, idc_number):
        """身份證與弱口令組合"""
        try:
            if idc_number:  # 確保不為空
                self.password_list.extend([idc_number[12:], idc_number])
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理身份證和弱密碼組合時(shí)出錯(cuò): {str(e)}')

    def IDC_and_name(self, idc_number, name, name_ab):
        """身份證與名稱組合"""
        try:
            if idc_number:  # 確保不為空
                self.password_list.extend([name+idc_number[14:], idc_number[14:]+name])
                for i in name_ab:
                    if i:  # 確保簡(jiǎn)稱不為空
                        self.password_list.extend([idc_number[14:]+i, i+idc_number[14:]])
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理身份證和姓名組合時(shí)出錯(cuò): {str(e)}')

    def phone_number_and_weak(self, phone_number):
        """手機(jī)號(hào)與弱口令組合"""
        try:
            if phone_number:  # 確保不為空
                self.password_list.extend([phone_number, phone_number[3:]])
                for i in weak_password:
                    self.password_list.append(phone_number+i)
                    self.password_list.append(phone_number[7:]+i)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理手機(jī)號(hào)和弱密碼組合時(shí)出錯(cuò): {str(e)}')

    def phone_number_and_name(self, phone_number, name, name_ab):
        """手機(jī)號(hào)與名稱組合"""
        try:
            if phone_number:  # 確保不為空
                phone_number_list = [phone_number, phone_number[7:], phone_number[3:]]
                for i in phone_number_list:
                    if i:  # 確保不為空
                        self.password_list.extend([i+name, name+i])
                        for j in name_ab:
                            if j:  # 確保簡(jiǎn)稱不為空
                                self.password_list.extend([i + j, j + i])
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理手機(jī)號(hào)和姓名組合時(shí)出錯(cuò): {str(e)}')

    def id_and_weak(self, id_value):
        """id與弱口令"""
        try:
            if id_value:  # 確保不為空
                self.password_list.append(id_value)
                for weak in weak_password:
                    self.password_list.append(id_value + weak)

                for number_1 in number_value_1:
                    self.password_list.append(id_value + number_1)

                for number_2 in number_value_2:
                    self.password_list.append(id_value + number_2)

                for number_3 in number_value_3:
                    self.password_list.append(id_value + number_3)

                for number_4 in number_value_4:
                    self.password_list.append(id_value + number_4)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理ID和弱密碼組合時(shí)出錯(cuò): {str(e)}')

    def id_and_name(self, id_value, name, name_ab):
        """id與姓名組合"""
        try:
            if id_value:  # 確保不為空
                self.password_list.append(name + id_value)
                # 簡(jiǎn)稱+id
                for i in name_ab:
                    if i:  # 確保簡(jiǎn)稱不為空
                        self.password_list.append(i + id_value)
                        self.password_list.append(id_value + i)

                for weak in weak_password:
                    # 簡(jiǎn)稱與id與弱口令
                    for i in name_ab:
                        if i:  # 確保簡(jiǎn)稱不為空
                            self.password_list.append(i + id_value + weak)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理ID和姓名組合時(shí)出錯(cuò): {str(e)}')

    def qq_and_weak(self, qq_number):
        """qq和弱密碼組合"""
        try:
            if qq_number:  # 確保不為空
                self.password_list.append(qq_number)
                for weak in weak_password:
                    self.password_list.append(qq_number + weak)
                    self.password_list.append(weak + qq_number)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理QQ號(hào)和弱密碼組合時(shí)出錯(cuò): {str(e)}')

    def qq_and_name(self, qq_number, name, name_ab):
        """名稱與qq組合"""
        try:
            if qq_number:  # 確保不為空
                # 全稱+qq
                self.password_list.append(name + qq_number)
                # 簡(jiǎn)稱+qq
                for i in name_ab:
                    if i:  # 確保簡(jiǎn)稱不為空
                        self.password_list.append(i + qq_number)

                for weak in weak_password:
                    # 簡(jiǎn)稱與qq與弱口令
                    for i in name_ab:
                        if i:  # 確保簡(jiǎn)稱不為空
                            self.password_list.append(i + qq_number + weak)
        except Exception as e:
            QMessageBox.warning(self, '警告', f'處理QQ號(hào)和姓名組合時(shí)出錯(cuò): {str(e)}')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    
    # 設(shè)置全局字體
    font = QFont()
    font.setFamily('Microsoft YaHei')
    font.setPointSize(10)
    app.setFont(font)
    
    # 設(shè)置樣式表
    app.setStyleSheet("""
        QGroupBox {
            font-weight: bold;
            border: 1px solid silver;
            border-radius: 6px;
            margin-top: 10px;
        }
        
        QGroupBox::title {
            subcontrol-origin: margin;
            left: 10px;
            padding: 0 3px;
        }
        
        QLineEdit, QTextEdit {
            border: 1px solid #ccc;
            border-radius: 4px;
            padding: 3px;
        }
        
        QPushButton {
            padding: 5px 10px;
            border-radius: 4px;
            min-width: 100px;
        }
        
        QPushButton:hover {
            opacity: 0.9;
        }
    """)
    
    window = PasswordGeneratorApp()
    window.show()
    sys.exit(app.exec_())

性能測(cè)試

測(cè)試環(huán)境:Intel i7-10750H @ 2.60GHz

數(shù)據(jù)量生成時(shí)間內(nèi)存占用
50字段0.8s45MB
200字段3.2s128MB
1000字段15.7s520MB

應(yīng)用場(chǎng)景

安全審計(jì):企業(yè)密碼策略驗(yàn)證

安全教育:演示弱密碼風(fēng)險(xiǎn)

密碼恢復(fù):合法數(shù)據(jù)恢復(fù)場(chǎng)景

未來擴(kuò)展

  • 增加機(jī)器學(xué)習(xí)預(yù)測(cè)模型
  • 支持社交媒體數(shù)據(jù)爬取
  • 添加分布式生成功能
  • 開發(fā)Web API版本

總結(jié)

本文詳細(xì)剖析了社會(huì)工程學(xué)密碼字典生成器的開發(fā)全過程。該工具通過:

  • 智能化組合算法 - 覆蓋300+常見密碼模式
  • 人性化交互設(shè)計(jì) - 降低安全工具使用門檻
  • 模塊化架構(gòu) - 便于功能擴(kuò)展

聲明:本工具僅限合法授權(quán)場(chǎng)景使用,嚴(yán)禁用于非法用途!

到此這篇關(guān)于Python+PyQt5開發(fā)智能密碼字典生成器(附完整源碼)的文章就介紹到這了,更多相關(guān)Python生成密碼字典內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python使用redis pool的一種單例實(shí)現(xiàn)方式

    Python使用redis pool的一種單例實(shí)現(xiàn)方式

    這篇文章主要介紹了Python使用redis pool的一種單例實(shí)現(xiàn)方式,結(jié)合實(shí)例形式分析了Python操作redis模塊實(shí)現(xiàn)共享同一個(gè)連接池的相關(guān)技巧,需要的朋友可以參考下
    2016-04-04
  • Pytorch 使用不同版本的cuda的方法步驟

    Pytorch 使用不同版本的cuda的方法步驟

    這篇文章主要介紹了Pytorch 使用不同版本的cuda的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 解決python有時(shí)候import不了當(dāng)前的包問題

    解決python有時(shí)候import不了當(dāng)前的包問題

    今天小編就為大家分享一篇解決python有時(shí)候import不了當(dāng)前的包問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Python3獲取cookie常用三種方案

    Python3獲取cookie常用三種方案

    這篇文章主要介紹了Python3獲取cookie常用三種方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • Python?matplotlib的spines模塊實(shí)例詳解

    Python?matplotlib的spines模塊實(shí)例詳解

    作為程序員,經(jīng)常需要進(jìn)行繪圖,下面這篇文章主要給大家介紹了關(guān)于Python?matplotlib的spines模塊的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Python實(shí)現(xiàn)文本特征提取的方法詳解

    Python實(shí)現(xiàn)文本特征提取的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Python實(shí)現(xiàn)提取四種不同文本特征的方法,有字典文本特征提取、英文文本特征提取、中文文本特征提取和TF-IDF 文本特征提取,感興趣的可以了解一下
    2022-08-08
  • Django框架獲取form表單數(shù)據(jù)方式總結(jié)

    Django框架獲取form表單數(shù)據(jù)方式總結(jié)

    這篇文章主要介紹了Django框架獲取form表單數(shù)據(jù)方式總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn)

    Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn)

    這篇文章主要介紹了Numpy數(shù)組的廣播機(jī)制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • PyTorch使用GPU訓(xùn)練的兩種方法實(shí)例

    PyTorch使用GPU訓(xùn)練的兩種方法實(shí)例

    pytorch是一個(gè)非常優(yōu)秀的深度學(xué)習(xí)的框架,具有速度快,代碼簡(jiǎn)潔,可讀性強(qiáng)的優(yōu)點(diǎn),下面這篇文章主要給大家介紹了關(guān)于PyTorch使用GPU訓(xùn)練的兩種方法,需要的朋友可以參考下
    2022-05-05
  • Python知識(shí)之列表的十個(gè)小技巧分享

    Python知識(shí)之列表的十個(gè)小技巧分享

    這篇文章主要介紹了Python知識(shí)之列表的十個(gè)小技巧分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01

最新評(píng)論

库伦旗| 大洼县| 青海省| 合作市| 花莲县| 崇义县| 凭祥市| 宁安市| 英吉沙县| 科尔| 无棣县| 盐山县| 达州市| 扶余县| 临桂县| 静安区| 宜城市| 中卫市| 新邵县| 玛曲县| 九台市| 三台县| 伽师县| 潍坊市| 巫山县| 襄垣县| 江阴市| 海盐县| 莒南县| 湘乡市| 镇雄县| 卓尼县| 静宁县| 万全县| 吕梁市| 黄浦区| 弋阳县| 马山县| 治县。| 尤溪县| 镇赉县|