Crittografia e Decrittografia di File in Python: Guida Completa

Nell’era dell’informazione digitale, la sicurezza dei dati è diventata una priorità assoluta. Molti prodotti software utilizzano la tecnologia di crittografia dei dati per mantenere al sicuro i dati degli utenti. La crittografia gioca un ruolo fondamentale nella protezione delle informazioni, garantendo che solo coloro che ne hanno il diritto possano accedervi.

La crittografia è il processo di codifica dei dati utilizzando una chiave segreta in modo che solo gli utenti con diritti speciali per decifrarli possano accedervi. Il processo di crittografia protegge i tuoi dati sensibili. È importante criptare i file che memorizzano informazioni sensibili come password, token, ecc. I dati rimarranno segreti anche se un programma maligno dovesse accedere a tali file o se il dispositivo venisse rubato. Quando si trasferiscono i dati tra i dispositivi o quando si inviano al server, è possibile che si verifichino delle fughe di notizie. La crittografia aiuta a proteggerli.

Questo articolo ti mostrerà come criptare e decriptare un file in Python. Inoltre, imparerai a conoscere metodi alternativi che rendono la crittografia e la decrittografia dei file più semplice e veloce, mantenendo la sicurezza.

Crittografia Simmetrica con Python: La Libreria Fernet

Python dispone di una libreria di crittografia con la quale puoi criptare e decriptare i tuoi file. Questa libreria implementa l’algoritmo di crittografia simmetrica AES e utilizza la stessa chiave per criptare e decriptare i dati. L'intero processo di cifratura che vedremo si basa sull'algoritmo Fernet, che di fatto è un'implementazione di AES128 in modalità CBC, con SHA256 utilizzato come algoritmo di hash per l'HMAC. Se tutti questi acronimi suonano sconosciuti, ci basti sapere che l'algoritmo è sufficientemente sicuro.

I metodi che implementano l’algoritmo di crittografia si trovano nel modulo Fernet. Importalo nel tuo file Python: from cryptography.fernet import Fernet. Ora puoi iniziare il processo di crittografia.

Leggi anche: Consigli per un Giardino Selvaggio

Generazione della Chiave e Gestione delle Password

Per prima cosa, devi generare una chiave. La chiave generata è unica; non sarà possibile ottenerla di nuovo. La stessa chiave viene utilizzata per la crittografia e la decrittografia, per questo è importante salvarla. In caso contrario, non sarai in grado di decifrare i tuoi dati criptati.

Il codice appena visto crea una chiave di cifratura casuale, sfruttando il metodo generate_key(). La chiave così generata è una sequenza di byte (e non una stringa, come qualcuno potrebbe erroneamente ipotizzare), che è quindi passata al costruttore della classe Fernet per generare l'oggetto cipher_suite, che utilizzeremo per la cifratura (e la decifratura) vera e propria: per farlo, ricorriamo rispettivamente ai metodi encrypt e decrypt. Si noti che il metodo encrypt accetta ancora una volta una sequenza di byte, e non una stringa.

Fin qui sembra tutto semplice, ma ci sono alcuni dettagli che, sebbene possano sembra banali, possono complicare ulteriormente il codice. Non tutte le password, infatti, sono pronte per essere utilizzate. Piuttosto, dobbiamo utilizzare una funzione di derivazione della chiave che trasformi la nostra password in un formato opportuno. La funzione seguente restituisce una chiave compatibile con le restrizioni richieste dall'implementazione di Fernet che stiamo utilizzando.

import base64, hashlibimport getpassimport osdef crea_password(pswd): hlib = hashlib.md5() hlib.update(pswd.encode("utf-8")) return base64.urlsafe_b64encode(hlib.hexdigest().encode('utf8'))

Si noti che la funzione appena utilizzata ha 2 parametri: il primo rappresenta la nostra password (codificata come sequenza di byte), mentre il secondo parametro è il cosiddetto salt. L'utilizzo del salt non rende più sicuro l'algoritmo di cifratura, ma complica eventuali attacchi a dizionario, rendendo di fatto più sicura ed imprevedibile la nostra password. Abbiamo visto finora come generare una password, ma l'obiettivo è arrivare a cifrare un file di testo.

Esempio Pratico: Cifratura e Decifratura di un File

Quello che andremo a realizzare sarà un semplice programma da Terminale, dove ci siano due opzioni, una per criptare e una per decriptare il file. Cominciamo col creare la base del nostro programma, che si svolgerà tutto in un ciclo while infinito.

Leggi anche: Scegliere le Pavimentazioni Autobloccanti Ideali

