Bentornato nel mio blog, oggi ti andrò a mostrare come è possibile criptare e decriptare files in Python sfruttando la libreria “Cryptography” per la crittografia simmetrica.

Ciò che ti mostrerò è un sistema estremamente potente ed altrettanto pericoloso, pertanto non mi assumo responsabilità legate ad un uso improprio di questo sistema.

1. Cos’è la crittografia?

La crittografia è il processo di codifica di un’informazione in modo tale che solo le parti autorizzate possano accedervi. È di fondamentale importanza perché ti consente di proteggere in modo sicuro i dati che non vuoi che nessuno possa vedere o accedervi.

In questo tutorial imparerai ad usare la crittografia simmetrica, il che significa che sarai in possesso di una chiave che sarà utilizzabile per decriptare i file e tornare alla situazione di partenza. Ci sono molti algoritmi di crittografia là fuori, la libreria che useremo è costruita sopra l’ algoritmo AES .

2. Iniziamo col codice

La prima cosa da fare è installare la libreria Cryptography nel tuo ambiente Python, puoi farlo lanciando il seguente comando:

pip install cryptography

Se sei su ambiente Linux o MacOS probabilmente dovrai usare il seguente comando:

pip3 install cryptography

Fatto ciò puoi iniziare a creare un file .py sul quale lavorare, per comodità io ho creato sostanzialmente 2 file: il primo “main.py” ed il secondo “functions.py“.

Nel primo file andrò a scrivere lo script per criptare una stringa di testo mentre nel secondo andrò a scrivere tutte le funzioni necessarie, faccio così per avere un codice più ordinato, nessuno ti vieta di fare tutto nello stesso file.

3. Cript & decript di una stringa

Per prendere familiarità con la libreria conviene fare dei test su semplici stringhe e passare successivamente ad affrontare interi file.

Nel mio file main.py vado a scrivere il seguente codice (dai commenti presenti nel codice puoi capire cosa fa ogni singola riga)

from cryptography.fernet import Fernet
from functions import write_key, load_key


"""
    SCRIPT DI TEST CHE GENERA UNA CHIAVE, LA SALVA IN UN
    FILE CON ESTENSIONE .KEY, CRIPTA UNA STRINGA, LA STAMPA
    ED INFINE LA DECRIPTA MOSTRANDO LA STRINGA ORIGINALE DI PARTENZA
"""

# GENERO IL FILE CON LA CHIAVE
write_key()

# CARICO LA CHIAVE DAL FILE
key = load_key()

# STRINGA CHE VOGLIO CRIPTARE
message = "Messaggio di prova, Hello World !".encode()

# CREO UNA ISTANZA DELLA CLASSE FERNET
f = Fernet(key)

# CRIPTO IL MESSAGGIO E LO STAMPO
encrypted = f.encrypt(message)
print(f"\nLa stringa criptata vale: {encrypted}")

# DECRIPTO IL MESSAGGIO E LO STAMPO
decrypted_encrypted = f.decrypt(encrypted)
print(f"\nLa stringa decriptata vale: {decrypted_encrypted}")

Come avrai notato ci sono 2 funzioni importate dal file functions.py, te le incollo qui di seguito

from cryptography.fernet import Fernet


def write_key():
    # GENERO LA CHIAVE E LA SALVO IN UN FILE
    key = Fernet.generate_key()
    with open("key.key", "wb") as key_file:
        key_file.write(key)


def load_key():
    # CARICO LA CHIAVE DAL FILE
    return open("key.key", "rb").read()

Puoi adesso eseguire lo script e se hai fatto tutto correttamente otterrai il seguente output:

Come sicuramente noterai è stato creato nella stessa cartella il file key.key che contiene la chiave generata per questo esercizio.

4. Cript e decript di un file

Adesso che hai visto come è possibile criptare e successivamente decriptare una stringa, puoi passare al livello successivo: criptare e decriptare interi file.

Il procedimento come vedrai è molto simile a quanto visto in precedenza, sfrutteremo come sempre la chiave generata.

Attenzione a non generare la chiave ad ogni esecuzione degli script, rischi di perdere la chiave di partenza e di conseguenza non potrai più decriptare i file e il loro contenuto sarà perso per sempre.

