[Java] Decrittazione File

di il
4 risposte

[Java] Decrittazione File

Salve a tutti, avrei bisogno di aiuto... anche perché a causa di Cipher.update mi viene davvero difficile trovare una risposta al mio dubbio. (su google mi trova tutto ciò che ha a che fare con gli aggiornamenti... ovviamente)

Mi sto esercitando con la crittazione e decrittazione di un file, nel mio libro è spiegata solo la crittazione e pensavo che la decrittazione fosse analoga... Ma pare che mi sbagliassi.

Questo è un esercizio base, giusto per capire il funzionamento base:
Creo gli oggetti necessari, keygenerator, SecretKey, Cipher, ecc.
Prende il file crittatto, correttamente, Prova.crypto.txt e vorrei che creasse un file "Elemento.txt" con il testo decrittato. Ho letto che per crittare un file bisogna farlo in un ciclo con un metodo Cipher.update( byte[], int i, int salto) (nell'esempio del libro viene fatta la crittazione a blocchi di 5, con salto = 5 dunque)
public static void Decrittazione() throws InvalidKeyException, IOException, NoSuchAlgorithmException, NoSuchPaddingException{
        final int TOKEN_LENGHT = 5;
        KeyGenerator keygen = KeyGenerator.getInstance("DESede");
        SecretKey desKey = keygen.generateKey();
        Cipher desCipher = Cipher.getInstance("DESede");
  
        //Prendo in ingresso il file
        byte [] fcritt = new byte[(int) (new File("Prova.crypt.txt")).length()];
        FileInputStream fis = new FileInputStream("Prova.crypt.txt");
        fis.read(fcritt);
        fis.close();
        FileOutputStream fos = new FileOutputStream("Elemento.txt");
              desCipher.init(Cipher.DECRYPT_MODE, desKey);
        for(int i=0; i<fcritt.length; i+=TOKEN_LENGHT){
           //qui c'è l'errore
            byte[] ciphertoken = desCipher.update(fcritt, i, TOKEN_LENGHT);
            fos.write(ciphertoken);
        }
        fos.close();
    }

4 Risposte

  • Re: [Java] Decrittazione File

    Non sono particolarmente ferratissimo sulla security e sugli algoritmi di cifratura ma ..... una cosa forse non hai considerato.
    Nel caso di cifratura "simmetrica" (come nel tuo caso), la chiave deve essere la stessa per la cifratura e per la decifratura. Se quando cifri il file fai un generateKey() e poi quando lo decifri generi un'altra chiave con un altro generateKey() ..... non ci siamo.
  • Re: [Java] Decrittazione File

    andbin ha scritto:


    Non sono particolarmente ferratissimo sulla security e sugli algoritmi di cifratura ma ..... una cosa forse non hai considerato.
    Nel caso di cifratura "simmetrica" (come nel tuo caso), la chiave deve essere la stessa per la cifratura e per la decifratura. Se quando cifri il file fai un generateKey() e poi quando lo decifri generi un'altra chiave con un altro generateKey() ..... non ci siamo.
    La chiave creata è la stessa; precisamente:
    
                KeyGenerator keygen = KeyGenerator.getInstance("DESede");
                SecretKey desKey = keygen.generateKey();
                    Cipher desCipher = Cipher.getInstance("DESede");
                    desCipher.init(Cipher.ENCRYPT_MODE, desKey);
    
    E per concludere il ciclo for per crittare i dati (funzionante)
            for(int i=0; i<fcritt.length; i+=TOKEN_LENGHT){
                byte[] ciphertoken = desCipher.update(fcritt, i, TOKEN_LENGHT);
                fos.write(ciphertoken);
            }
  • Re: [Java] Decrittazione File

    Savat5 ha scritto:


    La chiave creata è la stessa
    Ascolta, te lo dico gentilmente: generateKey() genera una nuova chiave completamente casuale. Se quando cifri il file invochi un generateKey() e quando decifri invochi un'altra volta un generateKey() ... hai sbagliato.
    Se non hai fatto così, non posso saperlo, non vedendo per intero l'architettura e il codice usato.
  • Re: [Java] Decrittazione File

    andbin ha scritto:


    Savat5 ha scritto:


    La chiave creata è la stessa
    Ascolta, te lo dico gentilmente: generateKey() genera una nuova chiave completamente casuale. Se quando cifri il file invochi un generateKey() e quando decifri invochi un'altra volta un generateKey() ... hai sbagliato.
    Se non hai fatto così, non posso saperlo, non vedendo per intero l'architettura e il codice usato.
    Grazie per la gentilezza, XD.
    Comunque hai ragione, dopo aver risposto ho rivisto il codice e sto provando a correggerlo;


    Codice Decrittatore
    
    final int TOKEN_LENGHT = 5;
            SecretKey desKey;
            Cipher desCipher = Cipher.getInstance("DESede");
            //prende la chiave creata dal crittatore
                        FileInputStream keyFos = new FileInputStream("key.txt");
                //Provo, erroneamente, a salvare la chiave
                keyFos.read(desKey.getEncoded());
                keyFos.close();
            //Prendo in ingresso il file
            byte [] fcritt = new byte[(int) (new File("Prova.crypt.txt")).length()];
            FileInputStream fis = new FileInputStream("Prova.crypt.txt");
            fis.read(fcritt);
            fis.close();
            FileOutputStream fos = new FileOutputStream("Elemento.txt");
                  desCipher.init(Cipher.DECRYPT_MODE, desKey);
            for(int i=0; i<fcritt.length; i+=TOKEN_LENGHT){
                byte[] ciphertoken = desCipher.update(fcritt, i, TOKEN_LENGHT);
                fos.write(ciphertoken);
            }
            fos.close();
        }
    La parte di codice del crittatore che crea la chiave è:
     final int TOKEN_LENGHT = 5;
    
                KeyGenerator keygen = KeyGenerator.getInstance("DESede");
                SecretKey desKey = keygen.generateKey();
                FileOutputStream keyFos = new FileOutputStream("key.txt");
                //Salva la chiave in key.txt
                keyFos.write(desKey.getEncoded());
                keyFos.close();
    *EDIT* Scusa ancora, ero convinto che con generatekey, usando gli stessi parametri, ottenessi la medesima chiave. Si vede che sono ancora agli inizi. XD

    *EDIT2*
    Il mio vero problema riguarda come prendere la chiave.
    Mi spiego meglio, ho creato la chiave key.txt... ora java mi fornisce FileInputStream per leggere un flusso di byte, e ovviamente con FileinputStream Fis = ...
    Fis.read (byte []) vorrà un array di byte... e la chiave mi serve nel formato Secretkey e, come c'era da aspettarsi, la conversione non è immediata con:

    Fis.read(array)
    SecretKey deskey = (SecretKey) array
    L'oggetto SecretKey deskey mi serve per

    Codice: Seleziona tutto
    Cipher desCipher = Cipher.getInstance("DESede");
    desCipher.init(Cipher.DECRYPT_MODE, deskey);
Devi accedere o registrarti per scrivere nel forum
4 risposte