Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .idea/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/PyEveryday.iml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/inspectionProfiles/Project_Default.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/inspectionProfiles/profiles_settings.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

13 changes: 13 additions & 0 deletions .idea/material_theme_project_new.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

7 changes: 7 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions .idea/modules.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

97 changes: 97 additions & 0 deletions backend/scripts/security/file_encrypt_decrypt.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
import tkinter as tk
from tkinter import filedialog
import re
import getpass
from cryptography.fernet import Fernet
import base64
import hashlib
import os


def select_file():
root = tk.Tk()
root.withdraw()
file_path = filedialog.askopenfilename(
title="Select file to encrypt/decrypt"
)
return file_path


def get_password_type():
print("Choose password type:")
print("1. Alphabetic")
print("2. Numeric")
print("3. Alphanumeric")
while True:
option = input("Enter option (1/2/3): ").strip()
if option in ["1", "2", "3"]:
return option
print("Invalid option. Try again.")


def get_password(option):
while True:
pwd = getpass.getpass("Enter password: ")
if option == "1" and re.fullmatch(r"[A-Za-z]+", pwd):
return pwd
elif option == "2" and re.fullmatch(r"\d+", pwd):
return pwd
elif option == "3" and re.fullmatch(r"[A-Za-z0-9]+", pwd):
return pwd
print("Invalid password format. Try again.")


def derive_key(password):
key = hashlib.sha256(password.encode()).digest()
return base64.urlsafe_b64encode(key)


def encrypt_file(file_path, key):
with open(file_path, "rb") as f:
data = f.read()
fernet = Fernet(key)
encrypted = fernet.encrypt(data)
out_path = file_path + ".enc"
with open(out_path, "wb") as f:
f.write(encrypted)
print(f"File encrypted: {out_path}")


def decrypt_file(file_path, key):
with open(file_path, "rb") as f:
data = f.read()
fernet = Fernet(key)
try:
decrypted = fernet.decrypt(data)
except Exception:
print("Decryption failed. Wrong password or corrupted file.")
return
out_path = file_path.replace(".enc", ".dec")
with open(out_path, "wb") as f:
f.write(decrypted)
print(f"File decrypted: {out_path}")


def main():
print("Choose action:")
print("1. Encrypt")
print("2. Decrypt")
action = input("Enter option (1/2): ").strip()
if action not in ["1", "2"]:
print("Invalid action.")
return
file_path = select_file()
if not file_path:
print("No file selected.")
return
pwd_type = get_password_type()
password = get_password(pwd_type)
key = derive_key(password)
if action == "1":
encrypt_file(file_path, key)
else:
decrypt_file(file_path, key)


if __name__ == "__main__":
main()
80 changes: 40 additions & 40 deletions ui/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions ui/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,19 @@
"lint": "next lint"
},
"dependencies": {
"next": "^15.5.2",
"react": "19.1.0",
"react-dom": "19.1.0",
"next": "15.4.5"
"react-dom": "19.1.0"
},
"devDependencies": {
"typescript": "^5",
"@eslint/eslintrc": "^3",
"@tailwindcss/postcss": "^4",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"@tailwindcss/postcss": "^4",
"tailwindcss": "^4",
"eslint": "^9",
"eslint-config-next": "15.4.5",
"@eslint/eslintrc": "^3"
"tailwindcss": "^4",
"typescript": "^5"
}
}