Problemas con cifrado RSA
Publicado por Antonio (9 intervenciones) el 16/01/2007 10:31:10
Buenas a todos,
Tengo un problema que no se como resolver, y tras pasar un par de días mirando por internet posibles soluciones no he conseguido encontrar nada.
Mi problema es que estoy intentando cifrar ficheros de unos 20kb. con cifrado asimétrico de clave privada y clave pública, utilizando el algoritmo RSA, y al tratar de cifrar el texto plano, me da el siguiente error.
java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
El tamaño de la clave es el típico 1024 (keyPair.initialize(1024);). Por lo que he visto en internet hay bastante gente que tiene este problema, ¿alguien sabe como solucionarlo?
Muchas gracias y un saludo.
Os dejo el código para más ayuda
package cifrado;
import java.security.*;
import javax.crypto.*;
import javax.crypto.interfaces.*;
import javax.crypto.spec.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.io.*;
public class FuncionaRSA {
/* Ejemplo de uso de funciones de resumen Hash
* carga el fichero que recibe como parametro y genera el resumen
*/
public static void main (String[] args) throws Exception {
// Comprobar argumentos
/*if (args.length !=1) {
mensajeAyuda();
System.exit(1);
}*/
try {
/* Cargar "provider" (sólo si no se usa el que viene por defecto) */
Security.addProvider(new BouncyCastleProvider()); // Usa provider BC
//
/* PASO 1: Crear e inicializar clave */
String textoPlano = "";
KeyPairGenerator keyPair = KeyPairGenerator.getInstance("RSA");
keyPair.initialize(1024);
KeyPair clave = keyPair.genKeyPair();
PrivateKey clavePrivada1 = clave.getPrivate();
PublicKey clavePublica1 = clave.getPublic();
System.out.println("CLAVE PRIVADA:" + new String(clavePrivada1.toString()));
System.out.println("CLAVE PUBLICA:" + new String(clavePublica1.toString()) + "\n");
/* PASO 2: Crear cifrador */
//Cipher cifrador= Cipher.getInstance("DES/ECB/PKCS5Padding");
Cipher cifrador = Cipher.getInstance("RSA/ECB/PKCS1Padding","BC");
// Algoritmo DES
// Modo : ECB (Electronic Code Book)
// Relleno : PKCS5Padding
//
/* PASO 3a: Inicializar cifrador en modo CIFRADO */
cifrador.init(Cipher.ENCRYPT_MODE, clavePublica1);
byte[] bufferPlano = new byte[1024];
byte[] bufferCifrado;
//File fichero = new File("C://Antonio//21122006_090914.xml");
File fichero = new File("C://Antonio//22122006_122247.xml");
System.out.println("El fichero es !"+fichero);
//FileInputStream in = new FileInputStream(args[0]);
FileInputStream in = new FileInputStream(fichero);
int bytesLeidos = in.read(bufferPlano,0, 1024);
int total = 0;
while(bytesLeidos != -1) { // Mientras no se llegue al final del fichero
textoPlano = textoPlano + new String(bufferPlano);
bytesLeidos = in.read(bufferPlano,0, 1024);
total += bytesLeidos;
System.out.println("bytesleidos "+total);
}
in.close();
byte[] textofinal = textoPlano.getBytes();
/* Leer fichero de 1k en 1k y pasar fragmentos leidos al cifrador */
byte[] cipherText = cifrador.doFinal(textofinal);
System.out.println("resultado "+new String(cipherText,"UTF-8"));
cifrador.init(Cipher.DECRYPT_MODE, clavePrivada1);
byte[] newPlainText = cifrador.doFinal(cipherText);
System.out.println("resultado2 \n"+new String(newPlainText,"UTF-8"));
} catch (java.security.NoSuchAlgorithmException e){
System.out.println("Excepcion "+e);
}
}
public static void mensajeAyuda() {
System.out.println("Ejemplo cifrado RSA");
System.out.println();
}
}
Tengo un problema que no se como resolver, y tras pasar un par de días mirando por internet posibles soluciones no he conseguido encontrar nada.
Mi problema es que estoy intentando cifrar ficheros de unos 20kb. con cifrado asimétrico de clave privada y clave pública, utilizando el algoritmo RSA, y al tratar de cifrar el texto plano, me da el siguiente error.
java.lang.ArrayIndexOutOfBoundsException: too much data for RSA block
El tamaño de la clave es el típico 1024 (keyPair.initialize(1024);). Por lo que he visto en internet hay bastante gente que tiene este problema, ¿alguien sabe como solucionarlo?
Muchas gracias y un saludo.
Os dejo el código para más ayuda
package cifrado;
import java.security.*;
import javax.crypto.*;
import javax.crypto.interfaces.*;
import javax.crypto.spec.*;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.io.*;
public class FuncionaRSA {
/* Ejemplo de uso de funciones de resumen Hash
* carga el fichero que recibe como parametro y genera el resumen
*/
public static void main (String[] args) throws Exception {
// Comprobar argumentos
/*if (args.length !=1) {
mensajeAyuda();
System.exit(1);
}*/
try {
/* Cargar "provider" (sólo si no se usa el que viene por defecto) */
Security.addProvider(new BouncyCastleProvider()); // Usa provider BC
//
/* PASO 1: Crear e inicializar clave */
String textoPlano = "";
KeyPairGenerator keyPair = KeyPairGenerator.getInstance("RSA");
keyPair.initialize(1024);
KeyPair clave = keyPair.genKeyPair();
PrivateKey clavePrivada1 = clave.getPrivate();
PublicKey clavePublica1 = clave.getPublic();
System.out.println("CLAVE PRIVADA:" + new String(clavePrivada1.toString()));
System.out.println("CLAVE PUBLICA:" + new String(clavePublica1.toString()) + "\n");
/* PASO 2: Crear cifrador */
//Cipher cifrador= Cipher.getInstance("DES/ECB/PKCS5Padding");
Cipher cifrador = Cipher.getInstance("RSA/ECB/PKCS1Padding","BC");
// Algoritmo DES
// Modo : ECB (Electronic Code Book)
// Relleno : PKCS5Padding
//
/* PASO 3a: Inicializar cifrador en modo CIFRADO */
cifrador.init(Cipher.ENCRYPT_MODE, clavePublica1);
byte[] bufferPlano = new byte[1024];
byte[] bufferCifrado;
//File fichero = new File("C://Antonio//21122006_090914.xml");
File fichero = new File("C://Antonio//22122006_122247.xml");
System.out.println("El fichero es !"+fichero);
//FileInputStream in = new FileInputStream(args[0]);
FileInputStream in = new FileInputStream(fichero);
int bytesLeidos = in.read(bufferPlano,0, 1024);
int total = 0;
while(bytesLeidos != -1) { // Mientras no se llegue al final del fichero
textoPlano = textoPlano + new String(bufferPlano);
bytesLeidos = in.read(bufferPlano,0, 1024);
total += bytesLeidos;
System.out.println("bytesleidos "+total);
}
in.close();
byte[] textofinal = textoPlano.getBytes();
/* Leer fichero de 1k en 1k y pasar fragmentos leidos al cifrador */
byte[] cipherText = cifrador.doFinal(textofinal);
System.out.println("resultado "+new String(cipherText,"UTF-8"));
cifrador.init(Cipher.DECRYPT_MODE, clavePrivada1);
byte[] newPlainText = cifrador.doFinal(cipherText);
System.out.println("resultado2 \n"+new String(newPlainText,"UTF-8"));
} catch (java.security.NoSuchAlgorithmException e){
System.out.println("Excepcion "+e);
}
}
public static void mensajeAyuda() {
System.out.println("Ejemplo cifrado RSA");
System.out.println();
}
}
Valora esta pregunta


0