Download REAPER below for a free, fully functional 60-day evaluation.
No registration or personal details are required.
REAPER supports all Windows versions from Windows XP to Windows 11.
REAPER supports Linux on Intel and ARM architectures, and the Windows version works well with WINE.
REAPER supports macOS 10.5* to macOS 26.
@staticmethod def capitalize_variations(password: str) -> List[str]: """Generate capitalization variations""" variations = {password.lower(), password.upper(), password.capitalize()} # Title case for words if ' ' in password: variations.add(password.title()) return list(variations) if == " main ": demo_rockyou_feature()
def find_similar(self, target_password: str, threshold: int = 2) -> List[str]: """ Find similar passwords using Levenshtein distance Args: target_password: Password to compare against threshold: Maximum edit distance Returns: List of similar passwords """ if not self.loaded: self.load() def levenshtein(s1: str, s2: str) -> int: if len(s1) < len(s2): return levenshtein(s2, s1) if len(s2) == 0: return len(s1) previous_row = range(len(s2) + 1) for i, c1 in enumerate(s1): current_row = [i + 1] for j, c2 in enumerate(s2): insertions = previous_row[j + 1] + 1 deletions = current_row[j] + 1 substitutions = previous_row[j] + (c1 != c2) current_row.append(min(insertions, deletions, substitutions)) previous_row = current_row return previous_row[-1] similar = [] for pwd in self.wordlist[:10000]: # Limit for performance distance = levenshtein(target_password, pwd) if distance <= threshold: similar.append(pwd) return similar def demo_rockyou_feature(): """Demonstrate the RockYou wordlist feature""" wordlist 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 @staticmethod def capitalize_variations(password: str) ->
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 threshold: int = 2) ->
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