Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - programma di criptazione/decriptazione
Forum - Algoritmi - programma di criptazione/decriptazione

Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo
Avatar
piergiac (Normal User)
Rookie


Messaggi: 21
Iscritto: 23/08/2024

Segnala al moderatore
Postato alle 15:29
Mercoledì, 04/09/2024
Questo topic è stato chiuso dal moderatore

Apro questo post anche se non ho avuto molto seguito nel post aperto precedentemente in cui mi avrebbe fatto piacere confrontare le varie idee sulla criptazione.

Questo programma di cassaforte è open source e utilizza due sistemi di criptazione, fernet e GC57. Fernet immagino lo conosciate un po’ tutti, mentre il GC57 no. Il GC57, più che un sistema di criptazione, è un nuovissimo algoritmo di fattorizzazione con capacità straordinarie che riesce a fattorizzare semiprimi in meno di un secondo indipendentemente dalla sua grandezza. Il programma che sto per presentare, per esempio, utilizza per quanto riguarda la codifica eseguita nella parte GC57, dei semiprimi a 5000bit. Se volete sapere di più su questa formidabile capacità del GC57, troverete tutte le informazioni sul sito www.gc57crypto.net dove viene presentata la sua scoperta con tanto di esempi e documentazione.

Ma torniamo al programma. Sicuramente non riuscirò a spiegare tutto e perciò mi auguro che chi è interessato ad usarlo ponga le sua domande e sarò ben lieto di rispondere.

Il programma, come dicevo, è open source, perciò libero di essere modificato o usato per i propri scopi personali. E’ scritto in Python e quello che io fornirò sarà lo script in chiaro così oltre che a usarlo lo potrete anche studiare, se siete interessati al suo funzionamento. Per farlo funzionare bisogna avere installato Python, che sia su windows o linux, o mac, non ha importanza, l’importante è l’installazione delle librerie richieste che vengono richiamate all’interno del programma. Poi può anche essere compilato in eseguibile, se uno vuole, e usato su più computer senza dover installare Python su ogni computer. Io personalmente lo uso compilato, anche per nascondere la password d’entrata, e lo uso con delle cartelle nel cloud così da avere tutti i dati, documenti, file, foto, o quant’altro, a mia disposizione su qualsiasi computer e in qualsiasi località mi trovo.

All’inizio il programma crea un piccolo file .cfg dove chiede di mostrargli dove prendere i file da criptare e dove li deve depositare. Dentro la cartella che noi abbiamo indicato al programma di dove prendere i file o i dati da criptare, andiamo a inserire a mano tutti i file o documenti che intendiamo proteggere. Sono due cartelle create a priori che nel mio caso sono sul cloud sincronizzate con tutti i miei pc, nel vostro caso dove volete, e potrebbe essere anche su una USB. Questo viene fatto solo una volta, a meno che il file .cfg non venga cancellato. Nell’avvio normale, viene chiesta la password, che si trova ovviamente in chiaro dentro il programma, e viene chiesto di inserire una USB, impostata per default ma che può essere cambiata anche con il programma compilato. Di questa USB ne parliamo dopo ma sappiate che senza quella il programma non funziona.

Nella cartella dove il programma prende i file o dati da criptare, andiamo a mettere tutti quelli che noi vogliamo proteggere, qualsiasi sia il dato da proteggere.

Sempre alla prima esecuzione il programma avvisa che non è stato trovato nessun database nella cartella che gli abbiamo indicato e ci chiederà di proseguire senza per crearne uno nuovo.

A questo punto clicchiamo su apri file nella parte cripta file e selezioniamo uno ad uno i file che vogliamo criptare. Il file verrà criptato con il sistema fernet il quale creerà una chiave simile: “HhdPOWgPzUsT7urPK_5iGb8yEDpQKE7kuK-63DOYUmE=” che verrà poi memorizzata in un database abbinata al file criptato. Questo file con l’estensione finale .crp verrà creato e depositato nella cartella da noi impostata e il file originale verrà cancellato in modo definitivo per non lasciare la possibilità di recuperarlo eventualmente da un cestino. Ogni volta che verrà processato, criptato un file, il database si aggiornerà e verranno tenuti catalogati tutti i file per data, estensione, e nome con cui sono stati memorizza, oltre che naturalmente alla chiave fernet sempre diversa e abbinata solo a quel file.

Siamo a metà dell’opera. I file sono al sicuro dentro una cartella e ora non ci rimane che chiudere il programma con la X in alto a destra che questo procederà a criptare il database con dentro tutte le chiavi e i riferimenti ai file.

Naturalmente da ora in avanti possiamo, tramite il programma, visualizzare i file criptati, aggiungerne dei nuovi o cancellare quelli che non ci servono più, e ogni volta che verrà modifica il database verrà di nuovo criptato con un codice sempre diverso.

Dicevo all’inizio che il programma ha bisogno di leggere su USB un file che contiene la chiave per il GC57. Se questo file non viene trovato il programma non parte. Il contenuto del file è di tipo questo.

762835762534762537654726542789988973
21
19
23
10000
225
5006
389
482
429
260
427


Lo potete usare come prova se volete sperimentare il programma. Nel caso vi piaccia vi dirò come creare da soli il vostro codice chiave in modo da averlo solo voi. Naturalmente anche in questo caso la cosa è totalmente gratuita e open source.

