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);
}
}