Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    11

    [Java] Sistema crittografico polialfabetico

    Buongiorno,
    sto affrontando un'esercitazione di Java nella quale devo riprodurre un sistema crittografico polialfabetico. Il funzionamento e il testo è il seguente: supponiamo che il testo in chiaro sia composto dalle 26 lettere maiuscole dell'alfabeto dalla A alla Z. La chiave è composta da un numero K di lettere che si ripetono nella stessa chiave per tutta la lunghezza del codice in chiaro. Ad ogni lettera nella chiave corrisponde un alfabeto che parte dalla lettera stessa e scorre l'alfabeto “all'indietro”.
    Esempio K=3, chiave formata dalle lettere Z, N e J
    Alfabeto in chiaro: A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
    Alfabeto 'Z': Z Y X W V U T S R Q P O N M L K J I H G F E D C B A
    Alfabeto 'N': N M L K J I H G F E D C B A Z Y X W V U T S R Q P O
    Alfabeto 'J': J I H G F E D C BA Z Y X W V U T S R Q P O N M L K
    chiave: Z N J Z N J Z
    testo in chiaro: L I N C O N S
    testo cifrato: O F W X Z W H
    Scrivere un programma che legga in input il testo da cifrare, il numero K e le tre lettere che
    compongono la chiave. Implementare l'algoritmo di codifica, stampare in uscita il testo da cifrare ed il testo cifrato.
    Ho iniziato la scrittura del programma, ma mi sono bloccato, non riesco a capire come posso legare la frase data in input con la chiave e con l'alfabeto! Ho pensato di farlo con le posizioni: ovvero alla lettera in posizione x del testo in chiaro corrisponde una lettera in posizione x della chiave, che mi da l'alfabeto da usare e poi alla lettera in posizione x dell'alfabeto in chiaro corrisponde la lettera in posizione x dell'alfabeto codificato. Il mio problema è come scrivere la stringa chiave, infatti io l'ho inizializzata vuota e in un ciclo for la riempio con le lettere date dall'utente, il fatto è che quindi ho una stringa formata da "Z N J", come faccio a renderla ZNJZNJZ (ho ripreso l'esempio sopra riportato) cioè fare in modo di ripetere i caratteri che ho per farlo diventare uguale alla parola che ho in input dall'utente? Non ci arrivo proprio. Allego parte del programma che ho compilato potrebbe essere d'aiuto.

    String alfabetoinChiaro = "A"+"B"+"C"+"D"+"E"+"F"+"G"+"H"+"I"+"J"+"K"+"L"+"M"+"N"+"O"+"P"+"Q"+"R"+"S"+"T"+"U"+"V"+"W"+"X"+"Y"+"Z" ;
    intK= inDati.getInteger("Dammi la dimensione della chiave");
    String[] alfabeti = new String[K];
    String chiave= "";
    for (int i=0; i<K;i++){
    String lettera = inDati.getString("Inserisci la lettera"+ i+1 + "-esima che forma la chiave");
    chiave = chiave + lettera;
    intposizione = alfabetoinChiaro.indexOf(lettera.charAt(0));
    intposizione2 = alfabetoinChiaro.indexOf("A");
    String alfabetoTagliato1 = alfabetoinChiaro.substring(posizione+1); //.substring (int) taglio dalla posizione indicata fino alla fine della stringa
    String alfabetoTagliato2 = alfabetoinChiaro.substring(posizione2, posizione+1); //.substring (int begin , int end): int begin è il punto di partenza, incluso; int end punto di arrivo escluso
    //uDati.printLine(alfabetoTagliato1);
    //uDati.printLine(alfabetoTagliato2);
    String alfabetoTagliato_reverse = new StringBuffer(alfabetoTagliato1).reverse().toString();
    String alfabetoTagliato2_reverse = new StringBuffer(alfabetoTagliato2).reverse().toString();
    //uDati.printLine(alfabetoTagliato_reverse);
    //uDati.printLine(alfabetoTagliato2_reverse);
    String alfabetoCodificato = alfabetoTagliato2_reverse + alfabetoTagliato_reverse;
    //uDati.printLine(alfabetoCodificato);
    String testoinChiaro = inDati.getString("Inserisci il testo da cifrare");
    for (int j=0; j<testoinChiaro.length(); j++){

    E qui mi sono bloccato! Spero mi possiate aiutare.
    Grazie per l'attenzione


    Ultima modifica di MrBlonde; 17-05-2015 a 15:29

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    mi sono bloccato, non riesco a capire come posso legare la frase data in input con la chiave e con l'alfabeto!
    Il codice, per come è scritto e postato qui, non è molto comprensibile. Comunque vedo svariati indexOf, substring, reverse, toString, che secondo me non servono proprio! Qui servirebbe solo un po' di matematica (e l'uso di charAt() di String).

    La prima lettera in chiaro è 'L'. Se consideriamo A=0, allora L ha indice 11.
    Siccome il carattere-chiave è 'Z' e il suo alfabeto va all'indietro, allora vuol dire che da 'Z' (indice logico 0) devi tornare indietro fino all'indice logico 11 .... che è la lettera 'O', appunto l'output "cifrato".

    Chiaramente è possibile che si debba fare il "giro". Che è il caso del 3° carattere in chiaro:

    La terza lettera in chiaro è 'N', ha indice 13. Il carattere-chiave è 'J', quindi da questo devi sottrarre 13. Andresti a -4 quindi devi fare il giro da Z, cioè Z .. Y .. X ... W !
    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
    Mar 2015
    Messaggi
    11
    Grazie per la risposta! Il fatto è che non devo semplicemente trascrivere l'esempio ma creare un programma che funzioni per ogni K dato dall'utente e per ogni lettera che l'utente mi da come formante la chiave. Non riesco a capire in che modo posso legare la lettera della parola in chiaro a quella della chiave per arrivare all'alfabeto cifrato!

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    Grazie per la risposta! Il fatto è che non devo semplicemente trascrivere l'esempio ma creare un programma che funzioni per ogni K dato dall'utente e per ogni lettera che l'utente mi da come formante la chiave. Non riesco a capire in che modo posso legare la lettera della parola in chiaro a quella della chiave per arrivare all'alfabeto cifrato!
    Ascolta, in ASCII/Unicode le lettere da 'A' a 'Z' hanno una codifica lineare da 65 a 90. Quindi di per sé non servirebbe nemmeno avere una stringa alfabetoinChiaro con le lettere da A a Z.

    Pertanto le cose sono due: o ragioni con matematica sui codici dei char oppure avendo una stringa "ABC ...... WXYZ" ragioni con matematica sugli indici in tale stringa.

    In entrambi i casi non servono substring, reverse, toString. Nel secondo caso per avere l'indice puoi appunto usare indexOf.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    11
    Ho semplicemente trovato più semplice crearmi l'alfabeto "modificato" e salvarlo su uno string buffer per ogni carattere che viene inserito come chiave. Il mio dubbio è questo: mi faccio dare le lettere che formano la String chiave (for (int i=0; i<K;i++){
    String lettera = inDati.getString("Inserisci la lettera"+ i+1 + "-esima che forma la chiave"); ) a questo punto come posso rendere la stringa che ho ottenuto, che dovrebbe essere formata da Z,N,J nella stringa presentata nell'esempio Z N J Z N J Z ? Dopo che ho ottenuto quella il gioco è fatto perchè avendo gli alfabeti nuovi uguaglio semplicemente la posizione della lettera nell'alfabeto in chiaro della parola da tradurre con quella dell'alfabeto criptato e trovo la lettera che voglio! Esempio prendo LINCONS, prima lettera L che nell'alfabeto in chiaro corrisponde alla pos 11, a questa posizione dell'alfabteto criptato Z =0 corrisponde O, la lettera cercata. Vorrei capire come posso quindi legare le lettere del testo in chiaro LINCONS con quelle della chiave in modo da attingere all'alfabeto corretto e come posso scrivere la stringa chiave come Z N J Z N J Z.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    Ho semplicemente trovato più semplice crearmi l'alfabeto "modificato" e salvarlo su uno string buffer per ogni carattere che viene inserito come chiave.
    Ma non serve!!

    Scenario 1, "matematica" sui char.

    Carattere in chiaro 'L' (codice ASCII 76), carattere-chiave 'Z' (codice ASCII 90).
    76-65 ('A') = 11 (offset da 'A')
    90-11 = 79 (codice ASCII di 'O', il risultato)


    Scenario 2, "matematica" sugli indici di una stringa "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    Carattere in chiaro 'L', lo cerchi con indexOf nella stringa alfabetoinChiaro e ottieni 11.
    Carattere-chiave 'Z', lo cerchi con indexOf nella stringa alfabetoinChiaro e ottieni 25.
    25-11 = 14
    Il carattere nella stringa alfabetoinChiaro all'indice 14 è 'O', il risultato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    11
    Sono riuscito a risolvere il problema e scrivere il codice a mio modo. Ora però sono interessato a farlo anche nel suo modo. Mi sono interessato allo Scenario 2. Vorrei capire come posso associare quando ho la String chiave e la String parola in chiaro, il primo valore della String chiave con il primo della String parola in chiaro.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    Sono riuscito a risolvere il problema e scrivere il codice a mio modo.
    E cioè, tecnicamente, cosa vuol dire "a modo mio"?

    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    Mi sono interessato allo Scenario 2. Vorrei capire come posso associare quando ho la String chiave e la String parola in chiaro, il primo valore della String chiave con il primo della String parola in chiaro.
    Ma scusa, l'esempio che avevo fatto non è chiaro?


    String alfabeto = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    testo in chiaro: L I N ......
    chiave: Z N J ......
    testo cifrato: O F W ......

    1) Indice di 'L' = 11, indice di 'Z' = 25 poi 25-11 = 14 e il carattere all'indice 14 di alfabeto è 'O'
    2) Indice di 'I' = 8, indice di 'N' = 13 poi 13-8 = 5 e il carattere all'indice 5 di alfabeto è 'F'
    3) Indice di 'N' = 13, indice di 'J' = 9 poi 9-13 = -4, siccome è negativo si aggiunge la lunghezza dell'alfabeto (26), quindi -4 + 26 = 22 e il carattere all'indice 22 di alfabeto è 'W'


    P.S. tra l'altro lo scenario 2 è quello meno efficiente, perché devi cercare un indice. O con una ricerca "lineare" (indexOf) oppure con la tecnica del binary search (se il contenuto di alfabeto è ordinato per codice e per A-Z è così).

    P.S.2: non ditemi che l'esempio qui non è chiaro .....
    Ultima modifica di andbin; 20-05-2015 a 09:25
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Mar 2015
    Messaggi
    11
    A modo mio, ovvero come avevo spiegato creando i nuovi alfabeti. Volevo sapere in modo pratico come faccio, dopo che mi è stata data la chiave e la parola da codificare a dire che alla L corrisponde la Z. Come legare il primo carattere della parola da codificare al primo carattere della parola chiave. Il meccanismo matematico l'ho capito.

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    come faccio, dopo che mi è stata data la chiave e la parola da codificare a dire che alla L corrisponde la Z. Come legare il primo carattere della parola da codificare al primo carattere della parola chiave.
    Se intendi dire, data la chiave "ZNJ" (solo 3 caratteri) come applicarla ad una qualunque stringa in input es. "PINCOPALLA", dovresti averlo già fatto, perché questo è indifferente dall'algoritmo di transcodifica (il tuo modo o i due scenari che ho detto io).

    In "PINCOPALLA" gli indici vanno da 0 a 9, mentre nella chiave questi stessi indici saranno "modulo" 3 (lunghezza della chiave), quindi 0 1 2 0 1 2 .....

    E questo, ripeto, non c'entra con la tecnica utilizzata per la transcodifica.

    Quote Originariamente inviata da MrBlonde Visualizza il messaggio
    Il meccanismo matematico l'ho capito.
    E allora applicalo, bastano (a livello basilare) charAt (per prendere i caratteri nella chiave e nell'input) e indexOf (per cercare l'indice dei caratteri) di String.
    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.