import random import string import torch def txt_to_list(filename): with open(filename, 'r') as file: lines = file.readlines() # Strip whitespace and return return [line.strip() for line in lines] commonpasswords_list = txt_to_list('10-million-password-list-top-1000000.txt') englishwords_list = txt_to_list('words.txt') #Remove any single alphabet letter commonpasswords_list = [item for item in commonpasswords_list if not (isinstance(item, str) and len(item) == 1 and item.isalpha())] englishwords_list = [item for item in englishwords_list if not (isinstance(item, str) and len(item) == 1 and item.isalpha())] #Remove '', which would cause error englishwords_list.remove('') #Double check whether it works any(elem in commonpasswords_list for elem in list(string.ascii_lowercase)) any(elem in englishwords_list for elem in list(string.ascii_lowercase)) topwords_list = txt_to_list('top-1000-nouns.txt') #Remove any single alphabet letter topwords_list = [item for item in topwords_list if not (isinstance(item, str) and len(item) == 1 and item.isalpha())] #Remove '', which would cause error #Double check whether it works any(elem in topwords_list for elem in list(string.ascii_lowercase)) topwords_list[0] = 'time' common_passwords = commonpasswords_list dictionary_words = englishwords_list def generate_password(length=12, use_uppercase=True, use_lowercase=True, use_numbers=True, use_symbols=True, dictionary = True): # Define the character sets uppercase = string.ascii_uppercase lowercase = string.ascii_lowercase numbers = string.digits symbols = "!@#$%^&*()-_+=[]{}|:;<>,.?/" # Build the character pool based on the user's requirements character_pool = "" if use_uppercase: character_pool += uppercase if use_lowercase: character_pool += lowercase if use_numbers: character_pool += numbers if use_symbols: character_pool += symbols # Check if character pool is empty if not character_pool: raise ValueError("No character sets selected!") # Generate the password while True: password = ''.join(random.choice(character_pool) for _ in range(length)) # Check if password contains any common English word if not any(word in password.lower() for word in common_passwords): if dictionary: if not any(word in password.lower() for word in dictionary_words): return password break return password break # Load model directly from transformers import AutoTokenizer, AutoModelForSequenceClassification tokenizer = AutoTokenizer.from_pretrained("DunnBC22/codebert-base-Password_Strength_Classifier") model = AutoModelForSequenceClassification.from_pretrained("DunnBC22/codebert-base-Password_Strength_Classifier") # Put the model in evaluation mode #The model classifies passwords as one of the following:0.Weak 1.Medium 2.Strong model.eval() # Input the password you generate, you could also manually input text = generate_password(12) #text = input() # Tokenize input text inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True, max_length=512) # Get logits with torch.no_grad(): logits = model(**inputs).logits # Get predictions predictions = torch.argmax(logits, dim=1) def strength_indicator(value): # Define a mapping of index to label index_to_label = { 0: "Weak", 1: "Medium", 2: "Strong" } # Check if the input value is within the valid range if value not in index_to_label: raise ValueError("Input should be an integer ranging from 0 to 2.") # Return the corresponding label return index_to_label[value] strength_indicator(predictions.item()) ##This is just a python function and no user interface def AssessYourPassword(manual=True): model.eval() # Input the password you generate, you could also manually input if manual: text = input() else: print('Please input the length of your password:') n = input() text = generate_password(int(n)) # Tokenize input text inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True, max_length=512) # Get logits with torch.no_grad(): logits = model(**inputs).logits # Get predictions predictions = torch.argmax(logits, dim=1) strength = strength_indicator(predictions.item()) if not manual: print(f'This is the generated password: {text}') return print(f'Password Strength: {strength}') import gradio as gr import random import string import torch model.eval() def generate_password(length=12, use_uppercase=True, use_lowercase=True, use_numbers=True, use_symbols=True, dictionary=True, easy_mode=False): if easy_mode: numbers = "1234567890" special_chars = "!@#$%^&*" chosen_words = [random.choice(topwords_list) for _ in range(2)] chosen_words = [word.capitalize() if random.choice([True, False]) else word for word in chosen_words] chosen_numbers = "".join(random.choice(numbers) for _ in range(3)) chosen_special_char = random.choice(special_chars) components = chosen_words + [chosen_numbers, chosen_special_char] random.shuffle(components) password = "".join(components) else: uppercase = string.ascii_uppercase lowercase = string.ascii_lowercase numbers = string.digits symbols = "!@#$%^&*()-_+=[]{}|:;<>,.?/" character_pool = "" if use_uppercase: character_pool += uppercase if use_lowercase: character_pool += lowercase if use_numbers: character_pool += numbers if use_symbols: character_pool += symbols if not character_pool: raise ValueError("No character sets selected!") password = ''.join(random.choice(character_pool) for _ in range(length)) return password def AssessYourPassword_UI_v2(option, length, use_uppercase, use_lowercase, use_numbers, use_symbols, dictionary_allowed, text_input): model.eval() if option == "Manual": text = text_input elif option == "Easy Mode": text = generate_password(easy_mode=True) else: text = generate_password(length, use_uppercase, use_lowercase, use_numbers, use_symbols, not dictionary_allowed) inputs = tokenizer(text, return_tensors='pt', truncation=True, padding=True, max_length=512) with torch.no_grad(): logits = model(**inputs).logits predictions = torch.argmax(logits, dim=1) strength = strength_indicator(predictions.item()) if option == "Manual": output_password = "You provided: " + text else: output_password = "Generated: " + text return output_password, f'Password Strength: {strength}' iface_v2 = gr.Interface( fn=AssessYourPassword_UI_v2, inputs=[ gr.Radio(["Manual", "Generated", "Easy Mode"], label="Password Input Method"), gr.Slider(minimum=6, maximum=24, default=12, step=1, label="Password Length"), gr.Checkbox(label="Use Uppercase Letters", default=True), gr.Checkbox(label="Use Lowercase Letters", default=True), gr.Checkbox(label="Use Numbers", default=True), gr.Checkbox(label="Use Symbols", default=True), gr.Checkbox(label="Allow Dictionary Words", default=False), gr.Textbox(default="Type password or length here", label="Input") ], outputs=[ "text", "text" ] ) iface_v2.launch(share=True, debug=True)