Programma per cifratura file

di il
3 risposte

Programma per cifratura file

Salve,

ho implementato un programma per criptare un file .txt denominato “testo.txt”, con l' aiuto di alcuni esempi su Internet. Tuttavia, non riesco a capire a cosa serva l' istruzione inputStream.read(inputBytes).

Mi spiego meglio: per definizione il metodo read () accetta come parametro un array di byte e legge il suo contenuto. In questo caso, però, sembra che l'array venga popolato al momento dell' esecuzione del metodo. Infatti, facendo il debug ho riscontrato che  l'istruzione “inputBytes = new byte[(int) inputFile.length()];” ovviamente crea l'array di Byte specificando la grandezza pari alla lunghezza del contenuto del file. Successivamente quando viene eseguita l' istruzione contente il metodo read() questo array viene popolato con i valori delle corrispondenti lettere in formato ASCII. 

A questo punto mi domando: perchè invece di leggere l' array questo metodo scrive contenuti all' interno di esso?

Ecco a voi il codice:

package Crittografia;
import javax.crypto.*;
import java.security.*;
import iaik.security.provider.IAIK;
import java.io.*;
public class CriptaFile {
        public static void criptaFile(int criptaMode,Key k, File inputFile, File outputFile){
                try{
                       Cipher aes =  Cipher.getInstance("AES"); //creo il cifratore
                       aes.init(criptaMode,k); // iniziallizzo il cifratore in modalità criptazione o decriptazione e gli do la chiave
                        byte[] inputBytes=null;
                        try (FileInputStream inputStream = new FileInputStream(inputFile)) {
                                inputBytes = new byte[(int) inputFile.length()];
                                inputStream.read(inputBytes);
                        }catch(Exception e){
                                System.out.println("Errore generazione file");
                        }

                        byte[] outputBytes = aes.doFinal(inputBytes);
                        try (FileOutputStream outputStream = new FileOutputStream(outputFile)) {
                                outputStream.write(outputBytes);
                        }catch(Exception e){
                                System.out.println("Errore generazione file");
                        }

                }catch(NoSuchPaddingException | IllegalBlockSizeException | NoSuchAlgorithmException | BadPaddingException | InvalidKeyException e){
                        System.out.println("Errore! ");
                }

        }
        public static void main(String[] args){
            System.out.println("Aggiungo il proivder IAIK... Attendi ");
            IAIK provider = new IAIK();
            Security.addProvider(provider);
            System.out.println("Aggiunta riuscita.");
            KeyGenerator gen = null; //creazione del generatore di chiavi
            try {
                gen = KeyGenerator.getInstance("AES");
            } catch (NoSuchAlgorithmException e) {
                e.printStackTrace();
                System.out.println("Algoritmo non supportato in KeyGenerator");
                System.exit(1);
            }

            gen.init(new SecureRandom()); //genero la chiave
            Key k = gen.generateKey();

            File inputFile = new File("testo.txt");
            File encryptedFile = new File("testo.encrypted");
            File decryptedFile = new File("testo-decriptato.txt");
            CriptaFile.criptaFile(Cipher.ENCRYPT_MODE,k,inputFile,encryptedFile);
            CriptaFile.criptaFile(Cipher.DECRYPT_MODE,k,encryptedFile,decryptedFile);
        }
}

3 Risposte

  • Re: Programma per cifratura file

    Read() legge i byte dallo stream (il file in questo caso) e li salva nell'array infatti, altrimenti leggerebbe tutti zeri…

    L'array è il buffer sul quale verranno fatte le operazioni di crittografia (XOR con la chiave eccetera) e poi verrà salvato tutto in un nuovo file

  • Re: Programma per cifratura file

    Il metodo read() di un oggetto di tipo InputStream non scrive nell'array di byte passato come parametro, ma legge i dati dalla sorgente e li inserisce nell'array. In pratica, l'array viene usato come "contenitore" temporaneo per i dati letti dal file. In questo modo, è possibile lavorare con i dati del file in modo più efficiente, senza doverli leggere a uno a uno.

    Nel tuo caso, l'array inputBytes viene creato con una dimensione pari alla lunghezza del file, quindi viene passato come parametro al metodo read() dell'oggetto inputStream. Il metodo read() legge i dati dal file e li inserisce nell'array, quindi l'array viene popolato con i valori delle corrispondenti lettere del file in formato ASCII.

    Spero di esserti stato d'aiuto!

  • Re: Programma per cifratura file

    Vi ringrazio per le risposte! 

    Avevo già intuito quanto avete specificato,ma non ero sicuro al 100% ragion per cui ho deciso di scrivere questo forum. 

Devi accedere o registrarti per scrivere nel forum
3 risposte