[Java] Un programma dedicato e tratto da Prison Break

Il codice segreto degli origami

« Older   Newer »
 
  Share  
.
  1.  
    .
    Avatar

    Millenium Member

    Group
    Member
    Posts
    10,796

    Status
    Anonymous
    Ciao a tutti!! :)

    Ho deciso di scrivere questo programma affascinato dal genio di Scofield e da quello che è riuscito a fare con gli origami. Si, per chi ha seguito questa serie parlo dei messaggi cifrati sugli origami! :) Grazie ad una breve ma buona spiegazione in rete reperibile a Questo lnk.
    1. Introduzione:
      Il seguente programma è stato scritto basandosi sulla seconda stagione di Prison Break, in cui Michael Scofield
      (impersonato da Wentworth Miller), cifra su un origami a forma di gru del testo destinato alla dottoressa Sara
      Tancredi. Il primo origami contiene tre righe di puntini, separati da spazi. Gli altri 3 origami contengono
      un apparente numero telefonico disabilitato.

    2. Descrizione:
      Il programma cifra una frase lunga N caratteri, utilizzando il procedimento di Scofield.
      Ogni riga di puntini deve essere abbinata al numero disattivato corrispondente.
      Il numero disattivato indica i tasti del cellulare, quindi ogni numero indica un preciso tasto; i puntini indicano
      la posizione della lettera su quel tasto.

    Posto intanto il codice sotto spoiler:

    SPOILER (click to view)
    CODICE
    /*
    La versione 0.8 Beta del programma ha superato i test ed è stata aggiornata in modo sufficiente, la versione attuale è la 1.0.

      Introduzione:
           Il seguente programma è stato scritto basandosi sulla seconda stagione di Prison Break, in cui Michael Scofield
           (impersonato da Wentworth Miller), cifra su un origami a forma di gru del testo destinato alla dottoressa Sara
           Tancredi. Il primo origami contiene tre righe di puntini, separati da spazi. Gli altri 3 origami contengono
           un apparente numero telefonico disabilitato.
       
       Descrizione:
           Il programma cifra una frase lunga N caratteri, utilizzando il procedimento di Scofield.
           Ogni riga di puntini deve essere abbinata al numero disattivato corrispondente.
           Il numero disattivato indica i tasti del cellulare, quindi ogni numero indica un preciso tasto; i puntini indicano
           la posizione della lettera su quel tasto.

    Version: 1.0

    Ulteriori aggiornamenti saranno: Controllo caratteri accentati (V). Successivamente output su file (V),
    e a seguire input da file.
    Al momento il programma non gestisce gli "Invio" nel testo.

    Copyright (c) Marco "RootkitNeo" 2748355274.
    ja091690MC

    Il seguente programma è distrubuito entro i termini della licenza GNU/GPL.

    Aggiunta: Lettera prima parola maiuscola, abbellimenti con swing
    */

    import java.io.*;
    import javax.swing.JOptionPane;
    import javax.swing.ImageIcon;

    // Se si utilizza la classe ricordarsi di gestire nel main il carattere maiuscolo o minuscolo
    // e gli spazi tra i caratteri

    class BetaScofield  {
    private String caratteri_cell[] = { " ", " ", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz" };
    private int contatore=0;
    private String dot="", number="";

    // cifra la frase in input
    void cifra(String input) throws IOException {
     
      BufferedWriter file_n = new BufferedWriter(new FileWriter("TxtScofieldCrypt.txt")); // file contenente i numeri
     
      boolean enter=true; // controllo quando entro nel while
     
      // conta la stringa
      for(int i=0; i<input.length(); i++) {
        char ch = (input.charAt(i)=='è')||(input.charAt(i)=='é') ? 'e' : input.charAt(i);
        contatore++;
       
        if(ch<97||ch>122) {
          continue;
        }
       
        // controllo ogni elemento dell'array in modo da abbinarli al carattere corrispondente
        for(int j=2; j<caratteri_cell.length; j++) {
          String temp = caratteri_cell[j];
         
          // controllo ogni carattere dell'elemento
          for(int k=0; k<temp.length(); k++) {
            if(temp.charAt(k)==ch) {
              number+=j;
              int t=k;
               
              while((t+1)>0) {
                dot+=".";
                t--;
                enter=false;
              }
            }
            else {
              continue;
            }
          }
        }
     
        if(!enter) dot+=" ";
       
        if(contatore==10||i==input.length()-1) {
          number+="n";
          // scrivo i numeri
          file_n.write(number);
          dot+="n";
         
          // scrivo i puntini
          file_n.write(dot);
          contatore=0;
          number="";
          dot="";
        }
      }
     
      // chiudo il file
      file_n.close();
     
    }

    // Metodo che decodifica il file
    void decifra() throws IOException {
      FileReader fr; // flusso che conterrà il file
      BufferedReader br; // flusso che leggerà dal file attraverso readLine()
     
      // In caso il file non si trovi nella stessa directory viene sollevata
      // un eccezione che lancio al main()
      try {
        fr = new FileReader("TxtScofieldCrypt.txt");
        br = new BufferedReader(fr);
      } catch(FileNotFoundException e) {
        throw e;
      }
     
      // flusso che scrive su di un file
      FileWriter fw = new FileWriter("Prova.txt");
     
      // contatore: conta i puntini, e quindi la posizione della lettera corrispondente
      // k: fa scorrere i caratteri della stringa di puntini.
      int contatore=0, k=0;
     
      do {
        // riga di numeri e di puntini.
        number = br.readLine();
        dot= br.readLine();
       
        if(number!= null) {
          // ciclo che scorre tutta la stringa di numeri
          for(int i=0; i<number.length(); i++) {
            char ch_n = number.charAt(i);
           
            // conto i caratteri '.'
            while((dot.charAt(k)=='.')&&(dot.length()>k)) {
              contatore++;
              k++;
            }
            k++;
           
            // prendo il numero del tasto e lo metto nell'array in modo da avere quel gruppo di lettere
            String tasto_cell = caratteri_cell[Character.digit(ch_n, 10)];
            // prendo l'occorrenza del carattere.
            String lettera =""+ tasto_cell.charAt(contatore-1);
            fw.write(lettera);
         
            lettera="";
            contatore=0;
          }
          k=0;
        }
      } while(number!=null);
     
      // chiudo il file di lettura
      fr.close();
      // chiudo il file di scrittura
      fw.close();
    }
    }

    class ProgettoScofield {
    public static void main(String args[]) throws IOException {

     
      // Flusso per scrivere su console
      PrintWriter pw = new PrintWriter(System.out, true);
     
      // Istanzio la classe - creo un oggetto
      BetaScofield bs = new BetaScofield();
     
      String str="";
      Object possible_values[] = {"1","2"}; // Scelte che compaiono nel menù a tendina
     
      int ch1=0;
      long start, end;
     
      // Apro una finestra grafica che comunica all'utente il messaggio.
      JOptionPane.showMessageDialog(null,"<html>Programma scritto da RootkitNeo.<br>Il seguente programma è distribuito entro i termini della licenza"+
      " GNU/GPL.<br><br>Per una corretta visualizzazione dell'immagine Scofield, lasciarla nella stessa cartella del programma.<br><br>"+
      "Per non avere problemi nella visualizzazione del file cifrato (per chi si trova su win) è necessario aprire il file con l'applicazione WordPad</html>");
     
      do { // Apro una finetra grafica che riceve l'input e fa uso di un'icona personalizzata e del menù a tendina.
        Object ch = JOptionPane.showInputDialog(null,"n<html>Inserisci il numero corrispondente all'operazione desiderata:<ol><li>Cifra una frase con il metodo Scofield.</li><li>Decifra un file di testo con il metodo Scofield.</li></ol></html>","Scegli il numero corrispondente",JOptionPane.QUESTION_MESSAGE,new ImageIcon("Scofield.jpg"),possible_values,possible_values[0]);
        try {
          String p = ch.toString();
          ch1 = Integer.parseInt(p);
        } catch(NullPointerException e) { // si verifica quando si preme 'Annulla'
          JOptionPane.showMessageDialog(null,"L'operazione è stata annullatanIl programma sarà terminato.","Operazione annullata!",JOptionPane.WARNING_MESSAGE);
          break;
        }
      } while(ch1 < 1 || ch1 > 2);
     
     
      switch(ch1) {
        case 1:
        String str1="", input="";
       
        str = JOptionPane.showInputDialog("Inserisci la frase/testo da codificare secondo Scofield:","Rendezvous sundown hotel gila nm");
        try {
          // converto la stringa in minuscolo, se è presente.
          input = str.toLowerCase();
        } catch(NullPointerException e) { // si verifica se viene premuto annulla
          JOptionPane.showMessageDialog(null,"L'operazione è stata annullatanIl programma sarà terminato.","Operazione annullata!",JOptionPane.WARNING_MESSAGE);
          break;
        }
     
        // ciclo che toglie gli spazi e l'apostrofo
        for(int i=0; i<input.length(); i++) {
          str1 += (input.charAt(i)==((char)39))|| (input.charAt(i)==((char) 32)) || (input.charAt(i)==((char)44)) || (input.charAt(i)==((char)46)) || (input.charAt(i)==((char)58)) || (input.charAt(i)==((char)59)) || (input.charAt(i)==((char)45)) ? "" : input.charAt(i);
        }
       
        // calcolo il tempo impiegato per l'esecuzione di questa operazione.
        start = System.currentTimeMillis();
        bs.cifra(str1);
        end = System.currentTimeMillis();
       
        pw.println("nnLa tua frase e' stata scritta e salvata con successo nei file 'TxtScofieldCrypt.txt'.nn"+
                   "Per il corretto funzionamento di un eventuale decodifica, lasciare il file presente nella stessa directory del programma JAR.nn"+
                   "Questo e' necessario, visto che il programma cerca il file da decodificare nella directory da dove e' stato eseguito.nn"+
                   "Il tempo Impiegato nella codifica e': " + (end-start) + " ms");
        break;
        case 2:
        pw.println("nIl file di default che verra' decodificato e' 'TxtScofieldCrypt.txt'.n");
        try {
       
          // ottengo il tempo di elaborazione di questo compito
          start = System.currentTimeMillis();
          bs.decifra();
          end = System.currentTimeMillis();
         
          pw.println("nL'operazione e' stata eseguita correttamente.nn"+
                     "Il tempo di esecuzione e' : " + (end-start) + " ms");
         
        } catch(FileNotFoundException e) {
          JOptionPane.showMessageDialog(null,"nL'errore riscontrato e' di tipo FileNotFoundExceptionnn"+
                     "Il file 'TxtScofieldCrypt.txt' non si trova nella directory corrente.nn"+
                     "Spostare il file nella directory corrente in modo da poter convertire il file nel formato originario.n",null,JOptionPane.ERROR_MESSAGE);
        }
        break;
      }
      System.exit(0);
    }
    }


    Il programma cifra una frase inserita in Input e la inserisce in un file. Successivamente è possibile anche decifrare il file!
    In un aggiornamento futuro cercherò di implementare anche il crypt di un file, ma al momento non è disponibile nel programma! :P

    Per poterlo eseguire è necessario estrarre la cartella dall'archivio zippato. Una cosa importante è non cambiare mai locazione agli elementi all'interno della cartella (un immagine, il programma jar, e un file bat). All'interno è disponibile un file bat, quindi gli utenti windows possono eseguire il programma cliccando su quello!
    Chi non dovesse trovarsi su windows deve spostarsi da terminare all'interno della cartella, e digitare il seguente comando per eseguire:

    CODICE
    java -jar ProgettoScofield.jar


    Se avete consigli, suggerimenti..opinioni.. sono qui!! :)

    NOTA: Tutti coloro che utilizzano windows devono aprire il file cifrato con WordPad. L'ho scritto su Linux e la codifica dei caratteri è diversa!!

    Edited by RootkitNeo - 25/10/2009, 17:50
    File Allegato
    ProgettoScofield.zip
    (Number of downloads: 8)

     
    .
  2.  
    .
    Avatar

    Millenium Member

    Group
    Member
    Posts
    4,993
    Location
    Roma

    Status
    Offline
    Anche tu Prisondipendente eh?
    :*asd: Stasera appena ho 10 minuti lo scarico. Sembra interessante :*occhiolino:

    I miei complimenti comunque :*happy:
     
    .
  3.  
    .
    Avatar

    Millenium Member

    Group
    Member
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (Alienboy @ 25/10/2009, 14:29)
    Anche tu Prisondipendente eh?
    :*asd: Stasera appena ho 10 minuti lo scarico. Sembra interessante :*occhiolino:

    I miei complimenti comunque :*happy:

    Eh si! :) E pensare che mi ero perso la prima serie perchè non lo reputavo interessante..l'anno successivo è stato trasmesso in seconda serata (prima stagione) e me la sono guardata tutta...solo dai primi 2 episodi non sono più riuscito a staccarmi!! :)

    Grazie!! :)
    Ah mi sono dimenticato di dirlo..il programma non necessita di installazione..quindi è tutto veloce!! :P
     
    .
  4.  
    .
    Avatar

    Millenium Member

    Group
    Member
    Posts
    4,993
    Location
    Roma

    Status
    Offline
    Funziona alla perfezione. L'unica cosa che non riesce a cifrare sono i numeri (ovviamente).
     
    .
  5.  
    .
    Avatar

    Millenium Member

    Group
    Member
    Posts
    10,796

    Status
    Anonymous
    CITAZIONE (Alienboy @ 25/10/2009, 17:04)
    Funziona alla perfezione. L'unica cosa che non riesce a cifrare sono i numeri (ovviamente).

    :)

    Si esattamente!! può ricevere solo tutte le lettere dell'alfabeto.

    Ah, mi sono dimenticato di dirlo^^ chi è su windows deve aprire il file cifrato con WordPad, perchè su ubuntu utilizzo una codifica dei caratteri diversa!! ;)

    Il file visto in modo corretto dovrebbe essere così:

    Testo in entrata: "ciao"

    CODICE
    2424
    ... ... . ...


    ;)
     
    .
4 replies since 25/10/2009, 14:19   148 views
  Share  
.