Cifrado RSA en Java: ¿Problemas de plataforma cruzada?

La situación

Estoy trabajando con el cifrado RSA en Java. Estoy tratando de 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 que ejecuta Mandriva Linux 2010. Estoy usando la misma clave pública, el par de claves privadas en ambas máquinas , Puede correctamente cifrar / descifrar datos en el teléfono Android, puede cifrar / descifrar datos correctamente en el servidor Linux, pero no puedo cifrar datos en el teléfono y luego descifrarlo en el servidor. Tengo malas excepciones de relleno. He confirmado que los datos están siendo enviados correctamente por el teléfono y está siendo analizado correctamente por el servidor. Como tal, no puedo entender por qué falla el descifrado. Puede alguien ayudarme con esto? Tal vez 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 que se encuentra aquí.
  • Mi clave de cifrado es 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. Se compiló a través de Eclipse en la máquina del servidor.
  • El programa que utiliza la biblioteca de cifrado del teléfono Android utiliza la biblioteca anterior. También fue construido con Eclipse.
  • El programa de servidor se creó utilizando Netbeans (ya que era más fácil en el momento de hacerlo).

Otras preguntas

  • ¿Existen otros algoritmos / librerías de cifrado de clave pública disponibles para Java? ¿Trabajan en varias plataformas? ¿Qué rendimiento se espera de ellos? Etc., etc. He mirado en esto y no he encontrado mucho; Tal vez estoy buscando con las palabras clave equivocadas.

¡Uf! Creo que eso es todo. ¡Gracias por su ayuda por adelantado!

2 Solutions collect form web for “Cifrado RSA en Java: ¿Problemas de plataforma cruzada?”

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

Editar Para responder a su pregunta, en Java, cuando recibe un cifrado del paquete de cifrado, normalmente lo hace con el código siguiente:

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

La cadena proporcionada a getInstance instruye el tiempo de ejecución para obtener una instancia de cifrado que utilizará el algoritmo AES, el modo de encadenamiento de bloque de cifrado y el PKCS5 Padding. Hay una serie de algoritmos y rellenos compatibles. Revisaría este documento de Oracle para obtener más información acerca del cifrado en Java.

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

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

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

Tal vez debería 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.

  • Cuando se usa Mono Touch, ¿puedo también empaquetar para una aplicación estándar de Windows?
  • Phonegap android - evento deviceready no disparado
  • ¿Cuál es la mejor manera de desarrollar una aplicación multi-móvil con soporte para bluetooth?
  • Desarrollo de una biblioteca de redes Android / iOS compartida
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.