def get_statistics(self) -> Dict: """ Analyze wordlist statistics Returns: Dictionary with statistics """ if not self.loaded: self.load() stats = { 'total_passwords': len(self.wordlist), 'unique_passwords': len(set(self.wordlist)), 'duplicates': len(self.wordlist) - len(set(self.wordlist)), 'length_distribution': {}, 'common_patterns': {}, 'character_types': { 'numeric_only': 0, 'alpha_only': 0, 'alphanumeric': 0, 'special_chars': 0 } } # Analyze password lengths lengths = [len(pwd) for pwd in self.wordlist] length_counter = Counter(lengths) stats['length_distribution'] = dict(length_counter.most_common(10)) # Analyze character types for pwd in self.wordlist: if pwd.isdigit(): stats['character_types']['numeric_only'] += 1 elif pwd.isalpha(): stats['character_types']['alpha_only'] += 1 elif pwd.isalnum(): stats['character_types']['alphanumeric'] += 1 elif any(not c.isalnum() for c in pwd): stats['character_types']['special_chars'] += 1 # Find common patterns common_passwords = Counter(self.wordlist).most_common(20) stats['common_patterns'] = dict(common_passwords) return stats
""" RockYou Wordlist Feature A comprehensive utility for working with the rockyou.txt wordlist """ import os import gzip import hashlib from typing import List, Set, Dict, Optional, Iterator from pathlib import Path from collections import Counter import re
# Common paths where rockyou might be located COMMON_PATHS = [ "/usr/share/wordlists/rockyou.txt", "/usr/share/wordlists/rockyou.txt.gz", "./wordlists/rockyou.txt", "./rockyou.txt", "~/rockyou.txt" ] wordlist rockyou
def load(self, max_passwords: Optional[int] = None) -> List[str]: """ Load the wordlist into memory Args: max_passwords: Limit number of passwords to load (for testing) Returns: List of passwords """ passwords = [] # Handle gzipped files if self.filepath.endswith('.gz'): open_func = gzip.open mode = 'rt' else: open_func = open mode = 'r', encoding='latin-1' try: with open_func(self.filepath, mode, encoding='latin-1', errors='ignore') as f: for i, line in enumerate(f): if max_passwords and i >= max_passwords: break password = line.strip() if password: # Skip empty lines passwords.append(password) except TypeError: # Fallback for older Python versions with open_func(self.filepath, 'rt', encoding='latin-1', errors='ignore') as f: for i, line in enumerate(f): if max_passwords and i >= max_passwords: break password = line.strip() if password: passwords.append(password) self.wordlist = passwords self.loaded = True return passwords
@staticmethod def leet_speak(password: str) -> List[str]: """Convert to leet speak variations""" leet_map = { 'a': ['4', '@'], 'e': ['3'], 'i': ['1', '!'], 'o': ['0'], 's': ['5', '$'], 't': ['7'] } variations = [password] for char, replacements in leet_map.items(): new_variations = [] for var in variations: for replacement in replacements: new_variations.append(var.replace(char, replacement)) variations.extend(new_variations) return list(set(variations))[:20] # Limit variations Please provide the correct path
try: # Initialize the wordlist manager rockyou = RockYouWordlist() # Load first 1000 passwords for demo print("Loading first 1000 passwords...") passwords = rockyou.load(max_passwords=1000) print(f"Loaded {len(passwords)} passwords\n") # Get statistics print("=== Statistics ===") stats = rockyou.get_statistics() print(f"Total passwords: {stats['total_passwords']}") print(f"Unique passwords: {stats['unique_passwords']}") print(f"Duplicates: {stats['duplicates']}") print("\nTop 10 password lengths:") for length, count in stats['length_distribution'].items(): print(f" Length {length}: {count} passwords") print("\nCharacter type distribution:") for char_type, count in stats['character_types'].items(): print(f" {char_type}: {count}") print("\nTop 5 most common passwords:") for pwd, count in list(stats['common_patterns'].items())[:5]: print(f" '{pwd}': {count} times") # Search functionality print("\n=== Search Examples ===") print("Passwords containing '123':") matches = rockyou.search(r'123') for pwd in matches[:10]: print(f" {pwd}") print("\nPasswords with repeating characters:") matches = rockyou.search(r'(.)\1\1') # Three identical chars in a row for pwd in matches[:10]: print(f" {pwd}") # Filter by length print("\n=== Filtering ===") medium_passwords = rockyou.filter_by_length(min_len=8, max_len=12) print(f"Passwords with 8-12 characters: {len(medium_passwords)}") # Password hashing print("\n=== Password Hashing (MD5) ===") hashes = rockyou.get_hash('md5') for pwd, hash_val in list(hashes.items())[:5]: print(f" {pwd} -> {hash_val}") # Find similar passwords print("\n=== Similar Password Search ===") similar = rockyou.find_similar("password123", threshold=2) print(f"Passwords similar to 'password123': {similar[:10]}") except FileNotFoundError as e: print(f"Error: {e}") print("\nTo get the RockYou wordlist:") print("1. On Kali Linux: sudo gunzip /usr/share/wordlists/rockyou.txt.gz") print("2. Or download from: https://github.com/brannondorsey/naive-hashcat/releases/download/data/rockyou.txt") class RockYouTransformer: """Transform and mutate passwords from rockyou"""
def get_hash(self, hash_type: str = 'md5') -> Dict[str, str]: """ Generate hashes for passwords Args: hash_type: 'md5', 'sha1', 'sha256' Returns: Dictionary mapping password to hash """ if not self.loaded: self.load() hash_func = getattr(hashlib, hash_type) return {pwd: hash_func(pwd.encode()).hexdigest() for pwd in self.wordlist[:1000]} # Limit for performance def get_statistics(self) ->
def __init__(self, filepath: Optional[str] = None): """ Initialize the RockYou wordlist manager Args: filepath: Path to rockyou.txt or rockyou.txt.gz file """ self.filepath = self._find_wordlist(filepath) if filepath else self._find_wordlist() self.wordlist = None self.loaded = False def _find_wordlist(self, filepath: Optional[str] = None) -> str: """Find the rockyou wordlist file""" if filepath and os.path.exists(filepath): return filepath for path in self.COMMON_PATHS: expanded_path = os.path.expanduser(path) if os.path.exists(expanded_path): return expanded_path raise FileNotFoundError( "RockYou wordlist not found. Please provide the correct path. " "On Kali Linux: sudo gunzip /usr/share/wordlists/rockyou.txt.gz" )