Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Nov 2016
    residenza
    Italy
    Messaggi
    139

    Problemi input da tastiera JAVA.

    Ciao a tutti,
    sono nuovo nel forum, e vorrei esporvi il mio problema.

    Ho realizzato un algoritmo di cifratura/decifratura di dati RSA.
    Il mio problema sorge quando una volta codificato il messaggio devo andarlo a decodificare, dato che inserendo in input il mio messaggio da decodificare non viene compreso.
    Ora mi spiego meglio.

    Dato che nella codifica usiamo le operazioni in modulo, e lavorando con la chiave pubblica (n,e)=(221,31) , immettendo in input mediante l'uso dello scanner java, la stringa "love", compio i seguenti passi.
    Dalla tabella ASCII sappiamo che ogni carattere è espresso come valore numerico che può rappresentarsi decimale, in questo caso l=108 o=111 v=118 e=101.
    il codice che uso per conoscere il valore numerico del carattere è il seguente:
    codice:
           System.out.println("Inserisci stringa");
           Scanner in=new Scanner(System.in);
           String s=in.next();
           for(int i=0 ; i<s.length();i++)
           {
            // Aggiungo i vari caratteri della strina in un ArrayList chiamato carattere
            int x=s.CharAt(i);
            carattere.add(x);
            }
    se vado a stampare l'ArrayList ottengo:
    codice:
    for(int i=0;i<carattere.size();i++)
    {
    System.out.println("Il carattere"+i+"-esimo della stringa è:"+carattere.get(i));
    }
    ed ottengo in output: 108,111,118,101. correttamente come deve essere.
    Adesso effettuata la codifica del messaggio, ottengo nuovamente correttamente i valori codificati: 173,19,118,101 , e dato il problema col carattere 19 che è di controllo ho deciso di aggiungere quando visualizzo 33 così da rientrare nei caratteri rappresentabili.
    Inoltre i caratteri 173,19,118,101 sono in un ArrayList chiamato codificato, quindi stampo:
    codice:
    System.out.println("Il messaggio codificato è:");
    for(int i=0;i<codificato.size();i++)
    {
    System.out.print((char) (codificato.get(i)+33));
    }
    quindi effettivamente a video ho i caratteri rappresentati dai valori: 206,52,151,134.
    Il mio problema sorge nella decodifica, ovvero quando immetto utilizzando lo scanner java, il mio messaggio da decodificare non viene capito il messaggio.
    Vi faccio l'esempio con la sola prima lettera della stringa, ovvero Î=206, scrivendo il codice:
    codice:
           System.out.println("Inserisci stringa");
           Scanner in=new Scanner(System.in);
           String s=in.next();
           int x=s.CharAt(0);
          System.out.println("Valore del carattere:"+(int) x);
    ed ottengo in output il valore 65533, mentre dovrebbe essere 206, e questo problema sorge con tutti i caratteri con valore >127 nella tabella ASCII.

    Scusatemi se ho scritto un papiro, spero di essere stato esaustivo.
    Sono giorni che sul problema senza riuscire a risolverlo.
    Grazie a tutti per l'aiuto!!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Premessa 1)
    Un algoritmo di "cifratura" (tutti quelli perlomeno noti e validi) lavorano solo su byte, NON su caratteri. L'algoritmo riceve una sequenza di byte (per l'algoritmo, cosa rappresentino è indifferente) e genera un'altra sequenza di byte, quella "criptata".
    Nella sequenza di byte in uscita, i byte sono "raw", crudi. Non hanno alcun (apparente) significato particolare e NON sono caratteri.

    Se tu parti da una stringa Java, ovvero una sequenza di char (che è un valore 16 bit che codifica i caratteri in UTF-16), per usare un qualunque algoritmo di cifratura che sia implementato in modo sensato, dovresti convertire la stringa di char in una sequenza di byte. E questo va a coinvolgere per forza le questioni sui charset (set di caratteri).
    Hai considerato questo?? Perché se non l'hai fatto, allora: o non hai implementato un vero e proprio algoritmo di cifratura o hai fatto qualcosa di abbastanza strano o inusuale.


    Premessa 2)
    Se il tuo algoritmo tira fuori byte, essi non hanno alcun (apparente) significato. Pertanto NON ha senso trattarli come caratteri e NON ha nemmeno senso farci logiche del tipo: 19 è un carattere di controllo e ci sommo qualcosa.
    Se si vuole si può rappresentare una sequenza cruda di byte in una sequenza leggibile di caratteri usando un apposito encoding tipo Base64 o Ascii85 (o altri) che in generale sono dei binary-to-text encoding. Ma questo è un altro discorso.
    Se hai solo byte e non un binary-to-text encoding, NON ha praticamente senso chiedere in input all'utente la sequenza da decodificare.
    Hai considerato questo?? Perché se non l'hai fatto, idem, hai fatto qualcosa di molto strano e/o inusuale.

    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
    Nov 2016
    residenza
    Italy
    Messaggi
    139
    Buonasera andbin, grazie per la risposta.

    So che nella crittografia dobbiamo agire sui byte, ed ho infatti considerato quello che mi hai detto.
    L'algoritmo che ho realizzato, l'ho basato su quanto descritto dal mio libro di testo dopo averne discusso con il mio docente di riferimento, che mi ha consigliato prima di fare questa implementazione e poi andare a lavorare con i bit.

    Il concetto dell'algoritmo RSA che sto utilizzando, si avvale sulla aritmetica in modulo usando le operazioni effettuate dall'RSA ma trattando i caratteri da codificare/decodificare, come numeri ed associando ad ogni carattere il suo valore decimale che ne deriva considerando la tabella ASCII.

    Il mio problema sorge nella decodifica, perché supposto di avere una stringa de decodificare, la immetto in input da tastiera, non mi vengono compresi i caratteri.
    Il mio problema per come ho strutturato l'algoritmo è di prendere una stringa con l'oggetto Scanner in maniera corretta, perché se pongo:
    codice:
    Scanner in=new Scanner(System.in);
    String s=in.next();
    ed inserisco per esempio la Î, dovrei ottenere per come sto realizzando l'algoritmo il suo valore decimale 206 ma invece ottengo 65533, mentre se pongo il codice seguente:
    codice:
    String s="
    codice:
    Î";
    System.out.println("Decimale del carattere:"+(int) s.charAt(0));
    

    ottengo correttamente 206.
    Grazie mille per la pazienza nel cercare di comprendere il problema!!
    Ultima modifica di LeleFT; 25-11-2016 a 14:10 Motivo: Sistemati i tag CODE

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.