Il file si deve chiamare, sempre nel caso lo voleste provare, dati_cassaforte_crp.txt, e deve essere creato su una USB. Create il file e copiateci dentro quei dati.

Non starò a spiegarvi come funziona il GC57, per il motivo descritto sopra, ma posso dire che le chiavi per la criptazione/decriptazione del database le prende dai semiprimi a 5000bit che devono essere fattorizzati in due numeri primi di circa 2500bit, cosa assai complicata. Se vi state chiedendo quanto vale un bit, sappiate che un numero intero del peso di 2500bit è composto da 753 cifre.

Spero di non essere stato noioso.

Codice sorgente - presumibilmente Python

  1. # Cassaforte criptata ultima modifica Maggio 2024
  2. import tkinter as tk
  3. from tkinter import filedialog
  4. from cryptography.fernet import Fernet
  5. import os
  6. from tkinter import messagebox
  7. import customtkinter as tkc
  8. from tkinter import messagebox
  9. import time
  10. import locale
  11. from tkinter import simpledialog
  12. from math import gcd
  13. from sympy import nextprime
  14. import hashlib
  15. from random import randint, seed
  16.  
  17. T = int(time.time())
  18. seed(T)
  19.  
  20. locale.setlocale(locale.LC_TIME, "it_IT")
  21.  
  22.  
  23. # ****************************************************
  24. # **            Password
  25. # ****************************************************
  26. def hash_password(password):
  27.     salt = os.urandom(32)
  28.     hashed_password = hashlib.pbkdf2_hmac(
  29.         "sha256", password.encode("utf-8"), salt, 100000
  30.     )
  31.     hashed_password_hex = salt.hex() + hashed_password.hex()
  32.     return hashed_password_hex
  33.  
  34.  
  35. def verify_password(input_password, stored_password):
  36.     salt = bytes.fromhex(stored_password[:64])
  37.     hashed_input_password = hashlib.pbkdf2_hmac(
  38.         "sha256", input_password.encode("utf-8"), salt, 100000
  39.     )
  40.     return stored_password[64:] == hashed_input_password.hex()
  41.  
  42.  
  43. def get_password_from_user():
  44.     def toggle_password():
  45.         if show_password_var.get():
  46.             entry.config(show="")
  47.         else:
  48.             entry.config(show="*")
  49.  
  50.     def submit():
  51.         nonlocal password
  52.         password = entry.get()
  53.         #password_dialog.destroy()
  54.         dialog.destroy()
  55.     password = None
  56.     dialog = tk.Tk()
  57.     dialog.withdraw()
  58.  
  59.     password_dialog = tk.Toplevel(dialog)
  60.     password_dialog.title("Password")
  61.  
  62.     screen_width = password_dialog.winfo_screenwidth()
  63.     screen_height = password_dialog.winfo_screenheight()
  64.  
  65.     x = (screen_width - 200) // 2
  66.     y = (screen_height - 130) // 2
  67.  
  68.     password_dialog.configure(bg="#2F4F4F")
  69.     password_dialog.geometry(f"200x130+{x}+{y}")
  70.  
  71.     tk.Label(password_dialog, text="Inserisci la password:", bg="#2F4F4F").pack(pady=5)
  72.  
  73.     entry = tk.Entry(password_dialog, show="*", width=30)
  74.     entry.pack(pady=5)
  75.  
  76.     show_password_var = tk.BooleanVar()
  77.     show_password_checkbox = tk.Checkbutton(
  78.         password_dialog,
  79.         text="Mostra password",
  80.         variable=show_password_var,
  81.         bg="#2F4F4F",
  82.         command=toggle_password,
  83.     )
  84.     show_password_checkbox.pack()
  85.  
  86.     submit_button = tk.Button(password_dialog, text="OK", bg="#228B22", command=submit)
  87.     submit_button.pack(pady=5)
  88.  
  89.     # Registra la funzione exit_handler per essere eseguita quando la finestra viene chiusa
  90.     password_dialog.protocol("WM_DELETE_WINDOW", exit_handler)
  91.  
  92.     dialog.mainloop()
  93.  
  94.     return password
  95.  
  96.  
  97. def exit_handler():
  98.     quit()
  99.  
  100.  
  101. password = "12345"
  102. hashed_password = hash_password(password)
  103.  
  104. input_password = get_password_from_user()
  105.  
  106. if verify_password(input_password, hashed_password):
  107.     pass
  108. else:
  109.     messagebox.showerror("Errore", "La password inserita è errata.")
  110.     quit()
  111.  
  112. # *******************************************************
  113. # * controllo file CFG
  114. # *******************************************************
  115.  
  116. filecfg = "CsCfg"
  117. if os.path.exists(filecfg):
  118.     pass
  119. else:
  120.  
  121.     def esci_pr():
  122.         risposta=messagebox.askquestion("Attenzione","Il programma sta per essere\nchiuso per mancanza dei dati richiesti\nsi vuole continuare?")
  123.         if risposta=="yes":
  124.             rootcfg.destroy()
  125.             quit()
  126.         else:
  127.             return                
  128.            
  129.     def salva_esci():
  130.  
  131.         controllo1 = e2_cfg.get()
  132.         if controllo1 == "":
  133.             messagebox.showerror("Attenzione:", "Tutti i campi devono essere compilati")
  134.             return
  135.         elif os.path.exists(f"{controllo1}"):
  136.             pass
  137.         else:
  138.             messagebox.showerror("Attenzione:", "La cartella INVIO non esiste")
  139.             return
  140.  
  141.         controllo2 = e3_cfg.get()
  142.         if controllo2 == "":
  143.             messagebox.showerror("Attenzione:", "Tutti i campi devono essere compilati")
  144.             return
  145.         elif os.path.exists(f"{controllo2}"):
  146.             pass
  147.         else:
  148.             messagebox.showerror("Attenzione:", "La cartella RICEVE non esiste")
  149.             return
  150.  
  151.         scrivi = open("CsCfg", "w")
  152.         scrivi.write(controllo1 + "\n")
  153.         scrivi.write(controllo2 + "\n")
  154.         scrivi.close()
  155.         messagebox.showinfo("Salvataggi CFG:", "Configurazione Salvata")
  156.         rootcfg.destroy()
  157.  
  158.     rootcfg = tk.Tk()
  159.  
  160.     # Imposta le dimensioni della finestra
  161.     window_width = 415
  162.     window_height = 330
  163.  
  164.     # Ottieni le dimensioni dello schermo
  165.     screen_width = rootcfg.winfo_screenwidth()
  166.     screen_height = rootcfg.winfo_screenheight()
  167.  
  168.     # Calcola la posizione x e y per centrare la finestra
  169.     x = (screen_width - window_width) // 2
  170.     y = (screen_height - window_height) // 2
  171.  
  172.     # Imposta la posizione e le dimensioni della finestra
  173.     rootcfg.geometry(f"{window_width}x{window_height}+{x}+{y}")
  174.     rootcfg.title("Configurazione Cartelle GC57")
  175.     rootcfg.configure(bg="#458B74")
  176.     colore_testo_entry = "#104E8B"
  177.     testo = (
  178.         "Se appare questa finestra è perchè il programma viene eseguito per la prima volta in questa posizione, \
  179. oppure il file 'CsCfg' è stato cancellato\n\
  180. Copiare e incollare con CTR-V la posizione delle cartelle:",
  181.     )
  182.  
  183.     l1_cfg = tk.Label(
  184.         rootcfg, text=testo, justify=tk.LEFT, font="arial 12 bold", wraplength=400
  185.     )
  186.     l1_cfg.place(x=10, y=20)
  187.  
  188.     px = 10
  189.     py = 150
  190.     l2_cfg = tk.Label(
  191.         rootcfg,
  192.         text="Incollare Indirizzo Cartella Cassaforte",
  193.         bg="#458B74",
  194.         font="arial 12 bold",
  195.     )
  196.     l2_cfg.place(x=px, y=py)
  197.     py = py + 20
  198.     e2_cfg = tk.Entry(rootcfg, width=40, fg=colore_testo_entry, font="arial 12")
  199.     e2_cfg.place(x=px, y=py)
  200.  
  201.     py = py + 30
  202.     l3_cfg = tk.Label(
  203.         rootcfg,
  204.         text="Incollare Indirizzo Cartella DCP",
  205.         bg="#458B74",
  206.         font="arial 12 bold",
  207.     )
  208.     l3_cfg.place(x=px, y=py)
  209.     py = py + 20
  210.     e3_cfg = tk.Entry(rootcfg, width=40, fg=colore_testo_entry, font="arial 12")
  211.     e3_cfg.place(x=px, y=py)
  212.  
  213.     px = px + 150
  214.     py = py + 50
  215.     b1 = tk.Button(
  216.         rootcfg,
  217.         text="Salva ed Esci",
  218.         font="arial 12 bold",
  219.         cursor="hand1",
  220.         bg="green",
  221.         command=salva_esci,
  222.     )
  223.     b1.place(x=px, y=py)
  224.     rootcfg.protocol("WM_DELETE_WINDOW", esci_pr)
  225.  
  226.     rootcfg.mainloop()
  227.  
  228. # *******************************************************
  229. # * Carica CFG
  230. # *******************************************************
  231. filename = ""
  232. apricfg = open("CsCfg", "r")
  233. cartella2 = apricfg.readline().strip()
  234. cartella1 = apricfg.readline().strip()
  235. apricfg.close()
  236.  
  237.  
  238. # *******************************************************
  239. # * Controllo porta USB
  240. # *******************************************************
  241. apri_dati = simpledialog.askstring("USB", "Inserisci la porta USB se diversa da D")
  242. if apri_dati == None:
  243.     quit()
  244.  
  245. if not apri_dati:
  246.     apri_dati = "d"
  247. usb_path = apri_dati + ":\\"
  248.  
  249. if os.path.exists(usb_path):
  250.     try:
  251.         storage_devices = os.listdir(usb_path)
  252.     except FileNotFoundError:
  253.         pass
  254. else:
  255.     messagebox.showwarning(
  256.         "Attenzione", "Chiavetta USB non trovata nella lettera di unità " + apri_dati
  257.     )
  258.     quit()
  259.  
  260. # ****************************************************
  261. # **  Cerca nella USB i dati di criptazione GC57
  262. # ****************************************************
  263.  
  264. file_path = os.path.join(apri_dati + ":", "dati_cassaforte_crp.txt")
  265.  
  266. try:
  267.     with open(file_path, "r") as leggif:
  268.         leggi1 = leggif.readline().strip()
  269.         leggi2 = leggif.readline().strip()
  270.         leggi3 = leggif.readline().strip()
  271.         leggi4 = leggif.readline().strip()
  272.         leggi5 = leggif.readline().strip()
  273.         leggi6 = leggif.readline().strip()
  274.         leggi7 = leggif.readline().strip()
  275.         m1 = int(leggif.readline())
  276.         m2 = int(leggif.readline())
  277.         m3 = int(leggif.readline())
  278.         m4 = int(leggif.readline())
  279.         m5 = int(leggif.readline())
  280. except FileNotFoundError:
  281.     messagebox.showerror("Errore", "Dati su USB non trovati")
  282.     quit()
  283.  
  284. # ****************************************************
  285. # ** Vede se c'è il file criptato delle chiavi per decriptarlo
  286. # ****************************************************
  287.  
  288. path = cartella2 + "/database_chiavi.cr"
  289. if os.path.exists(path):
  290.     leggi = open(path, "r")
  291.     n_semiprimo = leggi.readline()
  292.     testo_criptato = leggi.readline()
  293.     leggi.close()
  294.     n_semiprimo = n_semiprimo.strip()
  295.  
  296.     testo_criptato = testo_criptato.strip()
  297.     chiave = int(leggi1) ** int(leggi2)
  298.     n_semiprimo = int(n_semiprimo)
  299.     a = n_semiprimo % chiave
  300.     b = n_semiprimo - a
  301.     for i in range(10):
  302.         r = gcd(b, a)
  303.         if r != 1:
  304.             break
  305.         a = a + chiave
  306.         b = b - chiave
  307.     if r == 1:
  308.         messagebox.showerror("Attenzione", "Chiave GC57 errata")
  309.         quit()
  310.     start1 = str(r)
  311.     start2 = len(start1)
  312.     start = int(start1[start2 - 5] + start1[start2 - 4])
  313.     ln = list(str(r))
  314.     if len(ln) % 2 == 0:
  315.         pass
  316.     else:
  317.         ln.append("0")
  318.  
  319.     divln = []
  320.     for i in range(0, len(ln), 2):
  321.         c1 = int(ln[i])
  322.         c2 = int(ln[i + 1])
  323.         c3 = c1 * 10 + c2
  324.         divln.append(c3)
  325.  
  326.     te = []
  327.     d0 = list(testo_criptato)
  328.     for i in range(0, len(d0), 3):
  329.         d1 = d0[i]
  330.         d2 = d0[i + 1]
  331.         d3 = d0[i + 2]
  332.         te.append(d1 + d2 + d3)
  333.     cont = start
  334.     tdecript = ""
  335.     for i in range(len(te)):
  336.         if cont >= len(divln):
  337.             cont = 0
  338.         x = int(divln[cont])
  339.         if x >= 0 and x < 25:
  340.             y = int(te[i])
  341.             tdecript = tdecript + (chr(y - x - m1))
  342.         if x >= 25 and x < 40:
  343.             y = int(te[i])
  344.             tdecript = tdecript + (chr(y - x - m2))
  345.         if x >= 40 and x < 50:
  346.             y = int(te[i])
  347.             tdecript = tdecript + (chr(y - x - m3))
  348.         if x >= 50 and x < 75:
  349.             y = int(te[i])
  350.             tdecript = tdecript + (chr(y - x - m4))
  351.         if x >= 75 and x < 100:
  352.             y = int(te[i])
  353.             tdecript = tdecript + (chr(y - x - m5))
  354.         cont = cont + 1
  355.     path = cartella1 + "/database_chiavi.txt"
  356.     scrivi = open(path, "w")
  357.     scrivi.write(str(tdecript) + "\n")
  358.     scrivi.close()
  359. else:
  360.     risposta = messagebox.askquestion(
  361.         "Attenzione",
  362.         "Il database_chiavi è stato rimosso\no non ancora creato\nsi vuole proseguire",
  363.     )
  364.     if risposta == "yes":
  365.         pass
  366.     else:
  367.         quit()
  368.  
  369. # ****************************************************
  370. # ** Esce dal programma e cripta il database delle chiavi fernet
  371. # ****************************************************
  372.  
  373.  
  374. def esci():
  375.     if lmodifica.cget("text") == "O":
  376.         scegli = messagebox.askquestion(
  377.             "Uscita Programma",
  378.             "Il database chiavi non è stato modificato\nVuoi Cancellare tutti i file decriptati?",
  379.         )
  380.         if scegli == "yes":
  381.             cartella = cartella1
  382.             for elemento in os.listdir(cartella):
  383.                 percorso_elemento = os.path.join(cartella, elemento)
  384.  
  385.                 if os.path.isfile(percorso_elemento):
  386.                     os.remove(percorso_elemento)
  387.             window.destroy()
  388.             quit()
  389.         else:
  390.             cancella = cartella1 + "/database_chiavi.txt"
  391.             if os.path.exists(cancella):
  392.                 os.remove(cancella)
  393.             window.destroy()
  394.             quit()
  395.  
  396.     messagebox.showinfo(
  397.         "Uscita Programma",
  398.         "Lasciare che il programma esegua la criptazione delle chiavi",
  399.     )
  400.     path = cartella1 + "/database_chiavi.txt"
  401.     testo = ""
  402.     apri = open(path, "r")
  403.     for i in range(10000):
  404.         te = apri.readline()
  405.         if te == "\n" or te == "":
  406.             apri.close()
  407.             break
  408.         testo = testo + te
  409.     testo = testo.strip()
  410.     p = int(leggi1) ** int(leggi3)
  411.     q = int(leggi1) ** int(leggi4)
  412.     nd = nextprime(p + randint(1, int(leggi5) * 2 ** int(leggi6)))
  413.     nd2 = nextprime(q + randint(1, int(leggi5) * 2 ** int(leggi6)))
  414.     n = nd * nd2
  415.     # ******************* controllo di fattorizzazione
  416.     chiave = int(leggi1) ** int(leggi2)
  417.     a = n % chiave
  418.     b = n - a
  419.     for i in range(10):
  420.         r = gcd(a, b)
  421.         if r != 1:
  422.             break
  423.         else:
  424.             a = a + chiave
  425.             b = b - chiave
  426.     if r == 1:
  427.         messagebox.showerror("Attenzione", "Test non superato: Riprovare")
  428.         return
  429.     # ******************* fine controllo
  430.     start1 = str(nd)
  431.     start2 = len(start1)
  432.     start = int(start1[start2 - 5] + start1[start2 - 4])
  433.     ln = list(str(nd))
  434.     if len(ln) % 2 == 0:
  435.         pass
  436.     else:
  437.         ln.append("0")
  438.     divln = []
  439.     for i in range(0, len(ln), 2):
  440.         c1 = int(ln[i])
  441.         c2 = int(ln[i + 1])
  442.         c3 = c1 * 10 + c2
  443.         divln.append(c3)
  444.  
  445.     text = testo
  446.     te = list(text)
  447.     cont = start
  448.     tcript = ""
  449.  
  450.     for i in range(len(text)):
  451.         if cont >= len(divln):
  452.             cont = 0
  453.         if ord(te[i]) > 700:
  454.             pass
  455.         else:
  456.             x = int(divln[cont])
  457.             if x >= 0 and x < 25:
  458.                 x = x + m1 + ord(te[i])
  459.             if x >= 25 and x < 40:
  460.                 x = x + m2 + ord(te[i])
  461.             if x >= 40 and x < 50:
  462.                 x = x + m3 + ord(te[i])
  463.             if x >= 50 and x < 75:
  464.                 x = x + m4 + ord(te[i])
  465.             if x >= 75 and x < 100:
  466.                 x = x + m5 + ord(te[i])
  467.             tcript = tcript + str(x)
  468.             cont = cont + 1
  469.  
  470.     path = cartella2 + "/database_chiavi.cr"
  471.     scrivi = open(path, "w")
  472.     scrivi.write(str(n) + "\n")
  473.     scrivi.write(tcript + "\n")
  474.     scrivi.close()
  475.     messagebox.showinfo("OK", "Database memorizzato con GC57 correttamente")
  476.     path = cartella2 + "/database_chiavi.cr"
  477.     cancella = cartella1 + "/database_chiavi.txt"
  478.     if os.path.exists(path):
  479.         os.remove(cancella)
  480.     else:
  481.         pass
  482.  
  483.     cartella = cartella1
  484.  
  485.     elementi_cartella = os.listdir(cartella)
  486.  
  487.     file_nella_cartella = any(
  488.         os.path.isfile(os.path.join(cartella, elemento))
  489.         for elemento in elementi_cartella
  490.     )
  491.  
  492.     if file_nella_cartella:
  493.         risposta = messagebox.askquestion(
  494.             "Cartella DCP", "Ci sono dei dati decodificati\nVuoi Eliminarli?"
  495.         )
  496.         if risposta == "yes":
  497.             for elemento in os.listdir(cartella):
  498.                 percorso_elemento = os.path.join(cartella, elemento)
  499.                 if os.path.isfile(percorso_elemento):
  500.                     os.remove(percorso_elemento)
  501.  
  502.     window.destroy()
  503.  
  504.  
  505. # ****************************************************
  506. # **        Cancella file criptati
  507. # ****************************************************
  508. def cancella_cr():
  509.     initial_dir = cartella2
  510.     filename = filedialog.askopenfilename(
  511.         initialdir=initial_dir,
  512.         filetypes=(("File Criptato", "*.crp"), ("File Criptato", "*.crp")),
  513.     )
  514.     nome_file = os.path.split(filename)
  515.     risposta = messagebox.askquestion("Vuoi cancellare questo file??", nome_file)
  516.     if risposta == "yes":
  517.         pass
  518.     else:
  519.         return
  520.     nome_database = nome_file[1].replace(".crp", "")
  521.     database = []
  522.     trovato = 0
  523.     apri = open(cartella1 + "/database_chiavi.txt", "r")
  524.     for i in range(10000):
  525.         leggi_database = apri.readline()
  526.         if leggi_database == "\n" or leggi_database == "":
  527.             apri.close()
  528.             break
  529.         if nome_database in leggi_database:
  530.             trovato = 1
  531.             pass
  532.         else:
  533.             leggi_database = leggi_database.strip()
  534.             database.append(leggi_database)
  535.     database.append("fine")
  536.     if trovato == 0:
  537.         messagebox.showerror("Cancella file criptato", "Nessun dato trovato")
  538.         return
  539.     lmodifica.configure(text="M")
  540.  
  541.     apri = open(cartella1 + "/database_chiavi.txt", "w")
  542.     for i in range(10000):
  543.         if database[i] == "fine":
  544.             apri.close()
  545.             break
  546.         apri.write(database[i] + "\n")
  547.     cancella = cartella2 + "/" + nome_file[1]
  548.     os.remove(cancella)
  549.     messagebox.showinfo("Cancella file criptao:", "File cancellato con successo")
  550.  
  551.  
  552. # ****************************************************
  553. # **             Generazione codice fernet
  554. # ****************************************************
  555. def generate_key_if_not_exists(key_filename):
  556.     if not os.path.exists(key_filename):
  557.         key = generate_key()
  558.         save_key(key, key_filename)
  559.     else:
  560.         key = load_key(key_filename)
  561.     return key
  562.  
  563.  
  564. def generate_key():
  565.     return Fernet.generate_key()
  566.  
  567.  
  568. def save_key(key, filename):
  569.     with open(filename, "wb") as key_file:
  570.         key_file.write(key)
  571.  
  572.  
  573. def load_key(filename):
  574.     return open(filename, "rb").read()
  575.  
  576.  
  577. def encrypt_file(key, input_file, output_file):
  578.     cipher = Fernet(key)
  579.  
  580.     with open(input_file, "rb") as file:
  581.         data = file.read()
  582.  
  583.     encrypted_data = cipher.encrypt(data)
  584.  
  585.     with open(output_file, "wb") as file:
  586.         file.write(encrypted_data)
  587.  
  588.  
  589. def decrypt_file(key, input_file, output_file):
  590.     cipher = Fernet(key)
  591.  
  592.     with open(input_file, "rb") as file:
  593.         encrypted_data = file.read()
  594.  
  595.     decrypted_data = cipher.decrypt(encrypted_data)
  596.  
  597.     with open(output_file, "wb") as file:
  598.         file.write(decrypted_data)
  599.  
  600.  
  601. def choose_file(entry_widget):
  602.     initial_dir = cartella1
  603.     filename = filedialog.askopenfilename(
  604.         initialdir=initial_dir,
  605.         filetypes=(
  606.             ("Tutti i File", "*.*"),
  607.             ("File di testo", "*.txt"),
  608.             ("File eseguibile", "*.exe"),
  609.             ("File Video", "*.mpeg *.mpg *.mkw *.mp4"),
  610.             ("File Audio", "*.mp3 *.wav *.flac "),
  611.             ("File Immagini", "*.jpg *.jpeg *.jpe *.webp *.ico *.png *.xcf *.bmp"),
  612.             ("File Libreoffice", "*.odt *.ods *.odg *.odf"),
  613.         ),
  614.     )
  615.     nome_file = os.path.split(filename)
  616.     entry_widget.delete(0, tk.END)
  617.     entry_widget.insert(0, nome_file[1])
  618.  
  619.  
  620. def choose_file2(entry_widget):
  621.     initial_dir = cartella2
  622.     filename = filedialog.askopenfilename(
  623.         initialdir=initial_dir,
  624.         filetypes=(("File Criptato", "*.crp"), ("File Criptato", "*.crp")),
  625.     )
  626.     nome_file = os.path.split(filename)
  627.     entry_widget.delete(0, tk.END)
  628.     entry_widget.insert(0, nome_file[1])
  629.  
  630.  
  631. # ****************************************************
  632. # **  crea i dati per criptare il file
  633. # ****************************************************
  634.  
  635.  
  636. def on_encrypt():
  637.     file_to_encrypt = e1.get()
  638.     if file_to_encrypt == "":
  639.         messagebox.showerror("Errore:", "Nessun file selezionato")
  640.         return
  641.     if file_to_encrypt == "database_chiavi.txt":
  642.         messagebox.showinfo("File criptato come: ", "questo file non si può criptare")
  643.         e1.delete(0, "end")
  644.         return
  645.     output_filename = cartella2 + "/" + file_to_encrypt + ".crp"
  646.  
  647.     if os.path.exists(output_filename):
  648.         messagebox.showerror(
  649.             "Cripta File:",
  650.             "questo file esiste già e non può essere sostituito\ncancellare prima il file se lo si vuole sostituire",
  651.         )
  652.         return
  653.     lmodifica.configure(text="M")
  654.  
  655.     nome_file = file_to_encrypt
  656.     file_to_encrypt = cartella1 + "/" + file_to_encrypt
  657.     key = generate_key()
  658.  
  659.     encrypt_file(key, file_to_encrypt, output_filename)
  660.     # os.remove(file_to_encrypt)
  661.     data = time.strftime("%A:%B:%Y")
  662.     memorizza_key = key.decode("utf-8") + "," + nome_file + "," + str(data)
  663.     apri_file_key = open(cartella1 + "/database_chiavi.txt", "a")
  664.     apri_file_key.write(memorizza_key + "\n")
  665.     apri_file_key.close()
  666.     messagebox.showinfo("File criptato come: ", output_filename)
  667.     e1.delete(0, "end")
  668.     path = output_filename
  669.     cancella = file_to_encrypt
  670.     if os.path.exists(path):
  671.         os.remove(cancella)
  672.     else:
  673.         pass
  674.  
  675.  
  676. # ****************************************************
  677. # **  crea i dati per decriptare il file
  678. # ****************************************************
  679.  
  680.  
  681. def on_decrypt():
  682.     file_to_decrypt = e2.get()
  683.     if file_to_decrypt == "":
  684.         messagebox.showerror("Errore:", "Nessun file selezionato")
  685.         return
  686.     nome_originale = e2.get().replace(".crp", "")
  687.     apri = open(cartella1 + "/database_chiavi.txt", "r")
  688.     for i in range(1000):
  689.         stringa = apri.readline()
  690.         stringa = stringa.strip()
  691.         if stringa == "\n" or stringa == "":
  692.             messagebox.showinfo("Ricerca Codice:", "Nessun codice Trovato")
  693.             apri.close()
  694.             return
  695.         trovata = nome_originale in stringa
  696.         if trovata == True:
  697.             sp = stringa.split(",")
  698.             chiave = sp[0].encode("utf-8")
  699.             apri.close()
  700.             break
  701.  
  702.     original_filename = cartella1 + "/" + file_to_decrypt.replace(".crp", "")
  703.     file_to_decrypt = cartella2 + "/" + file_to_decrypt
  704.  
  705.     decrypt_file(chiave, file_to_decrypt, original_filename)
  706.     e2.delete(0, "end")
  707.     messagebox.showinfo("File decriptato come:", original_filename)
  708.  
  709.  
  710. # ****************************************************
  711. # **  Interfaccia principale customtkinter
  712. # ****************************************************
  713.  
  714. # Modes: system (default), light, dark
  715. tkc.set_appearance_mode("dark")
  716. # Themes: blue (default), dark-blue, green
  717. tkc.set_default_color_theme("blue")
  718. window = tkc.CTk()  # create CTk window like you do with the Tk window
  719. window.geometry("460x250")
  720. window.title("Cripta/Decripta Metodo Fermat 128bit/GC57")
  721. # Creazione degli elementi nella finestra
  722. px = 50
  723. e1 = tkc.CTkEntry(window, width=300, font=("Helvetica", 12), justify=tkc.CENTER)
  724. e1.place(x=px, y=10)
  725. b1 = tkc.CTkButton(
  726.     master=window,
  727.     width=50,
  728.     text="Apri file",
  729.     fg_color="blue",
  730.     hover_color="green",
  731.     command=lambda: choose_file(e1),
  732. )
  733. b1.place(x=px + 320, y=10)
  734. b2 = tkc.CTkButton(
  735.     master=window,
  736.     width=300,
  737.     text="Cripta File",
  738.     fg_color="blue",
  739.     hover_color="green",
  740.     command=on_encrypt,
  741. )
  742. b2.place(x=px, y=40)
  743.  
  744. py = 100
  745. e2 = tkc.CTkEntry(window, width=300, font=("Helvetica", 12), justify=tkc.CENTER)
  746. e2.place(x=px, y=py)
  747. b3 = tkc.CTkButton(
  748.     master=window,
  749.     width=300,
  750.     text="Decripta file",
  751.     fg_color="blue",
  752.     hover_color="green",
  753.     command=on_decrypt,
  754. )
  755. b3.place(x=px, y=py + 30)
  756. b4 = tkc.CTkButton(
  757.     master=window,
  758.     width=50,
  759.     text="Apri file",
  760.     fg_color="blue",
  761.     hover_color="green",
  762.     command=lambda: choose_file2(e2),
  763. )
  764. b4.place(x=px + 320, y=py)
  765. lmodifica = tkc.CTkLabel(
  766.     master=window, text="O", fg_color="transparent", font=("arial", 12, "bold")
  767. )
  768. lmodifica.place(x=10, y=py + 70)
  769. b5 = tkc.CTkButton(
  770.     master=window,
  771.     width=300,
  772.     text="Elimina un file criptato e aggiorna il Database",
  773.     fg_color="blue",
  774.     hover_color="red",
  775.     command=cancella_cr,
  776. )
  777. b5.place(x=px, y=py + 100)
  778.  
  779.  
  780. window.protocol("WM_DELETE_WINDOW", esci)
  781.  
  782. window.mainloop()



