Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104

    [JAVA] Cifrario a trasposizione

    Salve a tutti.
    Sto cercando di implementare il cifrario a trasposizione con questa GUI


    Per la cifratura tutto ok.. per la decifratura ho qualche problema nella costruzione della matrice da leggere poi nell'ordine in base alla chiave...
    Ad esempio, per il messaggio INVIORINFORZIDOMANI! la cifratura è IOFIANRODNVIROIINZM!
    seguendo il metodo che ho scritto:
    (sto facendo l'esempio con esattamente 20 caratteri e chiave 4 (quindi 4 colonne della matrice) per evitare di dover lavorare con gli spazi vuoti.. la cifratura funziona già in qualsiasi caso, la decifratura no.. quindi l'esempio è per messaggio.lenght() = 20 e matrice 5x4)

    CIFRATURA
    codice:
    public String cifra(int key, String messaggio) {        
            int c = key;
            String output = "";
    
    
            messaggio = messaggio.replaceAll("\\s", "");
    
    
            int r = messaggio.length()/c;
            if (messaggio.length()%c != 0){
                r++;
            }
            int pos = 0;
         
            char[][] M = new char [r][c];
                for (int i = 0; i < r; i++) {
                    for (int j = 0; j < c; j++) {
                        if (pos == messaggio.length())
                        break;
                        M[i][j] = messaggio.charAt(pos);
                        pos++;
                    }
                }
                
                for (int i = 0; i < c; i++) {
                    for (int j = 0; j < r; j++) {
                        output += M[j][i];
                    }
                }
            return output;
        }
    LA DECIFRATURA
    codice:
    public String decifra(int key, String messaggio) {        
            messaggio = messaggio.replaceAll("\\s", "");
            boolean f = false;
            int c = key, j, i;
            String output = "";
            char[][] M;
            int pos = messaggio.length();
            int r = messaggio.length()/c;
            int lastr = messaggio.length()%c;
            M = new char [r][c];
            
            for (i = r-1; i >= 0; i--) {
                for (j = c-1; j >= 0; j--) {
                    System.out.println("POS: "+pos);
                    M[i][j] = messaggio.charAt(pos);
                    pos--;
                }    
            }  
            
            for (i = 0; i < c; i++) {
                for (j = 0; j < r; j++) {
                    output += M[j][i];
                    }
                }
            
        return output; 
        }
    con errore sulla riga che ho sottolineato:



    SPERO DI NON AVER INFRANTO REGOLE DEL FORUM! GRAZIE IN ANTICIPO

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Il primo charAt ha come parametro messaggio.length(), ma gli indici vanno da 0 <= pos <= messaggio.length()-1
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Il primo charAt ha come parametro messaggio.length(), ma gli indici vanno da 0 <= pos <= messaggio.length()-1
    c******a che non sono altra!!!! sono fusa grazie

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Il primo charAt ha come parametro messaggio.length(), ma gli indici vanno da 0 <= pos <= messaggio.length()-1

    ora il problema è se devo decifrare un messaggio con lunghezza != dal numero di elementi della matrice...
    ho creato questo codice
    codice:
    public String decifra(int key, String messaggio) {        messaggio = messaggio.replaceAll("\\s", "");
            boolean f = false;
            int c = key, j, i;
            String output = "";
            char[][] M;
            int pos = messaggio.length()-1;
            int r = messaggio.length()/c;
            int lastr = messaggio.length()%c;
            
            if (lastr != 0){
                r++;
                f = true;
            }
            
            M = new char [r][c];
            
            if (f) {
                for (i = r-1; i >= 0; i--) {
                    for (j = c-1; j >= 0; j--) {
                        if (i < r-1 && j < lastr) {
                            System.out.println("POS: "+pos);
                            M[i][j] = messaggio.charAt(pos);
                            pos--;
                        } else {
                            M[i][j] = ' ';
                        }
                    }    
                }
            }  
            
            for (i = 0; i < r; i++) {
                for (j = 0; j < c; j++) {
                    output += M[i][j];
                    System.out.print(M[i][j]+" ");
                    }
                System.out.println();
                }
            System.out.println(output);
        return output; 
        }
    se messaggio.length()%c = x dà resto, significa che non è un multiplo e ci saranno x+1 righe con l'ultima riga non completamente piena... il resto coincide con il numero di elementi "pieni" su quella riga..

    Ad esempio: il messaggio INVIORINFORZI con una chiave pari a 3, viene cifrato come IIIOINONRVRFZ. I caratteri sono 13 quindi 13/3 = 4 con resto 1. Infatti in una matrice con 3 colonne serviranno 4+1 righe per memorizzare i caratteri. Esattamente:
    I N V
    I O R
    I N F
    O R Z

    I - -
    eseguendo il codice, però, è tutto vuoto

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Il punto è che inserisci uno 0 come primo carattere.
    Riempi la matrice a partire dalla prima cella al posto che dall'ultima.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Il punto è che inserisci uno 0 come primo carattere.
    Riempi la matrice a partire dalla prima cella al posto che dall'ultima.

    anche se inserisco un carattere a caso al posto dello spazio vuoto...
    Ultima modifica di LuLyLuNa; 09-07-2015 a 22:52

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    il codice per iniziare dal primo elemento della matrice dovrebbe scorrere riga per riga, tenendo "bloccata" la colonna... e inserire i caratteri del messaggio partendo da pos = 0
    quindi


    codice:
    if (f) {
                for (i = 0; i < c; i++) {
                    for (j = 0; j < r; j++) {
                        if (j == r-1 && i >= lastr) {
                            M[j][i] = ' ';
                        } else {
                            System.out.println("POS: "+pos);
                            M[j][i] = messaggio.charAt(pos);
                            pos++;
                        }
                    }    
                }
            }
    Ultima modifica di LuLyLuNa; 09-07-2015 a 23:03

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    il codice per iniziare dal primo elemento della matrice dovrebbe scorrere riga per riga, tenendo "bloccata" la colonna... e inserire i caratteri del messaggio partendo da pos = 0
    quindi


    codice:
    if (f) {
                for (i = 0; i < c; i++) {
                    for (j = 0; j < r; j++) {
                        if (j == r-1 && i >= lastr) {
                            M[j][i] = ' ';
                        } else {
                            System.out.println("POS: "+pos);
                            M[j][i] = messaggio.charAt(pos);
                            pos++;
                        }
                    }    
                }
            }

    ma non funziona nemmeno così

  9. #9
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da LuLyLuNa Visualizza il messaggio
    ma non funziona nemmeno così
    codice:
    class Main{
    	public static void main (String[] args) throws java.lang.Exception
    	{
    		String s = cifra(3, "Ciao come va?");
    		System.out.println(s);
    		System.out.println(decifra(3, s));
    	}
    	
    	public static String cifra(int key, String messaggio) {        
            int c = key;
            String output = "";
    
    
    
    
            messaggio = messaggio.replaceAll("\\s", "");
    
    
    
    
            int r = messaggio.length()/c;
            if (messaggio.length()%c != 0){
                r++;
            }
            int pos = 0;
         
            char[][] M = new char [r][c];
                for (int i = 0; i < r; i++) {
                    for (int j = 0; j < c; j++) {
                        if (pos == messaggio.length())
                        break;
                        M[i][j] = messaggio.charAt(pos);
                        pos++;
                    }
                }
                
                for (int i = 0; i < c; i++) {
                    for (int j = 0; j < r; j++) {
                        output += M[j][i];
                    }
                }
            return output;
        }
        
        public static String decifra(int key, String messaggio) {        
            int c = key;
            String output = "";
    
    
    
    
            messaggio = messaggio.replaceAll("\\s", "");
    
    
    
    
            int r = messaggio.length()/c;
            if (messaggio.length()%c != 0){
                r++;
            }
            int pos = 0;
         
            char[][] M = new char [r][c];
                for (int j = 0; j < c; j++) {
                    for (int i = 0; i < r; i++) {
                        if (pos == messaggio.length())
                        break;
                        M[i][j] = messaggio.charAt(pos);
                        pos++;
                    }
                }
                
                for (int i = 0; i < r; i++) {
                    for (int j = 0; j < c; j++) {
                        output += M[i][j];
                    }
                }
            return output;
        }
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2013
    Messaggi
    104
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    codice:
    class Main{
        public static void main (String[] args) throws java.lang.Exception
        {
            String s = cifra(3, "Ciao come va?");
            System.out.println(s);
            System.out.println(decifra(3, s));
        }
        
        public static String cifra(int key, String messaggio) {        
            int c = key;
            String output = "";
    
    
    
    
            messaggio = messaggio.replaceAll("\\s", "");
    
    
    
    
            int r = messaggio.length()/c;
            if (messaggio.length()%c != 0){
                r++;
            }
            int pos = 0;
         
            char[][] M = new char [r][c];
                for (int i = 0; i < r; i++) {
                    for (int j = 0; j < c; j++) {
                        if (pos == messaggio.length())
                        break;
                        M[i][j] = messaggio.charAt(pos);
                        pos++;
                    }
                }
                
                for (int i = 0; i < c; i++) {
                    for (int j = 0; j < r; j++) {
                        output += M[j][i];
                    }
                }
            return output;
        }
        
        public static String decifra(int key, String messaggio) {        
            int c = key;
            String output = "";
    
    
    
    
            messaggio = messaggio.replaceAll("\\s", "");
    
    
    
    
            int r = messaggio.length()/c;
            if (messaggio.length()%c != 0){
                r++;
            }
            int pos = 0;
         
            char[][] M = new char [r][c];
                for (int j = 0; j < c; j++) {
                    for (int i = 0; i < r; i++) {
                        if (pos == messaggio.length())
                        break;
                        M[i][j] = messaggio.charAt(pos);
                        pos++;
                    }
                }
                
                for (int i = 0; i < r; i++) {
                    for (int j = 0; j < c; j++) {
                        output += M[i][j];
                    }
                }
            return output;
        }
    }

    ok perfetto funziona ti ringrazio infinitamente...
    però vorrei capire dove sbagliavo.. e come funzionano i cicli for in cui riempi la matrice...
    io all'inizio del metodo rimuovo tutti gli spazi!

    e infatti se il testo cifrato lo inserisci manualmente e clicco decifra, non funziona più il tuo codice
    Ultima modifica di LuLyLuNa; 10-07-2015 a 23:51

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.