Java - Problemas encriptando y desencriptando en java

 
Vista:

Problemas encriptando y desencriptando en java

Publicado por Pepe (1 intervención) el 19/06/2009 21:02:30
Hice una clase para encriptar y desencriptar en java pero me está dando problemas con algunas palabras. Estoy utilizando RC4, algunas palabras me las encripta y desencripta bien pero otras las encripta y cuando voy a desencriptar aparecen caracteres cambiados. No se por que será, si alguien me pudiera ayudar al respecto. Muchas gracias

El codigo para encriptar es este:

SecretKeySpec key = new SecretKeySpec(llave.getBytes(), "RC4");
Cipher cipher = Cipher.getInstance("RC4");
cipher.init(Cipher.ENCRYPT_MODE, key);
return new String(cipher.doFinal(texto.getBytes("ISO-8859-1")), "ISO-8859-1");

El de desencriptar es este:

SecretKeySpec key = new SecretKeySpec(llave.getBytes(), "RC4");
Cipher cipher = Cipher.getInstance("RC4");
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] cipherText = texto.getBytes("ISO-8859-1");
byte[] plainText = cipher.doFinal(cipherText);
return new String(plainText, "ISO-8859-1");
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problemas encriptando y desencriptando en java

Publicado por Luz Sabina Martínez (3 intervenciones) el 19/06/2009 21:57:06
Hola, mira a lo mejor esta clase te sirve

:)

package encriptar;

/*
* RSA.java
*
* Creado 24 de octubre de 2007, 12:02 PM
*
*/
import java.math.BigInteger;
import java.util.*;
import java.io.*;

/**
*
* @author Casidiablo
*/
public class RSA {

int tamPrimo;
BigInteger n, q, p;
BigInteger totient;
BigInteger e, d;

/** Constructor de la clase RSA */
public RSA(int tamPrimo) {
this.tamPrimo = tamPrimo;
}

public void generaPrimos()
{
p = new BigInteger(tamPrimo, 10, new Random());
do q = new BigInteger(tamPrimo, 10, new Random());
while(q.compareTo(p)==0);
}

public void generaClaves()
{
// n = p * q
n = p.multiply(q);
// toltient = (p-1)*(q-1)
totient = p.subtract(BigInteger.valueOf(1));
totient = totient.multiply(q.subtract(BigInteger.valueOf(1)));
// Elegimos un e coprimo de y menor que n
do e = new BigInteger(2 * tamPrimo, new Random());
while((e.compareTo(totient) != -1) || (e.gcd(totient).compareTo(BigInteger.valueOf(1)) != 0));
// d = e^1 mod totient
d = e.modInverse(totient);
}

/**
* Encripta el texto usando la clave pública
*
* @param mensaje Ristra que contiene el mensaje a encriptar
* @return El mensaje cifrado como un vector de BigIntegers
*/
public BigInteger[] encripta(String mensaje)
{
int i;
byte[] temp = new byte[1];
byte[] digitos = mensaje.getBytes();
BigInteger[] bigdigitos = new BigInteger[digitos.length];

for(i=0; i<bigdigitos.length;i++){
temp[0] = digitos[i];
bigdigitos[i] = new BigInteger(temp);
}

BigInteger[] encriptado = new BigInteger[bigdigitos.length];

for(i=0; i<bigdigitos.length; i++)
encriptado[i] = bigdigitos[i].modPow(e,n);

return(encriptado);
}

/**
* Desencripta el texto cifrado usando la clave privada
*
* @param encriptado Array de objetos BigInteger que contiene el texto cifrado que será desencriptado
* @return The decrypted plaintext
*/
public String desencripta(BigInteger[] encriptado) {
BigInteger[] desencriptado = new BigInteger[encriptado.length];

for(int i=0; i<desencriptado.length; i++)
desencriptado[i] = encriptado[i].modPow(d,n);

char[] charArray = new char[desencriptado.length];

for(int i=0; i<charArray.length; i++)
charArray[i] = (char) (desencriptado[i].intValue());

return(new String(charArray));
}

public BigInteger damep() {return(p);}
public BigInteger dameq() {return(q);}
public BigInteger dametotient() {return(totient);}
public BigInteger damen() {return(n);}
public BigInteger damee() {return(e);}
public BigInteger damed() {return(d);}
}

package encriptar;