PRg
PM
Avatar
Ultimo (Member)
Guru


Messaggi: 931
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 10:40
Giovedì, 05/09/2024
Ciao, lo vorrei testare, allega qui un file compresso del codice per poterlo compilare.
Potresti tradurlo in Csharp?
Magari usando Copilot, si riesce a tradurlo


If ok Then GOTO Avanza else GOTO Inizia

PM
Avatar
Ultimo (Member)
Guru


Messaggi: 931
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 10:47
Giovedì, 05/09/2024
Ciao, ho capito il funzionamento del codice da come lo hai spiegato, la chiavetta USB se te la rubano sarebbe utilizzabile
dal criminale o ha un sistema di sicurezza anche lei?


If ok Then GOTO Avanza else GOTO Inizia

PM
Avatar
Ultimo (Member)
Guru


Messaggi: 931
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 10:53
Giovedì, 05/09/2024
Oltre alla USB, si richiede anche la lettura dell'impronta digitale per maggiore sicurezza


If ok Then GOTO Avanza else GOTO Inizia

PM
Avatar
piergiac (Normal User)
Rookie


Messaggi: 21
Iscritto: 23/08/2024

Segnala al moderatore
Postato alle 12:13
Giovedì, 05/09/2024
ciao
Per quanto riguarda la sicurezza ci sono varie strade. Naturalmente la chiave è parte fondamentale di questa sicurezza e come tutte le chiavi deve essere tenuta al sicuro. Ti faccio un esempio pratico: supponi che ti rubano le chiavi di casa, la prima cosa che farai è quella di cambiare la serratura ottenendo così una chiave nuova. Naturalmente per fare questo hai comunque bisogno di una seconda chiave per entrare e sostituirla, caso contrario devi rompere tutto. Questo programma utilizza un tools separato che effettua proprio questa sostituzione. Anche in questo caso devi però avere una chiave di scorta per poter aprire il tuo archivio e procedere alla sostituzione. Praticamente prende tutto l'archivio e lo sostituisce con delle nuove chiavi creando una nuova USB. In questo caso non c'è bisogno eseguirlo su file per file perchè agisce sull'intero archivio. Il nuovo archivio non sarà più decriptato con la vecchia chiave.

