import hashlib
import itertools
import string
from collections import defaultdict
import threading
import time
class HashCracker:
def __init__(self):
self.found_passwords = {}
self.common_passwords = []
self.total_hashes = 0
self.cracked_count = 0
def load_hashes(self, filename):
with open(filename, 'r') as f:
hashes = [line.strip() for line in f if line.strip()]
self.total_hashes = len(hashes)
return hashes
def load_rockyou(self, filename='rockyou.txt'):
common_passwords = []
try:
with open(filename, 'r', encoding='utf-8', errors='ignore') as f:
for line in f:
password = line.strip()
if password:
common_passwords.append(password)
print(f"成功加载 {len(common_passwords)} 个常用密码")
except FileNotFoundError:
print(f"未找到 {filename} 文件")
common_passwords = self.get_builtin_common_passwords()
return common_passwords
def get_builtin_common_passwords(self):
return [
'123456', 'password', '12345678', 'qwerty', 'abc123',
'123456789', '111111', '1234567', 'iloveyou', 'admin',
'welcome', 'monkey', '1234567890', '123123', '000000'
]
def sha256_hash(self, text):
return hashlib.sha256(text.encode('utf-8')).hexdigest()
def basic_dictionary_attack(self, hashes):
print("开始基础字典攻击...")
for password in self.common_passwords:
hash_value = self.sha256_hash(password)
if hash_value in hashes and hash_value not in self.found_passwords:
self.found_passwords[hash_value] = password
self.cracked_count += 1
print(f"破解成功:{password}")
def dictionary_with_variations(self, hashes):
print("开始带变体的字典攻击...")
common_variations = [
lambda p: p + '1', lambda p: p + '12', lambda p: p + '123',
lambda p: p + '!', lambda p: p + '@', lambda p: p + '#',
lambda p: p + '2020', lambda p: p + '2021', lambda p: p + '2022',
lambda p: p + '2023', lambda p: p + '2024',
lambda p: p.capitalize(), lambda p: p.upper(),
lambda p: p + '?', lambda p: '1' + p
]
for password in self.common_passwords[:10000]:
for variation in common_variations:
try:
variant = variation(password)
hash_value = self.sha256_hash(variant)
if hash_value in hashes and hash_value not in self.found_passwords:
self.found_passwords[hash_value] = variant
self.cracked_count += 1
print(f"破解成功:{variant}")
except:
continue
def brute_force_simple(self, hashes, max_length=4):
print(f"开始简单暴力破解(长度≤{max_length})...")
chars = string.ascii_lowercase + string.digits
for length in range(1, max_length + 1):
for combo in itertools.product(chars, repeat=length):
password = "".join(combo)
hash_value = self.sha256_hash(password)
if hash_value in hashes and hash_value not in self.found_passwords:
self.found_passwords[hash_value] = password
self.cracked_count += 1
print(f"破解成功:{password}")
def common_patterns(self, hashes):
print("开始常见模式攻击...")
patterns = [
'qwerty', 'asdfgh', 'zxcvbn', '123qwe', '1qaz2wsx',
'password', 'admin', 'welcome', 'login', 'letmein', 'master',
'sunshine', 'princess', 'qwertyuiop',
'1980', '1981', '1982', '1983', '1984', '1985', '1986', '1987',
'1988', '1989', '1990', '1991', '1992', '1993', '1994', '1995',
'1996', '1997', '1998', '1999', '2000', '2001', '2002', '2003',
'2004', '2005', '2006', '2007', '2008', '2009', '2010', '2011',
'2012', '2013', '2014', '2015', '2016', '2017', '2018', '2019',
'2020', '2021', '2022', '2023', '2024',
'january', 'february', 'march', 'april', 'may', 'june', 'july',
'august', 'september', 'october', 'november', 'december',
'spring', 'summer', 'autumn', 'winter',
'red', 'blue', 'green', 'yellow', 'black', 'white', 'orange', 'purple'
]
for pattern in patterns:
hash_value = self.sha256_hash(pattern)
if hash_value in hashes and hash_value not in self.found_passwords:
self.found_passwords[hash_value] = pattern
self.cracked_count += 1
print(f"破解成功:{pattern}")
for pattern in patterns:
for i in range(10):
variant = pattern + str(i)
hash_value = self.sha256_hash(variant)
if hash_value in hashes and hash_value not in self.found_passwords:
self.found_passwords[hash_value] = variant
self.cracked_count += 1
print(f"破解成功:{variant}")
def advanced_variations(self, hashes):
print("开始高级变体攻击...")
base_words = ['love', 'god', 'life', 'hello', 'test', 'demo', 'user', 'pass']
special_chars = ['!', '@', '#', '$', '%', '&', '*']
numbers = ['', '1', '12', '123', '1234', '12345', '007', '100', '200']
for word in base_words:
variants = [word, word.capitalize(), word.upper(), word + word]
for num in numbers:
variants.extend([word + num, word.capitalize() + num])
for char in special_chars:
variants.extend([
word + char, char + word, word.capitalize() + char,
char + word.capitalize(), word + char + '1', word + char + '123'
])
for variant in variants:
hash_value = self.sha256_hash(variant)
if hash_value in hashes and hash_value not in self.found_passwords:
self.found_passwords[hash_value] = variant
self.cracked_count += 1
print(f"破解成功:{variant}")
def save_results(self, hashes, filename='2.txt'):
with open(filename, 'w', encoding='utf-8') as f:
for hash_value in hashes:
if hash_value in self.found_passwords:
f.write(f"{hash_value}:{self.found_passwords[hash_value]}\n")
print(f"\n结果已保存到 {filename}")
print(f"总共破解了 {self.cracked_count}/{self.total_hashes} 个哈希")
def crack_hashes(self, hash_file):
print("开始破解 SHA-256 哈希...")
hashes = self.load_hashes(hash_file)
self.common_passwords = self.load_rockyou()
print(f"需要破解 {len(hashes)} 个哈希值")
methods = [
self.basic_dictionary_attack,
self.common_patterns,
self.dictionary_with_variations,
self.brute_force_simple,
self.advanced_variations
]
for method in methods:
if self.cracked_count >= self.total_hashes:
break
start_time = time.time()
method(hashes)
end_time = time.time()
print(f"{method.__name__} 完成,用时:{end_time - start_time:.2f}秒")
print(f"当前破解进度:{self.cracked_count}/{self.total_hashes}")
self.save_results(hashes)
return self.found_passwords
def main():
cracker = HashCracker()
try:
results = cracker.crack_hashes('1.txt')
print("\n破解结果示例:")
for i, (hash_val, password) in enumerate(list(results.items())[:10]):
print(f"{hash_val}: {password}")
except Exception as e:
print(f"发生错误:{e}")
if __name__ == "__main__":
main()