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.
- 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.
Posto intanto il codice sotto spoiler:
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!
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:50File Allegato
|
|