while True: print("-- programma di crittografia dei file --") print("1. critta file") print("2. decritta file") print("0. esci") try: scelta = int(input("scelta: ")) except: print("ERRORE! Scelta non valida!") scelta = -1 if scelta == 0: break if scelta == 1: file = input("file: ") pswd = getpass.getpass("password: ") if os.path.isfile(file): with open(file,"rb") as fp: dati = fp.read() chiave = crea_password(pswd) fernet = Fernet(chiave) dati_crittati = fernet.encrypt(dati) with open(file,"wb") as fp: fp.write(dati_crittati) print("File criptato con successo!") else: print("ERRORE! Impossibile trovare il file") if scelta == 2: file = input("file: ") pswd = getpass.getpass("password: ") if os.path.isfile(file): with open(file,"rb") as fp: dati = fp.read() chiave = crea_password(pswd) fernet = Fernet(chiave) dati_decrittati = fernet.decrypt(dati) with open(file,"wb") as fp: fp.write(dati_decrittati) print("File decriptato con successo!") else: print("ERRORE! Impossibile trovare il file")

Compreso in che modo cifrare e decifrare una stringa, il passaggio ai file di testo è abbastanza immediato: basta sfruttare le funzionalità di gestione dei file disponibili di default con Python. Infine, salva i dati criptati in un file. Puoi sovrascrivere i dati nel file originale, come mostrato nell’esempio, oppure scriverli in un nuovo file.

Crittografia Avanzata con pyAesCrypt

Un'altra potente opzione per la crittografia in Python è il modulo `pyAesCrypt`. Che cos’è `pyAesCrypt`? È un modulo Python 3 per cifrare/decifrare file e stream binari con AES-256 in modalità CBC.

Algoritmo e Modalità

Quale algoritmo e modalità usa? AES-256 (chiave a 256 bit) in modalità CBC (Cipher Blocker Chaining). Il CBC è una forma avanzata di cifratura a blocchi. Con la crittografia in modalità CBC, ogni blocco di testo cifrato dipende da tutti i blocchi di testo in chiaro elaborati fino a quel momento. CBC: ogni blocco dipende dai precedenti + IV casuale → niente pattern evidenti.

Parametri e Sicurezza

  • `bufferSize`: A cosa serve `bufferSize`? È la dimensione del buffer per I/O durante cifratura/decifratura (es. 64 KB). Buffer → mantieni un valore ragionevole (es. 64 KB) per bilanciare velocità e consumo RAM.
  • Password: Quanto conta la password? Moltissimo. Usa una passphrase lunga (12-16+ caratteri), con maiuscole, minuscole, numeri e simboli. Evita il riuso password e valuta un password manager. Per file molto sensibili, aggiungi un secondo fattore.
  • Compatibilità: Posso cifrare qualunque file? Sì. `pyAesCrypt` opera su stream binari: documenti, immagini, archivi, video, ecc.
  • Sicurezza della password: È sicuro salvare la password nel codice? No. Meglio chiederla all’utente (input/GUI), leggerla da variabile d’ambiente o da un secret manager.
  • Integrazione GUI: Posso integrarlo con Tkinter? Certo. Usa filedialog.askopenfilename() per scegliere i file e collega i pulsanti ai metodi encryptFile/decryptFile.

file binari

Riepilogo Comparativo: `cryptography.fernet` vs `pyAesCrypt`

Sebbene entrambi offrano soluzioni robuste per la crittografia, le due librerie presentano alcune differenze chiave:

Caratteristica cryptography.fernet pyAesCrypt
Algoritmo Principale AES-128 (CBC) + HMAC SHA256 AES-256 (CBC)
Lunghezza Chiave 128 bit (derivata da password) 256 bit (derivata da password)
Gestione Chiavi Generazione chiave casuale o derivazione da password/salt Derivazione da password
Semplicità d'uso API di alto livello per crittografia simmetrica Focalizzato su stream binari e file
Parametri Aggiuntivi Richiede gestione del salt separatamente per password bufferSize per I/O ottimizzato
Flessibilità Buona per stringhe e file generici Ideale per qualsiasi stream binario (documenti, immagini, video)

Quello visto fin qui è la base per poter cifrare file con Python. Ovviamente, però, cryptography non è il solo modulo che permette di fare questa cosa: altre possibilità sono infatti rappresentate da PyCrypto ed i GPGME Python bindings, ognuno dei quali implementa funzionalità leggermente diverse ma che permettono di arrivare a soluzioni praticamente simili a quella fin qui presentata.

