Problema cifratura XOR

di il
13 risposte

Problema cifratura XOR

Salve ragazzi ho un problemino... non so come creare un programma di cifratura xor in java.
in c ne ho creato uno... ilo quale prendeva ogni singola lettera e faceva lo xor con l'operatore bitwise(^)del codice ASCII... ora pero nn so come farlo in java potreste spiegarmelo anche con un piccolo esempio se è possibile? grazie a tutti in anticipo

13 Risposte

  • Re: Problema cifratura XOR

    Ciao! Non ho ben capito fra cosa fai lo XOR, però in linea generale dovrebbe essere una cosa del tipo:
    
    public class XorCrypto {
    	
    	private char key;
    	
    	public XorCrypto(char key){
    		this.key = key;
    	}
    	
    	public char encrypt(char c){
    		return (char) (c^key);
    	}
    	
    	public char decrypt(char c){
    		return (char) (c^key);
    	}
    }
    
  • Re: Problema cifratura XOR

    Ciao Della Scusa se nn mi sono spiegato bene... io voglio fare lo xor bit a bit di una lettera....
    cmq nn ho capito perché hai scritto questo metodo
      public XorCrypto(char key){
          this.key = key;
       }
    o meglio nn capisco perché mi da errore!!?
    dice che vuole una return ma tu nn l'hai messa quindi perché mi da errore?
    poi un' altra cosa nn so come scrivere il testo da tastiera o meglio so che si può usare il metodo Scanner della classe java.util; Ma ho letto da qualche parte che la variabile char nn è modificabile in run time quindi come faccio?
  • Re: Problema cifratura XOR

    Per la lettura può esserti utile questa classe che ho realizzato:

    import java.io.InputStreamReader;
    import java.io.BufferedReader;
    import java.io.IOException;

    /**
    * La classe che permette, creando un BufferedReader, l'acquisizione di int, String, float, char e double da tastiera
    */
    public class Lettura_da_tastiera {

    /**
    * Il BufferedReader utilizzato
    */
    private static BufferedReader br;
    /**
    * La stringa letta
    */
    private static String _String;
    /**
    * L'int letto
    */
    private static int _int;
    /**
    * Il char letto
    */
    private static char _char;
    /**
    * Il float letto
    */
    private static float _float;
    /**
    * Il double letto
    */
    private static double _double;

    /**
    * Permette l'acquisizione di una stringa da tastiera
    * @return La stringa acquisita
    */
    public static String readString() {
    br = new BufferedReader(new InputStreamReader(System.in));
    try
    {
    _String = br.readLine();
    }
    catch (IOException e)
    {
    System.out.println ("errore di flusso");
    }

    return(_String);
    }

    /**
    * Permette l'acquisizione di un intero da tastiera
    * @return L'intero acquisito
    */
    public static int readInt()
    {
    br = new BufferedReader(new InputStreamReader(System.in));

    try
    {
    _String = br.readLine();
    _int = Integer.parseInt(_String);
    }
    catch (IOException e1)
    {
    System.out.println ("errore di flusso");
    }
    catch (NumberFormatException e2)
    {
    System.out.println ("errore di input da tastiera");
    return(0);
    }

    return(_int);
    }

    /**
    * Permette l'acquisizione di un carattere da tastiera
    * @return Il carattere acquisito
    */
    public static char readChar()
    {
    br = new BufferedReader(new InputStreamReader(System.in));

    try
    {
    _String = br.readLine();

    if (_String.length() > 1)
    throw new NumberFormatException();

    _char = _String.charAt(0);
    }
    catch (IOException e1)
    {
    System.out.println ("errore di flusso");
    }
    catch (NumberFormatException e2)
    {
    System.out.println ("errore di input da tastiera");
    return(0);
    }

    return(_char);
    }

    /**
    * Permette l'acquisizione di un numero reale da tastiera
    * @return Il numero reale acquisito
    */
    public static float readFloat()
    {
    br = new BufferedReader(new InputStreamReader(System.in));

    try
    {
    _String = br.readLine();
    _float = Float.parseFloat(_String);
    }
    catch (IOException e1)
    {
    System.out.println ("errore di flusso");
    }
    catch (NumberFormatException e2)
    {
    System.out.println ("errore di input da tastiera");
    return(0);
    }

    return(_float);
    }

    /**
    * Permette l'acquisizione di un numero complesso da tastiera
    * @return Il numero complesso acquisito
    */
    public static double readDouble()
    {
    br = new BufferedReader(new InputStreamReader(System.in));

    try
    {
    _String = br.readLine();
    _double = Double.parseDouble(_String);
    }
    catch (IOException e1)
    {
    System.out.println ("errore di flusso");
    }
    catch (NumberFormatException e2)
    {
    System.out.println ("errore di input da tastiera");
    return(0);
    }

    return(_double);
    }
    }

    quindi farai lettura_da_tastiera.readString()
  • Re: Problema cifratura XOR

    Quel metodo è un costruttore, e l'errore che dici è dovuto al fatto che hai indicato un valore di ritorno, mentre nel costruttore non bisogna indicarlo. Se vuoi approfondire puoi leggere qua .

    Per quanto riguarda la domanda iniziale, lo XOR vuoi farlo fra una lettera e cos'altro? Perché se fai lo XOR di una lettera con se stessa il risultato è sempre 0, visto che i bit sono gli stessi! Nel codice che ti avevo postato, lo XOR veniva fatto fra un char e una chiave "segreta" (la variabile "key") che veniva passata tramite il costruttore.

    Per leggere da tastiera, invece, puoi usare la classe di mark oppure questi metodi:
     
    /*
      * La classe scanner non prevede un metodo per la lettura di un singolo carattere
      */
    Scanner scanner = new Scanner(System.in); //Creo uno scanner
    String s = scanner.nextLine(); //Leggo da tastiera una riga
    char c = s.charAt(0); //Prendo il primo carattere della riga
    
  • Re: Problema cifratura XOR

    Della grazie mille... Allora ho scritto il metodo inserisci poi ho fatto ritornare la variabile char c ma ora nn so come invocarla dal metodo xor() puoi darmi un consiglio?
    poi come faccio a fare lo xor fra la chiave ed il testo inserito?
    
    public class Cripta {
     
    private char key;
       public char  inserisci(){
       Scanner scanner = new Scanner(System.in); //Creo uno scanner
    String s = scanner.nextLine(); //Leggo da tastiera una riga
    char c = s.charAt(0);
    for(int i=0;i <s.length();i++){
    c=s.charAt(i);
    System.out.print(c);
    }
    
    return c; 
       }
       public void xor(){
       
           
       
       }
     
        public static void main(String[] args) {
    Cripta a = new Cripta();
    a.inserisci();
        
        
        }
    
    Grazie ancora della
  • Re: Problema cifratura XOR

    Beh lo xor si fa con il simbolo ^, quindi potresti usare una variabile privata "key" in cui memorizzi la chiave segreta. Poi fai "char encrypted = c ^ key;"

    Non capisco però a cosa ti serve il ciclo for Nel metodo "inserisci"!
  • Re: Problema cifratura XOR

    Cavoloooo ho sbagliato... Pensavo di poter salvare tutto quello che inserivo da tastiera nella variabile c ma mi sbagliavo infatti salva solo la 1 lettera cavolo....Della puoi suggerirmi un metodo che salvi nella variabile c tt quello che viene inserito da tastiera?...Poi nn mi fa fare lo xor ho fatto come hai detto tu e mi da il seguente errore:"possible loss of pecision required char found int" come faccio?...
    Grazie.
  • Re: Problema cifratura XOR

    Se vuoi salvare tutto devi usare una variabile di tipo string e non char!
    Comunque puoi postare il codice in c che avevi fatto?
  • Re: Problema cifratura XOR

    Ciao ecco il codice C
    #include <stdio.h>
    # define KEY '&'
    
    int main(void){
    
    int originchar,newchar;
    while(originchar= getchar() != EOF){
    newchar=originchar ^ KEY;
    if(isprint(originchar)&& isprint(newchar))
    putchar(newchar);
    else
    putchar(originchar);
    }
    return 0;
    }
    cmq come faccio lo a fargli fare lo xor ?
  • Re: Problema cifratura XOR

    Ciao! Dunque, la classe che si occupa di "fare il lavoro" potrebbe essere questa:
    
    public class Crypto {
    
    	private char key;
    	
    	/**
    	 * Costruttore di default. La chiave segreta è impostata a '&'
    	 */
    	public Crypto(){
    		this.key = '&';
    	}
    	
    	/**
    	 * Con questo costruttore è possibile specificare una chiave diversa da '&'
    	 * @param key 
    	 */
    	public Crypto(char key){
    		this.key = key;
    	}
    	
    	public char encrypt(char c){
    		char result = (char) (c^key);
    		if (Character.isISOControl(result))
    			System.out.println("Not printable char: "+result);
    		else
    			System.out.println("Printable char: "+result);
    		return result;
    	}
    	
    	public char decrypt(char c){
    		char result = (char) (c^key);
    		if (Character.isISOControl(result))
    			System.out.println("Not printable char: "+result);
    		else
    			System.out.println("Printable char: "+result);
    		return result;
    	}
    
    }
    
    mentre la classe principale potrebbe essere quest'altra:
    import java.util.Scanner;
    
    
    public class Main {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Scanner sc = new Scanner(System.in);
    		Crypto crypto1 = new Crypto(); //Classe con la chiave '&'
    		Crypto crypto2 = new Crypto('a'); //Classe con chiave 'a'
    		while (sc.hasNext()){ //è un loop infinito poiché l'input è la tastiera
    			char readChar = sc.nextLine().charAt(0); //Prendo il primo carattere
    			char c1 = crypto1.encrypt(readChar);
    			char c2 = crypto2.encrypt(readChar);
    			System.out.println(c1);
    			System.out.println(c2);
    		}
    	}
    
    }
    
  • Re: Problema cifratura XOR

    Woo grazie Della
    char result = (char) (c^key);
    finalmente grazie
    public class codifica {
     
    private char key = '&';
       public void   inserisci(){
       Scanner scanner = new Scanner(System.in); //Creo uno scanner
    String s = scanner.nextLine(); //Leggo da tastiera una riga
    for(int i=0; i < s.length();i++){
    char c = s.charAt(i);
    char cripta =(char) (c ^ key);
    System.out.print(cripta);
    }
       }
       
        public static void main(String[] args) {
    Cripta a = new Cripta();
    a.codifica();
        
        
        }
    ehm.. cosa ne pensi?

    ps: e se invece volessi farlo con una stringa , come dovrei fare lo xor?
    perché se ho capito bene qusta variabile memorizza lo xor convertito da int a char
    
    char cripta= (char) (c ^key);
    giusto?
  • Re: Problema cifratura XOR

    Beh se vuoi fare lo xor di una stringa penso che tu debba fare lo xor di ogni singolo carattere:
    public char encrypt(String s){
          String result = "";
          for (int i=0; i<s.length; i++){
                 result += (char) (s.charAt(i) ^ key);
          }
          return result;
       }
    Comunque si, quell'istruzione fa lo xor (operazione che restituisce un int) e fa un cast da int a char.
  • Re: Problema cifratura XOR

    Bene grazie Della
Devi accedere o registrarti per scrivere nel forum
13 risposte