Per questo motivo io consiglio di tenere una copia della chiave in un luogo sicuro che nel caso di perdita della USB o perchè è stata rubata, si procede velocemente a sostituire la chiave

Per quanto riguarda la USB, ne esistono varie sul mercato comprese quelle che, a un costo notevolmente superiore, necessitano di impronta digitale o di password per essere aperte.

Questo procedimento di sostituzione della chiave può essere fatto anche senza necessità, solo al fine di aumentare la sicurezza.

Vorrei anche spendere qualche parola sulla sicurezza informatica. Il livello di sicurezza aumenta in base a quello che vuoi proteggere. Quando si tratta di documenti personali come carta d'identità, patente, foto, documenti per la casa, etc... Non preoccupiamoci troppo perchè interessa veramente a pochi hacker. Diventa più il costo di tentare di decifrare la chiave che il valore che è contenuto in esso. Per quanto riguarda invece i conti bancari e i codici, qui dobbiamo stare più tranquilli e cambiare chiavi è un ottima soluzione a questa tranquillità.


  


PRg
PM
Avatar
piergiac (Normal User)
Rookie


Messaggi: 21
Iscritto: 23/08/2024

Segnala al moderatore
Postato alle 12:25
Giovedì, 05/09/2024
Testo quotato

Postato originariamente da Ultimo:

Ciao, lo vorrei testare, allega qui un file compresso del codice per poterlo compilare.
Potresti tradurlo in Csharp?
Magari usando Copilot, si riesce a tradurlo



Io non conosco Csharp e dubito che copilot riesca a tradurre lo script di Python in quanto è molto complesso.
Io se vuoi te lo posso passare compilato in .exe ma per problemi derivanti dalla compilazione fatta da Pyinstaller per trasformarlo in .exe, viene rilevato da alcuni antivirus come spyware e per tanto bloccato. La cosa è segnalata su GitHub ma gli autori del programma auto-py-to-exe grantiscono che non ci sono assolutamente spyware all'interno della compilazione e che questi sono falsi positivi che vengono segnalat. Puoi verificare tu stesso digitando github auto-py-to-exe

in alternativa ti posso aiutare nell'installazione di python e delle rispettive librerie che necessita e farlo girare in chiaro e al limite convertirlo in .exe tu stesso. Tieni presente che anche se il programma girasse in chiaro non rivelerebbe la chiave usata per criptare, e senza questa chiave sarebbe impossibile decriptare. Il problema è se vuoi usare il programma su più computer e questo ti porterebbe inevitabilmente a installare python su tutti questi computer

Ultima modifica effettuata da piergiac il 05/09/2024 alle 12:35