Leggi anche: Vantaggi e prezzi delle staccionate in legno

Crittografia XOR in Python

In questo tutorial, esploreremo come creare uno strumento per cifrare immagini e file di testo utilizzando l’encryption XOR e il linguaggio di programmazione Python.

I Fondamenti dell'Operatore XOR

XOR è un’abbreviazione di “eXclusive OR” ed è un’operazione logica binaria che produce un risultato vero (1) se e solo se gli input sono diversi. In altre parole: se hai due bit, il risultato dell’operazione XOR sarà 1 se uno dei bit è 1 e l’altro è 0; in caso contrario, il risultato sarà 0. Il motivo per cui l’operatore XOR è così utile nella crittografia è che, quando applicato due volte con la stessa chiave, restituisce il valore originale. Questa proprietà ci permette di utilizzare una chiave per cifrare un messaggio e poi utilizzare la stessa chiave per decifrarlo.

Applicazione alla Crittografia di Immagini e Testi

Ora che abbiamo compreso i fondamenti dell’operatore XOR, possiamo applicarlo alla crittografia di immagini e file di testo. Nel caso delle immagini, l’idea è di utilizzare l’operatore XOR per mescolare i valori dei pixel con la chiave di crittografia. Per i file di testo, il processo è simile: applichiamo l’operatore XOR ai valori ASCII dei caratteri nel testo e alla chiave di crittografia.

La Chiave e il Concetto di One-Time Pad

Successivamente, creiamo un array per la chiave di crittografia convertendo la chiave fornita in byte. A seconda del tipo di input (immagine o testo), creiamo una matrice chiave con una forma appropriata. Se il dato di input è un’immagine a colori, la matrice chiave sarà una matrice tridimensionale, altrimenti sarà bidimensionale. La matrice chiave viene creata tramite il metodo np.tile per espandere la chiave in modo da adattarla alle dimensioni del dato di input. Se si utilizza una chiave lunga esattamente quanto il messaggio, e la chiave viene utilizzata una sola volta, è l’algoritmo più sicuro del mondo. È inattaccabile. E prende il nome di One-Time Pad.

Attraverso una serie di passaggi e spiegazioni dettagliate, impareremo a creare un’applicazione con interfaccia grafica (GUI) che ti consentirà di selezionare un’immagine o un file di testo, inserire o generare una chiave di crittografia e salvare il risultato in un file criptato. Abbiamo visto come utilizzare il nostro Python3 con interfaccia grafica (Tkinter) per creare un programma che ci permette di ricercare una stringa all'interno di un file. Come editor di testo ti consiglio Visual Studio Code, gratuito e che offre molte funzionalità per ottimizzare i tempi di sviluppo.

Questo eseguibile che abbiamo sviluppato insieme può essere molto utile a livello formativo, ad esempio potresti provare a criptare un’immagine, e ti renderesti conto di qual è il limite più grande della crittografia XOR quando la chiave non è abbastanza lunga (o meglio, non è lunga esattamente quanto i bit dell’immagine). Se grazie a questo articolo, ti è scattata la scintilla da sviluppatore, e vuoi iniziare a cimentarti con python…beh, forka lo script e modificalo come meglio credi!

Metodo Alternativo: Crittografia con UltraEdit

Esistono anche modi alternativi per criptare/decriptare i file. Puoi farlo senza utilizzare una sola riga di codice. UltraEdit è un editor di testo flessibile, potente e sicuro che offre molte funzioni utili per modificare il testo, lavorare con i file, personalizzare i temi e altro ancora. Una funzione molto importante e utile è la possibilità di criptare e decriptare i file.

UltraEdit ti permette di eseguire il processo di crittografia e decrittografia in modo semplice e veloce. Per farlo, devi seguire solo pochi semplici passi. Puoi selezionare uno o più file da crittografare in UltraEdit. Successivamente, seleziona la voce di menu File -> Encryption -> Encrypt file. Nella finestra di dialogo aperta, dovrai inserire una passphrase per criptare il file. Importante! Devi ricordare o salvare la passphrase, poiché non viene memorizzata nel sistema. Se la dimentichi, non sarai più in grado di decriptare il file. Dopo la crittografia, viene creato un file .UENC. Se esiste già un file crittografato con lo stesso nome, UltraEdit può sostituirlo. Criptare e decriptare i file con UltraEdit richiede un tempo minimo e non richiede la conoscenza di tecnologie complesse. Allo stesso tempo, UltraEdit mantiene i tuoi dati al sicuro.

tags: #python #criptazione #a #staccionata