10

La situaciónCifrado RSA en Java: ¿Problemas con la plataforma cruzada?

Estoy trabajando con el cifrado RSA en Java. Intento cifrar datos en un teléfono desarrollador HTC Saphire (32B) equipado con Android 2.2 de Cyanogenmod y luego descifrar dichos datos en un servidor de 64 bits con Mandriva Linux 2010. Estoy usando la misma llave pública, par de clave privada en ambas máquinas , puede encriptar/descifrar datos en el teléfono Android, puede encriptar/descifrar datos en el servidor Linux, pero no puedo encriptar los datos en el teléfono y luego descifrarlos en el servidor. Tengo malas excepciones de relleno. Confirmé que el teléfono está enviando correctamente los datos y el servidor los está analizando correctamente. Como tal, no puedo entender por qué el descifrado falla. Puede alguien ayudarme con esto? Quizás el algoritmo RSA en Java tiene alguna suposición subyacente sobre el tamaño de la palabra?

Más información:

  • Mi biblioteca de cifrado/descifrado se basa en la guía encontró here.
  • Mi clave de cifrado es de 2048 bits de longitud, pero veo un comportamiento similar con diferentes tamaños de clave.
  • He empaquetado mi código de cifrado/descifrado RSA en un archivo jar. Fue compilado a través de Eclipse en la máquina del servidor.
  • El programa que utiliza la biblioteca de cifrado en el teléfono Android utiliza la biblioteca anterior. También fue construido usando Eclipse.
  • El programa del servidor se creó utilizando Netbeans (ya que era más fácil hacerlo en ese momento).

Otras preguntas

  • ¿Hay otros algoritmos de cifrado de clave pública/bibliotecas libres disponibles para Java? ¿Funcionan multiplataforma? ¿Qué rendimiento uno esperaría de ellos? Etc., etc. He investigado esto y no he encontrado mucho; tal vez estoy buscando con las palabras clave incorrectas.

¡Uf! Creo que eso es todo. ¡Gracias por tu ayuda con anticipación!

+0

Algún algoritmo debe funcionar multiplataforma, el problema está en su código (o configuración) muy probablemente – bestsss

+0

Config, ¿eh? ¿Qué es configurable sobre RSA? ¿Cómo haría esto en Java? ¿Podría proporcionar un enlace a un tutorial? No quiero tomar su tiempo, pero tener un experto (o persona con experiencia) como usted me señala en la dirección correcta realmente me hará la vida más fácil. –

+0

(sry se escapó para la cena) Me refiero a la configuración como clave pública/privada, el mal relleno es causado principalmente por un par de claves mal intercambiadas. Si está seguro y, por alguna razón, Android no es compatible con el mismo relleno que el sol. puede probar http://www.bouncycastle.org/ btw, ¿cómo encripta/descifra datos en el mismo dispositivo/máquina? – bestsss

Respuesta

12

El cifrado RSA (o cualquier algoritmo de cifrado) debería funcionar independientemente del entorno. Sin embargo, es posible que ciertos sistemas realicen suposiciones diferentes sobre el relleno predeterminado y el modo de operación. Asegúrese de que cuando realiza cifrado y descifrado, no solo especifique el algoritmo, sino también el modo de operación (CBC, etc.) y el relleno. Si eso no funciona, sugiero publicar su código tanto en el dispositivo como en el servidor para que podamos examinarlo más de cerca.

Editar Para hacer frente a su pregunta, en Java, cuando se obtiene un sistema de cifrado del paquete de cifrado, por lo general lo hace con el siguiente código:

Cipher cipher; 
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 

La cadena entregada a getInstance indica al tiempo de ejecución para obtener una instancia de cifrado que utilizará el algoritmo AES, el modo de operación de encadenamiento de bloques de cifrado y el relleno PKCS5. Hay una serie de algoritmos y almohadillas compatibles.Revisaría this document from Oracle para obtener más información sobre el cifrado en Java.

Para ser más específicos, la cadena que se utiliza para solicitar un sistema de cifrado está en el formato

<algorithm>/<mode of operation>/<padding> 

Para empeorar las cosas, a pesar de Java que proporciona una serie de algoritmos, modos de operación y juntas, no todos ellos trabajarán juntos. Deberá leer la documentación para encontrar una cadena de configuración que funcione.

+0

¿Cómo se especificaría el modo de operación y el relleno? En realidad, no estoy al tanto de todas las opciones que puedo alternar cuando uso RSA. ¿Tengo algún buen enlace con el que pueda comenzar, o algún consejo general? –

+0

Su enlace y consejo parecen extremadamente prometedores. No puedo intentarlo ahora, pero a partir del miércoles podría tener la oportunidad; Trataré de informar lo antes posible cuando lo haga. Solo para asegurarme de que te entiendo, cada vez que creo el cifrado, especifico el algoritmo, el modo y el relleno, y esto podría _potencialmente_ aclarar cualquier suposición dependiente de la plataforma que se realice, ¿verdad? –

+0

Esto funcionó bien; debe haber habido alguna suposición hecha sobre la que previamente no tenía control. ¡Gracias por tu ayuda! –

0

Quizás deba hacer una suma de comprobación de los datos y asegurarse de que es exactamente lo que desea pasar a las API de cifrado/descifrado.

+0

Ah, ya estoy realizando sumas de comprobación. Como dije, los datos parecen estar llegando muy bien (y se pueden descifrar en el sistema que lo creó), pero los datos cifrados en el teléfono no se pueden descifrar en el dispositivo. Sin embargo, gracias por el consejo! –