Visualizzazione dei risultati da 1 a 5 su 5

Discussione: aiuto cifrario AES

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    9

    aiuto cifrario AES

    salve a tutti,
    sto smattando su un semplice cifrario.
    credevo di aver finito tutto ma all'ultimissima prova mi accorgo che ciò che voglio che faccia, sorpresa sorpresa non lo fa.
    riporto un po di codice e output.


    il cifrario
    codice:
    package cifrario;
    
    
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
     
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
    
    
    
    public class Cifrario {
        
        
        KeyGenerator keygenerator;
        SecretKey myDesKey;
    
        Cipher desCipher=null;
    
        public Cifrario(){
            try 
            {
                keygenerator = KeyGenerator.getInstance("DES");
            }
            
            catch (NoSuchAlgorithmException e) 
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
             myDesKey = keygenerator.generateKey();
             
    
            
            // Create the cipher 
            try 
            {
                desCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
                System.out.println("cifrario creato\n\n\n");
            } 
            catch (NoSuchAlgorithmException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } 
            catch (NoSuchPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        
        }//costruttore
        
        
        
        public byte [] encrypt (String s){
            
            try {
                desCipher.init(Cipher.ENCRYPT_MODE, myDesKey);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            byte []text=null;
            byte [] string =s.getBytes();
            try {
                text=desCipher.doFinal(string);
            
            } catch (IllegalBlockSizeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (BadPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            return text;
        }
        
        
    public byte [] decrypt (byte [] s){
            
            try {
                desCipher.init(Cipher.DECRYPT_MODE, myDesKey);
            } catch (InvalidKeyException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            byte []text=null;
            
            try {
                text=desCipher.doFinal(s);
            
            } catch (IllegalBlockSizeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (BadPaddingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            
            return text;
        }
        
        
    
    }
    il main
    codice:
    package cifrario;
     
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
     
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.KeyGenerator;
    import javax.crypto.NoSuchPaddingException;
    import javax.crypto.SecretKey;
     
    public class main
    {    
        public static void main(String[] argv) {
     
    
    
            
            Cifrario ciph=new Cifrario();
            String s="Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, che la ritta via era smarrita\n sopralapancalacapracampa sotto la panca la capracrepa\n pablitoclavòunclavitoenlacalvadeuncalvito, enlacalvadeuncalvitoclavòunclavitopablito";
            
            byte [] encrypted=ciph.encrypt(s);
            byte [] encrypted2=ciph.encrypt(s);
            String t1=new String(encrypted);
            byte [] decrypted =ciph.decrypt(t1.getBytes());
            System.out.println("testo cifrato sotto forma di byte[]: "+encrypted);
            System.out.println("2 testo cifrato sotto forma di byte[]: "+encrypted2);
            System.out.println("t1.getbyte(): "+t1.getBytes());
            System.out.println("testo cifrato sotto forma di stringa: "+ new String (encrypted));
            System.out.println("t1: "+t1);
            
            System.out.println("testo decifrato sotto forma di byte: " + decrypted);
            System.out.println("testo decifrato sotto forma di stringa: "+new String (decrypted));
        }
            
            
    }

    codice:
    testo cifrato sotto forma di byte[]: [B@18fb397
    2 testo cifrato sotto forma di byte[]: [B@157b39f
    t1.getbyte(): [B@d1918a
    testo cifrato sotto forma di stringa: Ö@KjæºÕ]VÍŒd>€wÚ”|õØM!0oË*ˆîòY“*‚„´U#ÿã?©n"áëæ²o¾#¯%ÃÍŠ2?¹.ã
        <NM…f0]Ç-@“Ê#à8Ý¸Ž—?·òƒìUÁ#ðL{Õ%¤nÂt øUín?ŠÇ³â•ÚYaªÔãkLaqˆ”^!j6LˆÄ^‚5ïrÇ…æö„¶€oü§øg²ysU!’ÏÓåI+•g£NË‘‰#¬ý…S%³7îV”4OI|ö©Õ$ýû

    come potete notare se converto il byte[] in stringa e lo riconverto in byte[] il risultato è diverso (t1.getbite() e encrypted) il che è il problema principale da risolvere, ho necessità di poter convertire byte[] ---> String----->byte per un altro progetto (questo programmino semplice mi serve per testare la classe cifrario) .
    in secondo luogo non capisco perchè encrypted ed encrypted2 debano essere diversi se sono il risultato della stessa funzione con lo stesso input (questa è più che altro una mia curiosità).
    inoltre se avete sugerimenti su come migliorare la classe cifrario sono ben accetti.
    grazie mille per ogni possibile aiuto

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da atelzut Visualizza il messaggio
    come potete notare se converto il byte[] in stringa e lo riconverto in byte[] il risultato è diverso (t1.getbite() e encrypted) il che è il problema principale da risolvere
    Il risultato di una "cifratura" (qualunque algoritmo serio/valido: DES, AES, ecc....) è una sequenza di byte che apparentemente non ha alcun significato particolare e "sembra" totalmente casuale. Non rappresenta più caratteri (anche se l'input in chiaro era una stringa di caratteri), pertanto usare il risultato della cifratura per creare una stringa con il costruttore String(byte[]) ha un senso relativamente molto basso. Insomma, ha ben poco senso, perché i byte cifrati non rappresentano caratteri.

    Se proprio vuoi ottenere un qualcosa di vagamente stampabile, almeno sfrutta un charset single-byte come "ISO-8859-1" così almeno si ha 1 byte -> 1 carattere. Ovviamente nella stringa puoi comunque avere caratteri non "stampabili" (sicuramente gli ASCII codice 0-31).

    Inoltre quando nel encrypt converti la stringa in byte[] dovresti specificare un charset ben preciso, uno di quelli che non faccia "perdere" niente del Unicode. Ad esempio UTF-8. Altrimenti a seconda del charset predefinito, puoi ottenere risultati differenti a seconda del sistema su cui fai girare l'applicazione!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    9
    grazie mille dei consiigli. ho risolto il mio problema. ma per quanto riguarda le differenze tra encrypted e encrypted2 mi sai dire nulla?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da atelzut Visualizza il messaggio
    ma per quanto riguarda le differenze tra encrypted e encrypted2 mi sai dire nulla?
    Cioè? Ti riferisci all'output?

    Quote Originariamente inviata da atelzut Visualizza il messaggio
    codice:
    testo cifrato sotto forma di byte[]: [B@18fb397
    2 testo cifrato sotto forma di byte[]: [B@157b39f
    Gli array sono oggetti che non ridefiniscono il toString(), rimane quello ereditato da Object. Che per array di byte[] è in grado di fornire solo una forma tipo appunto "[B@18fb397". Dall'output si deduce solo che i due byte[] sono sicuramente oggetti distinti.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    Di solito quando vuoi rappresentare su stringa il risultato di una cifratura/firma si utilizzano i numeri, per la precisione cifre esadecimali.
    Si parte dal presupposto che quello che partendo dalla stringa puoi comunque ritornare alla sequenza di byte che rappresenta la cifratura (in questo caso) e il passare per un charset può rendere difficile questa operazione. Oltretutto la rappresentazione può dare informazioni falsate o darti caratteri no stampabili.
    qui trovi delle indicazioni interessanti (il principio è se vuoi stampare passa a stringa esadecimale)
    http://stackoverflow.com/questions/9...string-in-java

    se a te interessa sapere se coincidono oppure meno invece devi fare un confronto byte a byte, puoi stampare a video il valore del byte (lo vedi ovviamente come intero) o puoi passare anche in questo caso alla rappresentazione esadecimale (cosa che di solito faccio).
    Come ti diceva andbin, da quello che hai scritto adesso vedi che sono due riferimenti ad array differenti (e ci sta) ma non sai nulla del contenuto (cosa che invece credo tu voglia sapere)
    RTFM Read That F*** Manual!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.