0 votos
por (320 puntos) en Java
Bueno, os dejo el enunciado del ejercicio para que lo entendáis:

Escribe una función de encriptación: Se le pasará como parámetros dos cadenas, la primera será

el dato y la segunda la clave. Devuelve la cadena encriptada mediante XOR elemento a elemento de

la frase con la clave (la clave se repetirá sucesivamente si es necesario).

En el programa principal Se pide una frase al usuario y una clave. Luego se mostrará la frase

encriptada y nuevamente desencriptada.

Bueno, pues no se como hacerlo, tengo una ligera idea, supongo que hay que recorrer la cadena con un bucle pero no se como encriptarla con otra cadena, en que consiste la encriptación con XOR?


5 Respuestas

0 votos
por (8.5k puntos)
Buenas,

Esto consiste en el cifrado de texto de clave simétrica, basado en la función XOR (mensaje ^ clave). El proceso de cifrado de una cadena de texto consiste en los siguientes pasos:

    Serialización de la cadena: para obtener una secuencia de bytes a partir de la cadena de texto.

<pre><code>public static byte[] serializa(String texto) {
        return texto.getBytes();
    }</code>
    Cifrado de la secuencia de bytes, donde cada byte cifrado se obtiene de hacer un XOR entre el byte sin cifrar y la clave.

<pre><code>public static void cifra(byte mensaje[], byte clave[]) {
        for (int i=0,j=0; i<mensaje.length; i++, j++)
        {
            if (i  == clave.length) //si la clave es mas corta que el mensaje
                j = 0;
            mensaje[i]= (byte) (mensaje[i] ^ clave[j]);
        }
    }</code>
El proceso para realizar el descifrado es el inverso:

    Descifrado de la secuencia de bytes. Esta operación es equivalente a realizar un nuevo cifrado XOR con la misma clave ([b XOR c] XOR c = b).

    Deserialización de la cadena: se obtiene una cadena de texto a partir de la secuencia de bytes descifrada.

<pre><code>public static String deserializa(byte[] mensaje) {
        return new String(mensaje);
    }</code>
Espero que eso te ayude,


0 votos
por (320 puntos)
Vaya, mira que me he roto la cabeza pensando alguna forma y no habia caido en el getByte, claro como no lo vimos en clase jajaja.

Muchas gracias.

Un saludo.


0 votos
por (320 puntos)
Si en el main pongo esto no me funciona, creo que el problema esta en la declaración de los arrays, que no se como llenarlos con las cadenas serializadas:

<pre lang='lenguaje'>

public static void main (String []args){
    Scanner sc = new Scanner (System.in);

    String cadenaDato, cadenaClave;

    System.out.println("Introduce una frase para encriptarla");
    cadenaDato=sc.nextLine();

    System.out.println("Ahora introduce una clave");
    cadenaClave=sc.nextLine();

    pasarAByte(cadenaDato);
    pasarAByte(cadenaClave);

    byte dato[] = new byte [cadenaDato.length()];
    byte clave[] = new byte [cadenaClave.length()];

    encriptacionXOR(dato, clave);
}

0 votos
por (8.5k puntos)
me falta saber que hace el método pasarAByte(String x)...pero debería hacer algo como el serializa que te ponía en el anterior mensaje:


public static byte[] serializa(String texto) {
        return texto.getBytes();
    }

Y para usarlo en tu código debería de ser algo así:



byte dato[] = pasarAByte(cadenaDato);

0 votos
por (320 puntos)
Bueno, aqui os dejo una version del mismo programa un poco mas corta con una sola funcion:

<pre lang='languaje'>
import java.util.Scanner;

public class Ejercicio5 {

/**
 * Funcion que encripta o desencripta una cadena con una clave
 *
 *@param dato es la cadena encriptada
 *@param clave es la cadena con la que se encripta el dato
 *
 *@return el dato encriptado o desencriptado
 */
    public static String encriptacion(String dato, String clave){
        String datoEncriptado="";

        if (dato.length() > clave.length()) {
            for (int i=0; i<dato.length(); i++)
                clave+=clave.charAt(i);
        }

        for (int i=0; i<dato.length(); i++){
            datoEncriptado+=(char) (dato.charAt(i)^clave.charAt(i));
        }

        return datoEncriptado;
    }

    public static void main (String []args){
        Scanner sc = new Scanner (System.in);

        String dato, clave, datoEncriptado;

        System.out.println("============");
        System.out.println("Encriptacion");
        System.out.println("============n");

        System.out.println("Introduce una frase para encriptarla");
        dato=sc.nextLine();

        System.out.println("Ahora introduce una clave");
        clave=sc.nextLine();

        System.out.print("Dato encriptado: ");
        System.out.println(datoEncriptado=encriptacion(dato, clave));
        System.out.print("Dato desencriptado: "+encriptacion(datoEncriptado, clave));

    }
}

Preguntas relacionadas

+1 voto
3 respuestas
preguntado por anónimo Feb 9, 2016 en Java
0 votos
4 respuestas
preguntado por MarkNebraska (320 puntos) Ene 28, 2016 en Java
0 votos
0 respuestas
preguntado por ppito (20 puntos) Ene 28, 2016 en .Net
Bienvenido a Dudas de Programación, donde puedes hacer preguntas y recibir respuestas sobre los problemas más frecuentes de los lenguajes de programación, frameworks de desarrollo y bases de datos que utilices. Foro de Línea de Código

Categorías

...