密码破解
密码破解 问题 使用暴力破解包含大小写字母和数字的四位密码。 程序 import itertools import time import hashlib def generate_hashes(passwords): """生成密码的MD5哈希值""" hashes = {} for pwd in passwords: hashes[pwd] = hashlib.md5(pwd.encode()).hexdigest() return hashes def crack_by_hash(target_hashes): """通过哈希值破解密码""" characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' print("开始破解密码...") start_time = time.time() attempts = 0 found_passwords = {} # 记录每个密码的破解信息 crack_info = {} # 生成所有1-3位字符组合 for length in range(1, 5): for candidate in itertools.product(characters, repeat=length): password_attempt = ''.join(candidate) attempts += 1 # 计算当前尝试密码的MD5哈希值 hash_attempt = hashlib.md5(password_attempt.encode()).hexdigest() # 检查哈希值是否匹配任何目标 for original_pwd, target_hash in target_hashes.items(): if hash_attempt == target_hash and original_pwd not in found_passwords: found_passwords[original_pwd] = password_attempt crack_time = time.time() - start_time crack_info[original_pwd] = { 'attempts': attempts, 'time': crack_time, 'found_password': password_attempt } print(f"✅ 破解成功: '{original_pwd}' -> '{password_attempt}'") print(f" 尝试次数: {attempts}, 耗时: {crack_time:.4f}秒") # 如果所有密码都已找到,提前结束 if len(found_passwords) == len(target_hashes): total_time = time.time() - start_time print(f"\n所有密码破解完成!") print(f"总尝试次数: {attempts}, 总耗时: {total_time:.4f}秒") return crack_info total_time = time.time() - start_time print(f"\n破解结束,找到 {len(found_passwords)}/{len(target_hashes)} 个密码") print(f"总尝试次数: {attempts}, 总耗时: {total_time:.4f}秒") return crack_info def main(): # 预存密码 - 代表最快和最后被遍历出来的密码 passwords = ['a', '9', 'aa', '99', 'aaa', '999', 'aaaa', '9999'] print("=" * 60) print(" 密码哈希破解演示 (使用MD5)") print("=" * 60) # 生成并显示预存密码的哈希值 print("\n预存密码及其MD5哈希值:") print("-" * 80) hashes = generate_hashes(passwords) for pwd, h in hashes.items(): print(f"密码: '{pwd}' -> 哈希: {h}") print("-" * 80) # 显示字符集信息 characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' print(f"\n字符集: {characters}") print(f"字符集大小: {len(characters)}") print(f"1位密码组合数: {len(characters)}") print(f"2位密码组合数: {len(characters)**2}") print(f"3位密码组合数: {len(characters)**3}") print(f"4位密码组合数: {len(characters)**4}") print(f"总组合数: {len(characters) + len(characters)**2 + len(characters)**3 + len(characters)**4}") # 开始破解 input("\n按回车键开始破解...") # 破解密码(只通过哈希值比较) results = crack_by_hash(hashes) # 显示破解结果总结 print("\n" + "=" * 60) print("破解结果总结:") print("-" * 60) # 按破解顺序显示 for pwd in passwords: if pwd in results: info = results[pwd] print(f"密码 '{pwd}': {info['attempts']:6d} 次尝试, {info['time']:.4f} 秒") else: print(f"密码 '{pwd}': 未找到") print("=" * 60) if __name__ == "__main__": main() 执行效果 ============================================================ 密码哈希破解演示 (使用MD5) ============================================================ 预存密码及其MD5哈希值: -------------------------------------------------------------------------------- 密码: 'a' -> 哈希: 0cc175b9c0f1b6a831c399e269772661 密码: '9' -> 哈希: 45c48cce2e2d7fbdea1afc51c7c6ad26 密码: 'aa' -> 哈希: 4124bc0a9335c27f086f24ba207a4912 密码: '99' -> 哈希: ac627ab1ccbdb62ec96e702f07f6425b 密码: 'aaa' -> 哈希: 47bce5c74f589f4867dbd57e9ca9f808 密码: '999' -> 哈希: b706835de79a2b4e80506f582af3676a 密码: 'aaaa' -> 哈希: 74b87337454200d4d33f80c4663dc5e5 密码: '9999' -> 哈希: fa246d0262c3925617b0c72bb20eeb1d -------------------------------------------------------------------------------- 字符集: abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 字符集大小: 62 1位密码组合数: 62 2位密码组合数: 3844 3位密码组合数: 238328 4位密码组合数: 14776336 总组合数: 15018570 按回车键开始破解... 开始破解密码... ✅ 破解成功: 'a' -> 'a' 尝试次数: 1, 耗时: 0.0000秒 ✅ 破解成功: '9' -> '9' 尝试次数: 62, 耗时: 0.0006秒 ✅ 破解成功: 'aa' -> 'aa' 尝试次数: 63, 耗时: 0.0010秒 ✅ 破解成功: '99' -> '99' 尝试次数: 3906, 耗时: 0.0053秒 ✅ 破解成功: 'aaa' -> 'aaa' 尝试次数: 3907, 耗时: 0.0055秒 ✅ 破解成功: '999' -> '999' 尝试次数: 242234, 耗时: 0.2391秒 ✅ 破解成功: 'aaaa' -> 'aaaa' 尝试次数: 242235, 耗时: 0.2394秒 ✅ 破解成功: '9999' -> '9999' 尝试次数: 15018570, 耗时: 14.6867秒 所有密码破解完成! 总尝试次数: 15018570, 总耗时: 14.6869秒 ============================================================ 破解结果总结: ------------------------------------------------------------ 密码 'a': 1 次尝试, 0.0000 秒 密码 '9': 62 次尝试, 0.0006 秒 密码 'aa': 63 次尝试, 0.0010 秒 密码 '99': 3906 次尝试, 0.0053 秒 密码 'aaa': 3907 次尝试, 0.0055 秒 密码 '999': 242234 次尝试, 0.2391 秒 密码 'aaaa': 242235 次尝试, 0.2394 秒 密码 '9999': 15018570 次尝试, 14.6867 秒 ============================================================