Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Come cifrare e decifrare un file in Java

Impariamo ad utilizzare le funzionalità di javax.crypto per cifrare e decifrare un file di testo con il linguaggio di programmazione Java.
Impariamo ad utilizzare le funzionalità di javax.crypto per cifrare e decifrare un file di testo con il linguaggio di programmazione Java.
Link copiato negli appunti

In moltissime applicazioni di varia natura, può sorgere la necessità di cifrare un file di testo sfruttando una password, mediante la quale è anche possibile decifrare e riottenere le informazioni originali.

Esistono varie possibilità per implementare un meccanismo di questo tipo, ma non tutte garantiscono una affidabilità sufficiente. Inoltre, essere in grado di implementare questa cosa in Java ci garantisce un ampio campo di applicazione: dalle applicazioni server, alle interfacce grafiche, fino alle app mobile (si pensi, ad esempio, ad Android).

In questo approfondimento vedremo un semplice modo per cifrare e decifrare un file di testo, utilizzando il package javax.crypto.

Cifratura e Decifratura

La nostra discussione sarà basata su un semplice snippet proposto da Matteo Puffo. In sostanza, utilizzeremo un'unica funzione che possa essere utilizzata sia per la cifratura che per la decifratura.

Partiamo subito dal codice, che commenteremo subito dopo:

private static void execCryptDecrypt(int cipherMode, String key, File inputFile, File outputFile) {
    try {
        // Generazione della chiave
        Key secretKey = new SecretKeySpec(key.getBytes(), "AES");
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(cipherMode, secretKey);
        // Lettura del file
        byte[] inputBytes;
        try (FileInputStream inputStream = new FileInputStream(inputFile)) {
            inputBytes = new byte[(int) inputFile.length()];
            inputStream.read(inputBytes);
        }
        // Generazione del file di output
        byte[] outputBytes = cipher.doFinal(inputBytes);
        try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
            outputStream.write(outputBytes);
        }
    } catch (NoSuchPaddingException | NoSuchAlgorithmException
            | InvalidKeyException | BadPaddingException
            | IllegalBlockSizeException | IOException e) {
        e.printStackTrace();
    }
}

Nel codice precedente, creiamo innanzitutto un oggetto di classe Key, partendo da una stringa (rappresentante la nostra "password"), e specificando l'algoritmo di riferimento (in questo caso AES). Creiamo quindi un oggetto Cipher, sfruttando anche in questo caso lo stesso tipo di algoritmo di cifratura (AES), ed inizializziamolo tramite il metodo init().

Le righe successive leggono il file di origine, memorizzandone il contenuto in un array di byte. Questo è quindi passato al metodo doFinal del nostro oggetto cipher, che si occuperà di cifrare il file di origine nel modo opportuno.

Si intuisce, quindi, che la generazione del file è abbastanza semplice. Non resta che capire come utilizzare il metodo appena definito:

public static void main(String args[]) {
    String password = "HTML.it";
    File inputFile = new File("test.txt");
    File encryptedFile = new File("test.encrypted");
    File decryptedFile = new File("test-decrypted.txt");
    //Cifratura
    execCryptDecrypt(Cipher.ENCRYPT_MODE, password, inputFile, encryptedFile);
    //Decifratura
    execCryptDecrypt(Cipher.DECRYPT_MODE, password, encryptedFile, decryptedFile);
}

Come si vede, il metodo execCryptDecrypt è utilizzabile sia per la cifratura (Cipher.ENCRYPT_MODE) sia per la decifratura (Cipher.DECRYPT_MODE).
Si può verificare il corretto funzionamento di questo codice confrontando il file originale (text.txt) con l'ultimo file generato (test-decrypted.txt): se tutto ha funzionato correttamente, tali file coincideranno in tutto e per tutto.

Il codice completo dell'esempio visto in questa lezione è disponibile sul blog di Matteo Puffo.


Ti consigliamo anche