Descodificación RSA con clave pública

Tengo algunos problemas de descifrado en mi proyecto de Android.

Estoy recibiendo una cadena firmada con una clave privada y tengo que verificarla (descifrarla) con una clave pública. Me gustaría obtener exactamente el mismo resultado que si estuviera utilizando una función PHP – openssl_public_decrypt ( http://php.net/manual/pl/function.openssl-public-decrypt.php )

Tengo que hacer esto en mi proyecto de Java, así que puedo utilizar libs de Java (por ejemplo BouncyCastle, o algo más, cualquier recomendación?)

¿Alguna idea de como resolver esto?

Ok, aquí está mi código. Estoy recibiendo la clave pública como esta

PEMReader reader = new PEMReader(new InputStreamReader(ctx .getAssets().open("pubkey.pem"))); Object obj; while ((obj = reader.readObject()) != null) { if (obj instanceof RSAPublicKey) { pubKey = (RSAPublicKey) obj; return pubKey; } } 

Y siempre obtengo la clave pública sin ningún problema.

 Cipher c = Cipher.getInstance("RSA/NONE/NoPadding", "SC"); c.init(Cipher.DECRYPT_MODE, pubKey); byte[] result = c.doFinal(data_to_decrypt.getBytes()); 

Y como resultado (después de convertir bytes a cadena) consigo 022c06571c6a263b389fcd93159cb311abb880bddf51b7c916dd1ae...

Donde las funciones php devuelven sd8dsa348acvcx87|00454|OK|15000|CDE y esto es una salida correcta.

Java tiene el Java Cryptography Extension Framework, que está diseñado para estas cosas.

BouncyCastle es un proveedor de criptografía para este marco. Esto significa, que proporciona su Java Cryptography Extension con implementaciones de algoritmos de criptografía.

Encontrarás las clases básicas para esto en los paquetes java.security y javax.crypto

Para desencriptar su mensaje con una clave pública, puede probar lo siguiente:

 // Use RSA/NONE/NoPadding as algorithm and BouncyCastle as crypto provider Cipher asymmetricCipher = Cipher.getInstance("RSA/NONE/NoPadding", "BC"); // asume, that publicKeyBytes contains a byte array representing // your public key X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes); KeyFactory keyFactory; keyFactory = KeyFactory.getInstance(publicKeySpec.getFormat()); Key key = keyFactory.generatePublic(publicKeySpec); // initialize your cipher asymmetricCipher.init(Cipher.DECRYPT_MODE, key); // asuming, cipherText is a byte array containing your encrypted message byte[] plainText = asymmetricCipher.doFinal(cipherText); 

Tenga en cuenta, que este ejemplo es muy básico y carece de varios bloques catch try. Además, no debe utilizar una cifra asimétrica sin relleno, ya que esto lo hace vulnerable a los ataques de repetición. También puede encontrar problemas con la longitud de clave. En algunos paquetes Java, la longitud de clave máxima permitida está restringida. Esto puede resolverse utilizando los archivos de política de fuerza ilimitada.

Espero que esto te ayude a empezar con la criptografía de Java.

  • Descifrado RSA en Android - iPhone
  • Diferentes claves públicas RSA generadas en Android
  • RSA cifra con clave pública codificada en base64 en Android
  • Obteniendo 1 byte extra en el módulo RSA Key ya veces para exponentes también
  • Android BigInteger ArithmeticException
  • SHA256 con firma RSA devuelve salidas diferentes en varios dispositivos Android
  • Cifrado en Android usando el algoritmo RSA con módulo dado y exponente
  • Proporcionar autenticación segura de Facebook con mi servidor
  • Problemas de subcontratación de encriptación y descifrado RSA
  • Java: ¿Cómo puedo generar PrivateKey de una cadena?
  • ¿Cómo utilizo una clave pública RSA generada en C # en Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.