Ti ho spaventato abbastanza, non perdiamo altro tempo.

La prima cosa che devi fare è creare un nuovo file “cript_file.py” ed incollare il seguente codice:

from cryptography.fernet import Fernet
from functions import write_key, load_key, encrypt

# DECOMMENTA LA RIGA SOTTO SOLO SE è LA PRIMA VOLTA CHE ESEGUI LO SCRIPT E DEVI GENERARE LA CHIAVE
# write_key()

# CARICO LA CHIAVE DAL FILE
key = load_key()

# NOME DEL FILE DA CRIPTARE
FILE = "files/file_prova.txt"

# CRIPTAZIONE DEL FILE SECONDO LA CHIAVE
encrypt(FILE, key)

print(f"{FILE} criptato correttamente")

Alla costante FILE devi associare il file che vuoi venga criptato.

Come puoi inoltre notare devi importare la funzione encrypt dal file functions.py, eccola qui

def encrypt(filename, key):
    """
    DATO IL NOME DI UN FILE, LO CRIPTA E LO RISCRIVE
    """
    f = Fernet(key)
    with open(filename, "rb") as file:
        # LEGGO IL CONTENUTO DEL FILE
        file_data = file.read()
        # CRIPTO IL FILE
        encrypted_data = f.encrypt(file_data)
        # RISCRIVO IL FILE CON IL CONTENUTO CRIPTATO
        with open(filename, "wb") as file:
            file.write(encrypted_data)

Fatto ciò puoi eseguire lo script e noterai che il contenuto del file che hai scelto di criptare sarà completamente illeggibile.

“Ma come faccio a decriptare il file?” ti starai chiedendo sicuramente, bene vediamolo subito.

Crea un nuovo file “decript_file.py” ed incolla quanto segue:

from cryptography.fernet import Fernet
from functions import write_key, load_key, decrypt

# DECOMMENTA LA RIGA SOTTO SOLO SE è LA PRIMA VOLTA CHE ESEGUI LO SCRIPT E DEVI GENERARE LA CHIAVE
# write_key()

# CARICO LA CHIAVE DAL FILE
key = load_key()

# NOME DEL FILE DA DECRIPTARE
FILE = "files/file_prova.txt"

# DECRIPTAZIONE DEL FILE SECONDO LA CHIAVE
decrypt(FILE, key)

print(f"{FILE} decriptato correttamente")

Come prima ti serve importare una funzione, in questo caso la funzione decrypt, eccola qui di sotto

def decrypt(filename, key):
    """
    DATO IL NOME DI UN FILE, LO DECRIPTA E LO RISCRIVE
    """
    f = Fernet(key)
    with open(filename, "rb") as file:
        # LEGGO IL CONTENUTO DEL FILE CRIPTATO
        encrypted_data = file.read()
    # DECRIPTO I DATI
    decrypted_data = f.decrypt(encrypted_data)
    # SCRIVO IL CONTENUTO DECRIPTATO
    with open(filename, "wb") as file:
        file.write(decrypted_data)

Ora esegui lo script e noterai che il file precedentemente criptato tornerà ad essere perfettamente leggibile.

5. Conclusioni

Ti ho mostrato un metodo veloce per criptare e decriptare file in Python, il mondo della crittografia è un mondo vastissimo che include tantissime tecniche diverse e che sicuramente vale la pena di approfondire.

Se hai dubbi o domande non esitare a lasciare un commento qui sotto, ciao e alla prossima 🙂


2 commenti

giulio · 11 Agosto 2021 alle 13:38

Ciao, se provo ad eseguire ‘from functions import write_key, load_key’, mi da il seguente errore:
Traceback (most recent call last):
File “C:\Users\Notebook\Desktop…”, line 7, in
from functions import write_key, load_key
File “C:\Users\Notebook\AppData\Local\Packages…”, line 68
nodes = tuple(map(lambda (k, v): process_node(inner, k, v),
^
SyntaxError: invalid syntax

    fabiobiffi · 18 Agosto 2021 alle 11:31

    che versione di python hai installato? prova con una più recente

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *