Visionary Vault Python GUI

👤 Sharing: AI
import tkinter as tk
from tkinter import ttk, filedialog, messagebox
import os
import hashlib
import json

class VisionaryVaultApp:
    def __init__(self, master):
        self.master = master
        master.title("Visionary Vault")
        master.geometry("600x400")

        self.notebook = ttk.Notebook(master)
        self.notebook.pack(expand=True, fill='both', padx=10, pady=10)

        # File Encryption/Decryption Tab
        self.file_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.file_tab, text='File Encryption')
        self.create_file_tab(self.file_tab)

        # Password Generator Tab
        self.password_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.password_tab, text='Password Generator')
        self.create_password_tab(self.password_tab)
        
        # Text Encryption/Decryption Tab
        self.text_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.text_tab, text='Text Encryption')
        self.create_text_tab(self.text_tab)

        # Settings (JSON) Editor
        self.settings_tab = ttk.Frame(self.notebook)
        self.notebook.add(self.settings_tab, text='Settings Editor')
        self.create_settings_tab(self.settings_tab)


        # Details Button
        self.details_button = tk.Button(master, text="Details", command=self.show_details)
        self.details_button.pack(pady=5)

    def create_file_tab(self, tab):
        # File Selection
        self.file_label = tk.Label(tab, text="Select File:")
        self.file_label.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.file_path = tk.StringVar()
        self.file_entry = tk.Entry(tab, textvariable=self.file_path, width=40)
        self.file_entry.grid(row=0, column=1, padx=5, pady=5)
        self.file_button = tk.Button(tab, text="Browse", command=self.browse_file)
        self.file_button.grid(row=0, column=2, padx=5, pady=5)

        # Key Input
        self.file_key_label = tk.Label(tab, text="Encryption Key:")
        self.file_key_label.grid(row=1, column=0, padx=5, pady=5, sticky='w')
        self.file_key = tk.StringVar()
        self.file_key_entry = tk.Entry(tab, textvariable=self.file_key, width=40, show="*")
        self.file_key_entry.grid(row=1, column=1, padx=5, pady=5)

        # Encrypt/Decrypt Buttons
        self.encrypt_button = tk.Button(tab, text="Encrypt", command=self.encrypt_file)
        self.encrypt_button.grid(row=2, column=1, padx=5, pady=5, sticky='e')
        self.decrypt_button = tk.Button(tab, text="Decrypt", command=self.decrypt_file)
        self.decrypt_button.grid(row=2, column=2, padx=5, pady=5, sticky='w')

    def create_password_tab(self, tab):
        # Password Length
        self.password_length_label = tk.Label(tab, text="Password Length:")
        self.password_length_label.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.password_length = tk.IntVar(value=12)
        self.password_length_entry = tk.Entry(tab, textvariable=self.password_length, width=5)
        self.password_length_entry.grid(row=0, column=1, padx=5, pady=5, sticky='w')

        # Include Options
        self.include_lower = tk.BooleanVar(value=True)
        self.include_upper = tk.BooleanVar(value=True)
        self.include_digits = tk.BooleanVar(value=True)
        self.include_symbols = tk.BooleanVar(value=True)

        self.lower_check = tk.Checkbutton(tab, text="Lowercase", variable=self.include_lower)
        self.lower_check.grid(row=1, column=0, padx=5, pady=5, sticky='w')
        self.upper_check = tk.Checkbutton(tab, text="Uppercase", variable=self.include_upper)
        self.upper_check.grid(row=1, column=1, padx=5, pady=5, sticky='w')
        self.digits_check = tk.Checkbutton(tab, text="Digits", variable=self.include_digits)
        self.digits_check.grid(row=2, column=0, padx=5, pady=5, sticky='w')
        self.symbols_check = tk.Checkbutton(tab, text="Symbols", variable=self.include_symbols)
        self.symbols_check.grid(row=2, column=1, padx=5, pady=5, sticky='w')

        # Generate Button and Result
        self.generate_button = tk.Button(tab, text="Generate Password", command=self.generate_password)
        self.generate_button.grid(row=3, column=0, columnspan=2, padx=5, pady=5)

        self.password_result = tk.StringVar()
        self.password_entry = tk.Entry(tab, textvariable=self.password_result, width=40, state='readonly')
        self.password_entry.grid(row=4, column=0, columnspan=2, padx=5, pady=5)

    def create_text_tab(self, tab):
        # Text Input/Output
        self.text_input_label = tk.Label(tab, text="Enter Text:")
        self.text_input_label.grid(row=0, column=0, padx=5, pady=5, sticky='w')
        self.text_input = tk.Text(tab, width=40, height=5)
        self.text_input.grid(row=1, column=0, padx=5, pady=5, columnspan=2)

        self.text_key_label = tk.Label(tab, text="Encryption Key:")
        self.text_key_label.grid(row=2, column=0, padx=5, pady=5, sticky='w')
        self.text_key = tk.StringVar()
        self.text_key_entry = tk.Entry(tab, textvariable=self.text_key, width=40, show="*")
        self.text_key_entry.grid(row=2, column=1, padx=5, pady=5)

        self.encrypt_text_button = tk.Button(tab, text="Encrypt Text", command=self.encrypt_text)
        self.encrypt_text_button.grid(row=3, column=0, padx=5, pady=5)
        self.decrypt_text_button = tk.Button(tab, text="Decrypt Text", command=self.decrypt_text)
        self.decrypt_text_button.grid(row=3, column=1, padx=5, pady=5)

        self.text_output_label = tk.Label(tab, text="Result:")
        self.text_output_label.grid(row=4, column=0, padx=5, pady=5, sticky='w')
        self.text_output = tk.Text(tab, width=40, height=5, state='disabled')
        self.text_output.grid(row=5, column=0, padx=5, pady=5, columnspan=2)

    def create_settings_tab(self, tab):
        self.settings_text = tk.Text(tab, width=60, height=15)
        self.settings_text.pack(padx=10, pady=10)

        self.load_button = tk.Button(tab, text="Load Settings", command=self.load_settings)
        self.load_button.pack(side=tk.LEFT, padx=5, pady=5)

        self.save_button = tk.Button(tab, text="Save Settings", command=self.save_settings)
        self.save_button.pack(side=tk.LEFT, padx=5, pady=5)

        self.default_settings = {
            "default_password_length": 16,
            "include_lowercase": True,
            "include_uppercase": True,
            "include_digits": True,
            "include_symbols": True
        }

        self.load_settings()

    def load_settings(self):
        try:
            with open("settings.json", "r") as f:
                settings = json.load(f)
            self.default_settings = settings # Update with loaded settings
        except FileNotFoundError:
            pass # Use default settings

        self.settings_text.delete("1.0", tk.END)
        self.settings_text.insert(tk.END, json.dumps(self.default_settings, indent=4))


    def save_settings(self):
        try:
            settings_data = json.loads(self.settings_text.get("1.0", tk.END))
            with open("settings.json", "w") as f:
                json.dump(settings_data, f, indent=4)
            messagebox.showinfo("Settings Saved", "Settings saved successfully!")
        except json.JSONDecodeError:
            messagebox.showerror("Error", "Invalid JSON format.")
        except Exception as e:
            messagebox.showerror("Error", f"Error saving settings: {e}")

    def browse_file(self):
        filename = filedialog.askopenfilename()
        self.file_path.set(filename)

    def encrypt_file(self):
        file_path = self.file_path.get()
        key = self.file_key.get()

        if not file_path or not key:
            messagebox.showerror("Error", "Please select a file and enter a key.")
            return

        try:
            key = hashlib.sha256(key.encode()).digest()
            with open(file_path, "rb") as f:
                data = f.read()

            encrypted_data = bytearray()
            for i, byte in enumerate(data):
                encrypted_data.append(byte ^ key[i % len(key)])

            with open(file_path + ".enc", "wb") as f:
                f.write(encrypted_data)
            messagebox.showinfo("Success", "File encrypted successfully!")

        except Exception as e:
            messagebox.showerror("Error", f"Encryption failed: {e}")

    def decrypt_file(self):
        file_path = self.file_path.get()
        key = self.file_key.get()

        if not file_path or not key:
            messagebox.showerror("Error", "Please select a file and enter a key.")
            return

        if not file_path.endswith(".enc"):
            messagebox.showerror("Error", "Please select an encrypted file (.enc).")
            return

        try:
            key = hashlib.sha256(key.encode()).digest()
            with open(file_path, "rb") as f:
                data = f.read()

            decrypted_data = bytearray()
            for i, byte in enumerate(data):
                decrypted_data.append(byte ^ key[i % len(key)])

            with open(file_path[:-4], "wb") as f:
                f.write(decrypted_data)
            messagebox.showinfo("Success", "File decrypted successfully!")

        except Exception as e:
            messagebox.showerror("Error", f"Decryption failed: {e}")


    def generate_password(self):
        import secrets
        import string

        length = self.password_length.get()
        include_lower = self.include_lower.get()
        include_upper = self.include_upper.get()
        include_digits = self.include_digits.get()
        include_symbols = self.include_symbols.get()

        characters = ""
        if include_lower:
            characters += string.ascii_lowercase
        if include_upper:
            characters += string.ascii_uppercase
        if include_digits:
            characters += string.digits
        if include_symbols:
            characters += string.punctuation

        if not characters:
            messagebox.showerror("Error", "Please select at least one character type.")
            return

        password = ''.join(secrets.choice(characters) for _ in range(length))
        self.password_result.set(password)

    def encrypt_text(self):
        text = self.text_input.get("1.0", tk.END).strip()
        key = self.text_key.get()

        if not text or not key:
            messagebox.showerror("Error", "Please enter text and a key.")
            return

        try:
            key = hashlib.sha256(key.encode()).digest()
            text_bytes = text.encode('utf-8')
            encrypted_bytes = bytearray()
            for i, byte in enumerate(text_bytes):
                encrypted_bytes.append(byte ^ key[i % len(key)])

            encrypted_text = encrypted_bytes.hex()  # Convert to hexadecimal string
            self.text_output.config(state='normal')  # Enable text widget for editing
            self.text_output.delete("1.0", tk.END)
            self.text_output.insert(tk.END, encrypted_text)
            self.text_output.config(state='disabled')  # Disable text widget again

        except Exception as e:
            messagebox.showerror("Error", f"Encryption failed: {e}")

    def decrypt_text(self):
        text = self.text_input.get("1.0", tk.END).strip()
        key = self.text_key.get()

        if not text or not key:
            messagebox.showerror("Error", "Please enter text and a key.")
            return

        try:
            key = hashlib.sha256(key.encode()).digest()
            encrypted_bytes = bytes.fromhex(text)  # Convert from hexadecimal string
            decrypted_bytes = bytearray()
            for i, byte in enumerate(encrypted_bytes):
                decrypted_bytes.append(byte ^ key[i % len(key)])

            decrypted_text = decrypted_bytes.decode('utf-8')
            self.text_output.config(state='normal')  # Enable text widget for editing
            self.text_output.delete("1.0", tk.END)
            self.text_output.insert(tk.END, decrypted_text)
            self.text_output.config(state='disabled')  # Disable text widget again

        except Exception as e:
            messagebox.showerror("Error", f"Decryption failed: {e}")

    def show_details(self):
        details_text = """
        Visionary Vault is a versatile security tool that offers a range of functionalities:

        1.  **File Encryption/Decryption:** Securely encrypt and decrypt files using a key-based XOR encryption method.
        2.  **Password Generator:** Generate strong, customizable passwords with options for length, lowercase, uppercase, digits, and symbols.
        3.  **Text Encryption/Decryption:** Encrypt and decrypt text messages using a key-based XOR encryption method.
        4.  **Settings Editor:** Allows users to modify default settings (such as password length or character sets) via a JSON editor and save them to a settings.json file.

        This application uses SHA-256 hashing for key strengthening.
        """
        messagebox.showinfo("Details", details_text)

root = tk.Tk()
app = VisionaryVaultApp(root)
root.mainloop()
👁️ Viewed: 8

Comments