PRg
PM
Avatar
Ultimo (Member)
Guru


Messaggi: 931
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 12:44
Giovedì, 05/09/2024
OK, per tradurlo  bisogna conoscere bene i due Linguaggi, io me la cavo con il C#, meno con il Python
anche se è abbastanza comprensibile e simile ad altri Linguaggi di alto Livello.

Dovrei utilizzare un IDE per Python quale mi consigli ;)


If ok Then GOTO Avanza else GOTO Inizia

PM
Avatar
piergiac (Normal User)
Rookie


Messaggi: 21
Iscritto: 23/08/2024

Segnala al moderatore
Postato alle 13:42
Giovedì, 05/09/2024
Io personalmente utilizzo VScode ma python già possiede un suo Ide nell'installazione principale. Non molto adatto a creare programmi simili ma comunque funzionale per farli girare.


PRg
PM
Avatar
Ultimo (Member)
Guru


Messaggi: 931
Iscritto: 22/05/2010

Segnala al moderatore
Postato alle 16:07
Giovedì, 05/09/2024
Ciao, cosa ti ha spinto a creare questo programma, pensi che si possa renderlo ancora più sicuro in futuro?
magari non basando la sicurezza di decriptazione solo sulla forza bruta delle macchine, che sono stupide pur per quanto potenti.

Ultima modifica effettuata da Ultimo il 05/09/2024 alle 16:09


If ok Then GOTO Avanza else GOTO Inizia

PM
Pagine: [ 1 2 3 4 5 ] Precedente | Prossimo