import tkinter as tk
from tkinter import messagebox, simpledialog, ttk, Listbox
from cryptography.fernet import Fernet
import json
import os
import pyperclip
import random
import string
def generate_key():
key = Fernet.generate_key()
with open("secret.key", "wb") as key_file:
key_file.write(key)
def load_key():
return open("secret.key", "rb").read()
def encrypt_password(password):
key = load_key()
f = Fernet(key)
return f.encrypt(password.encode())
def decrypt_password(encrypted_password):
key = load_key()
f = Fernet(key)
return f.decrypt(encrypted_password).decode()
def save_data(data):
with open('passwords.json', 'w') as file:
json.dump(data, file)
def load_data():
if os.path.exists('passwords.json'):
with open('passwords.json', 'r') as file:
try:
return json.load(file)
except json.JSONDecodeError:
messagebox.showwarning("Hata", "Veri dosyası geçersiz. Yeniden oluşturulacak.")
return {}
return {}
def generate_random_password(length=12, use_special_chars=True):
characters = string.ascii_letters + string.digits
if use_special_chars:
characters += string.punctuation
return ''.join(random.choice(characters) for _ in range(length))
def set_master_password():
master_password = simpledialog.askstring("Ana Şifre Belirle", "Yeni ana şifre:")
if master_password:
encrypted_master_password = encrypt_password(master_password)
with open("master_password.json", "w") as file:
json.dump({"master_password": encrypted_master_password.decode()}, file)
messagebox.showinfo("Başarılı", "Ana şifre başarıyla ayarlandı.")
else:
messagebox.showwarning("Uyarı", "Lütfen bir ana şifre girin.")
def check_master_password():
master_password = simpledialog.askstring("Ana Şifre", "Ana şifreyi girin:")
with open("master_password.json", "r") as file:
data = json.load(file)
if decrypt_password(data["master_password"].encode()) == master_password:
return True
else:
messagebox.showwarning("Uyarı", "Ana şifre yanlış.")
return False
def add_password():
website = simpledialog.askstring("Yeni Şifre Ekle", "Web sitesi:")
if website:
password = generate_random_password()
encrypted_password = encrypt_password(password)
data = load_data()
data[website] = {"password": encrypted_password.decode(), "note": ""}
save_data(data)
messagebox.showinfo("Başarılı", f"Şifre başarıyla oluşturuldu!\nWeb Site: {website}\nŞifre: {password}")
else:
messagebox.showwarning("Uyarı", "Lütfen bir web sitesi girin.")
def view_passwords():
if check_master_password():
data = load_data()
if not data:
messagebox.showinfo("Bilgi", "Henüz eklenmiş bir şifre yok.")
return
password_listbox.delete(0, tk.END)
for website, info in data.items():
decrypted_password = decrypt_password(info["password"].encode())
password_listbox.insert(tk.END, f"Site : {website}")
password_listbox.insert(tk.END, f"Şifre : {decrypted_password}")
password_listbox.insert(tk.END, "--------------")
else:
messagebox.showwarning("Uyarı", "Ana şifre yanlış.")
def delete_password():
website = simpledialog.askstring("Şifre Sil", "Silinecek web sitesi:")
if website:
data = load_data()
if website in data:
del data[website]
save_data(data)
messagebox.showinfo("Başarılı", f"{website} için şifre silindi.")
else:
messagebox.showwarning("Uyarı", "Belirtilen web sitesi bulunamadı.")
else:
messagebox.showwarning("Uyarı", "Lütfen bir web sitesi girin.")
def copy_password():
selected = password_listbox.curselection()
if selected:
website = password_listbox.get(selected[0]).split(': ')[1]
data = load_data()
if website in data:
decrypted_password = decrypt_password(data[website]['password'].encode())
pyperclip.copy(decrypted_password)
messagebox.showinfo("Başarılı", f"{website} şifresi kopyalandı.")
else:
messagebox.showwarning("Hata", "Şifre bulunamadı.")
else:
messagebox.showwarning("Hata", "Lütfen bir site seçin.")
def search_password():
search_term = simpledialog.askstring("Şifre Ara", "Aranacak siteyi girin:")
if search_term:
data = load_data()
password_listbox.delete(0, tk.END)
for website, info in data.items():
if search_term.lower() in website.lower():
decrypted_password = decrypt_password(info["password"].encode())
password_listbox.insert(tk.END, f"Site : {website}")
password_listbox.insert(tk.END, f"Şifre : {decrypted_password}")
password_listbox.insert(tk.END, "--------------")
else:
messagebox.showwarning("Hata", "Bir site ismi girin.")
def toggle_dark_mode():
if root.cget('bg') == '#f0f0f0':
root.configure(bg="#333")
password_listbox.configure(bg="#555", fg="white")
else:
root.configure(bg="#f0f0f0")
password_listbox.configure(bg="white", fg="black")
def main_interface():
global root, password_listbox
root = tk.Tk()
root.title("Ana Şifre ile Şifre Yöneticisi")
root.geometry("400x500")
root.configure(bg="#f0f0f0")
password_listbox = Listbox(root, width=50, height=10)
password_listbox.pack(pady=20)
ttk.Button(root, text="Yeni Şifre Ekle", command=add_password).pack(pady=5)
ttk.Button(root, text="Şifreleri Görüntüle", command=view_passwords).pack(pady=5)
ttk.Button(root, text="Şifre Sil", command=delete_password).pack(pady=5)
ttk.Button(root, text="Şifreyi Kopyala", command=copy_password).pack(pady=5)
ttk.Button(root, text="Şifre Ara", command=search_password).pack(pady=5)
ttk.Button(root, text="Koyu Mod", command=toggle_dark_mode).pack(pady=5)
root.mainloop()
if not os.path.exists("secret.key"):
generate_key()
if not os.path.exists("master_password.json"):
set_master_password()
if check_master_password():
main_interface()
else:
messagebox.showwarning("Uyarı", "Yanlış ana şifre. Program kapatılıyor.")