para - Cifrado RSA: diferencia entre Java y Android
codigo para encriptar y desencriptar en java netbeans (3)
En primer lugar, parece que estás inicializando ambas cifras con la clave pública. El cifrado utiliza clave pública, descifrado utilizado clave privada. Espero que sea solo un error tipográfico.
También tuve muchos problemas con la encriptación RSA. Mucho fue de prueba y error. Te sugiero que pruebes con otro proveedor. Logré implementar RSA usando BouncyCastle.
Cipher wrapper = Cipher.getInstance("RSA", "BC");
wrapper.init(Cipher.ENCRYPT_MODE, publicKey);
encryptedData= wrapper.doFinal(unencryptedData);
Aunque, generé mi propio par de llaves ya que era una encriptación de sesión.
kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair kp = kpg.genKeyPair();
publicKey = kp.getPublic();
privateKey = kp.getPrivate();
Estoy usando RSA para cifrar nombre de usuario y contraseña en Android y descifrarlos en el servidor (tomcat 6, java 1.6). Cifrado de Android:
PublicKey pubKey = readPublicKeyFromFile(mod, ex);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
byte[] cipherData = cipher.doFinal(data);
return cipherData;
Descifrado Java Tomcat:
PrivateKey pubKey = readPrivateKeyFromFile(mod, ex);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, pubKey);
byte[] cipherData = cipher.doFinal(data);
return cipherData;
Si uso la parte android OUTSIDE android (solo en un método principal) funciona bien. Pero no dentro de mi Android (Emulador). En el lado del servidor, aparece el siguiente error:
javax.crypto.BadPaddingException: Blocktype mismatch: 0
at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:311)
at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:255)
at com.sun.crypto.provider.RSACipher.a(DashoA13*..)
at com.sun.crypto.provider.RSACipher.engineDoFinal(DashoA13*..)
at javax.crypto.Cipher.doFinal(DashoA13*..)
Guardo el mod y ex como constantes de BigIntegers, así que no los escribo en un archivo. Sé que hay una diferencia entre el cifrado java1.6 y java 1.5, por lo que ambos se compilan con Java 1.6.
Alguna información de depuración:
Durante la depuración en Android, puedo ver que pubKey contiene módulo y exponente en hexadecimal. Y si depuro en un método principal (de nuevo el mismo código) puedo ver que pubKey contiene módulo y exponente en decimal.
¿Qué estoy haciendo mal?
Gracias
Estoy haciendo RSA Encrypt en Android 2.2+ y descifré en un servidor tomcat 6 java 1.6.
Estaba obteniendo este problema exacto, leyendo por todos lados y en parte gracias a la respuesta de @Femi, encontré lo que necesitaba.
La solución fue usar la siguiente especificación de algoritmo para el Cipher:
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
Esto funciona haciendo el cifrado desde los teléfonos inteligentes Android y BlackBerry. Sé que han pasado cuatro meses desde que se hizo la pregunta, pero solo en caso de que alguien más tenga este problema.
Sugiero que utilice la inicialización de cifrado específico: como ejemplo,
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
funcionará en ambos. La excepción que está recibiendo ( BadPaddingException ) está ocurriendo porque el relleno de inicialización de cifrado predeterminado parece ser diferente entre la JVM de escritorio y la JVM de Android.