Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    Creazione classe per l'implentazione dell'algoritmo crittografico RSA

    Salve a tutti io ho realizzato la seguente classe per poter criptare e decriptare stringhe secondo l'algortimo RSA:
    codice:
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.UnsupportedEncodingException;
    import java.security.InvalidKeyException;
    import java.security.KeyPair;
    import java.security.KeyPairGenerator;
    import java.security.NoSuchAlgorithmException;
    
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    
    
    import sun.misc.BASE64Decoder;
    
    
    public class RSA {
            protected static Cipher cipher;
            protected static KeyPairGenerator keyGen;
            protected static KeyPair key;
            
            public static void generaChiave() throws NoSuchAlgorithmException, NoSuchPaddingException{
                System.out.println("Genero chiavi..");
                keyGen=KeyPairGenerator.getInstance("RSA");
                keyGen.initialize(1024);
                key=keyGen.generateKeyPair();
                cipher=Cipher.getInstance("RSA/ECB/PKCS1Padding");
                System.out.println("Chiavi generate..");
            }
    
    
            
            // effettua la cifratura utilizzando la chiave PUBBLICA
            public static String cripta(String s) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException{
                System.out.print("Inizio cifratura..");
                cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
                byte[] str=s.getBytes("UTF8");
                byte[] cipherText = cipher.doFinal(str);
                System.out.println("\nCifratura finita... ");
                return new String(cipherText,"UTF8");
            }
            
            // effettua la decifratura utilizzando la chiave PRIVATA
            public static String decripta(String s) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException{
                System.out.println("\nInizio decifratura..");
                cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
                byte[] str=s.getBytes("UTF8");
                byte[] cipherText = cipher.doFinal(str);
                System.out.println("Decifratura finita.. ");
                return new String(cipherText, "UTF8");
            }
            public static void main (String[]args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException{
                String s="ciao";
                RSA.generaChiave();
                String sa=RSA.cripta(s);
                System.out.println(sa);
                s=RSA.decripta(sa);
                System.out.println(s);
            }
    }
    Il mio problema è che quando mando in esecuzione il main mi genera questo errore:
    codice:
    Genero chiavi..Chiavi generate..
    Inizio cifratura..
    Cifratura finita... 
    ???R?P???5?H?<{?/?'????I?A"C?8??\
    ???:D=????Jh?iekC??t????O??6}?6]??i
    ?jS!I??`??\?H????qPl??Ou???,????]
    
    
    Inizio decifratura..
    Exception in thread "main" javax.crypto.IllegalBlockSizeException: Data must not be longer than 128 bytes
        at com.sun.crypto.provider.RSACipher.a(DashoA13*..
        at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
        at javax.crypto.Cipher.doFinal(DashoA13*..)
        at dieciLuglio.RSA.decripta(RSA.java:49)
        at dieciLuglio.RSA.main(RSA.java:58)
    Io credo che il problema si che quando il metodo decripta va a creare l'array di byte dalla stringa passata come argomento ,questa non sia uguale all'array di byte crearo dal metodo cipher.dofinal(str) creato nel metodo cripta e per questo da errore.C è un modo per ottenere l'array di byte della stringa criptata senza dover per forza passare al metodo l'array di byte non convertito in stringa?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Non me ne intendo tantissimo di crittografia ma ..... di una cosa sono certo:

    codice:
    byte[] cipherText = cipher.doFinal(str);
    return new String(cipherText,"UTF8");

    Da un byte array che contiene dati cifrati (quindi nulla che sia una sequenza di byte in un certo charset valido per rappresentare una stringa) e passare a String .... semplicemente non ha senso.
    Ultima modifica di andbin; 29-03-2014 a 20:05
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Non me ne intendo tantissimo di crittografia ma ..... di una cosa sono certo:

    codice:
    byte[] cipherText = cipher.doFinal(str);
    return new String(cipherText,"UTF8");

    Da un byte array che contiene dati cifrati (quindi nulla che sia una sequenza di byte in un certo charset valido per rappresentare una stringa) e passare a String .... semplicemente non ha senso.
    Ho fatto così perchè poi dovrò inviare i dati cifrati tra client e server; quindi secondo te dovrei inviare byte array tra client e server?(io ritornavo stringhe per facilitare l'invio e la ricezione)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da PaniKo_92 Visualizza il messaggio
    Ho fatto così perchè poi dovrò inviare i dati cifrati tra client e server; quindi secondo te dovrei inviare byte array tra client e server?(io ritornavo stringhe per facilitare l'invio e la ricezione)
    Se il protocollo che dovrai usare è "binario", certamente è meglio inviare direttamente i byte così come sono. Se il protocollo fosse testuale, puoi codificare il byte array in una stringa con un formato come es. Hex, Base64, Ascii85, ecc...

    Ma sicuramente non con new String(byteCifrati, "nomecharset") perché String si aspetta che lo stream di byte rappresenti una sequenza di caratteri codificata in un certo charset mentre invece nel tuo caso non lo è affatto perché è il risultato di una cifratura che rende la sequenza di byte totalmente incomprensibile e apparentemente "casuale". Questo spero ti sia chiaro ora.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    andbin;25196248]Se il protocollo che dovrai usare è "binario", certamente è meglio inviare direttamente i byte così come sono. Se il protocollo fosse testuale, puoi codificare il byte array in una stringa con un formato come es. Hex, Base64, Ascii85, ecc...

    Ma sicuramente non con new String(byteCifrati, "nomecharset") perché String si aspetta che lo stream di byte rappresenti una sequenza di caratteri codificata in un certo charset mentre invece nel tuo caso non lo è affatto perché è il risultato di una cifratura che rende la sequenza di byte totalmente incomprensibile e apparentemente "casuale". Questo spero ti sia chiaro ora.
    Ti ringrazio per il chiarimento, mi potresti illustrare la procedura per codificare l array di byte in una stringa con formato Hex?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da PaniKo_92 Visualizza il messaggio
    mi potresti illustrare la procedura per codificare l array di byte in una stringa con formato Hex?
    Ci sono diversi modi per formattare i byte in string hex, più o meno performanti. E ci sono anche librerie apposite es. la Apache Commons Codec che contiene funzionalità di (de)codifica di questo tipo.

    Il punto è però un altro, cioè valutare meglio cosa devi fare. Parlavi di "inviare i dati cifrati tra client e server". Precisa quindi cosa sono client e server, come comunicano, con quale "protocollo" e cosa devono scambiarsi. Dopodiché si può sicuramente valutare meglio la soluzione.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.