/*
* VentanaRSA.java
*
* Creado 25 de octubre de 2007, 04:00 PM
*
*/
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.math.BigInteger;
/**
*
* @author Casidiablo
*/
public class VentanaRSA extends JFrame implements ActionListener{

private JTextField cajaTamPrimo;
private JButton btnGenenerarClaves;
private ButtonGroup grupoBotonesOpcion;
private JRadioButton btnEncriptar, btnDesEncriptar;
private JTextArea areaOrigen, areaDestino;
private Container cntAreas, cntGenClaves;
private RSA rsa;
private BigInteger[] textoCifrado;
/** Constructor de la clase VentanaRSA */
public VentanaRSA() {
super("Interfaz Grafica - RSA");

getContentPane().setLayout(new BorderLayout(3,3));

cajaTamPrimo = new JTextField();
cajaTamPrimo.addActionListener(
new ActionListener() {
public void actionPerformed(ActionEvent evt) {
generarClaves();
}
});

btnGenenerarClaves = new JButton("Generar Claves");
btnGenenerarClaves.addActionListener(this);

btnEncriptar = new JRadioButton("Encriptar", false);
btnEncriptar.addActionListener( new ManejadorBotonOpcion() );
btnEncriptar.setEnabled(false);
btnDesEncriptar = new JRadioButton("Desencriptar", false);
btnDesEncriptar.addActionListener( new ManejadorBotonOpcion() );
btnDesEncriptar.setEnabled(false);

grupoBotonesOpcion = new ButtonGroup();
grupoBotonesOpcion.add(btnEncriptar);
grupoBotonesOpcion.add(btnDesEncriptar);

areaOrigen = new JTextArea();
areaOrigen.setWrapStyleWord(true);
areaOrigen.setLineWrap(true);
areaDestino = new JTextArea();
areaDestino.setLineWrap(true);
areaDestino.setEditable(false);

cntAreas = new Container();
cntGenClaves = new Container();

cntGenClaves.setLayout(new GridLayout(2,3));
cntGenClaves.add(new JLabel("Digita el tamaño del número primo: "));
cntGenClaves.add(cajaTamPrimo);
cntGenClaves.add(btnGenenerarClaves);
cntGenClaves.add(new JLabel("Digita el texto a cifar/descifrar:"));
cntGenClaves.add(btnEncriptar);
cntGenClaves.add(btnDesEncriptar);

cntAreas.setLayout(new GridLayout(1,2,5,5));
cntAreas.add(new JScrollPane(areaOrigen));
cntAreas.add(new JScrollPane(areaDestino));

getContentPane().add(cntGenClaves, BorderLayout.NORTH);
getContentPane().add(cntAreas, BorderLayout.CENTER);

setSize(650,300);
setVisible(true);
}

// manejar eventos de botón
public void actionPerformed( ActionEvent evento ) {
if(evento.getSource().equals(btnGenenerarClaves))
generarClaves();
}

//Generar primos
private void generarClaves() {
if(cajaTamPrimo.getText().equals(""))
JOptionPane.showMessageDialog(null,"No haz introducido el tamaño del primo", "Tenemos problemas", JOptionPane.ERROR_MESSAGE);
else {
rsa = new RSA(Integer.parseInt(cajaTamPrimo.getText()));
rsa.generaPrimos();
rsa.generaClaves();
JTextArea area = new JTextArea(20,50);
area.setEditable(false);
area.setLineWrap(true);
area.append("Tam clave: "+cajaTamPrimo.getText()+" ");
area.append("p:["+rsa.damep()+"] q:["+rsa.dameq()+"] ");
area.append("Clave publica (n,e): n:["+rsa.damen()+"] e:["+rsa.damee()+"] ");
area.append("Clave publica (n,d): n:["+rsa.damen()+"] d:["+rsa.damed()+"]");
JOptionPane.showMessageDialog(null, new JScrollPane(area),"Primos generados", JOptionPane.INFORMATION_MESSAGE);
btnEncriptar.setEnabled(true);
btnDesEncriptar.setEnabled(true);
}
}

// clase interna privada para manejar eventos de botón de opción
private class ManejadorBotonOpcion implements ActionListener {

// manejar eventos de botón de opción
public void actionPerformed( ActionEvent evento ) {
if(evento.getSource().equals(btnEncriptar)) {
if(areaOrigen.getText().equals(""))
JOptionPane.showMessageDialog(null,"No haz introducido datos para cifrar", "Tenemos problemas", JOptionPane.ERROR_MESSAGE);
else {
textoCifrado = rsa.encripta(areaOrigen.getText());
areaDestino.setText("");
for(int i=0; i<textoCifrado.length; i++)
areaDestino.append(textoCifrado[i].toString());
}
} else if(evento.getSource().equals(btnDesEncriptar)) {
if(areaOrigen.getText().equals(""))
JOptionPane.showMessageDialog(null,"No haz introducido datos para decifrar", "Tenemos problemas", JOptionPane.ERROR_MESSAGE);
else {
areaDestino.setText("");
String recuperarTextoPlano = rsa.desencripta(textoCifrado);
areaDestino.setText(recuperarTextoPlano);
}
}
}

} // fin de la clase interna privada ManejadorBotonOpcion*/

public static void main(String args[]) {
JFrame.setDefaultLookAndFeelDecorated(true);
JDialog.setDefaultLookAndFeelDecorated(true);
VentanaRSA ventana = new VentanaRSA();
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar