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 )
- Compartir y almacenar RSA - clave pública en el servidor java y viceversa
- Obtener el error java.lang.ArrayIndexOutOfBoundsException: demasiados datos para el bloque RSA
- Encriptación RSA en Android
- Cómo almacenar la contraseña en Android
- KeyPairGeneratorSpec reemplazo con los equivalentes de KeyGenParameterSpec.Builder - falló la operación del almacén de claves
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.
- Firma de una cadena con una clave privada, firma RSA-SHA1 y md5 en Android
- Servidor Android y PHP: cifrar y descifrar datos
- Descodificación de cifrado RSA en Android
- RSA Encryption: Diferencia entre Java y Android
- Implementación de RSA Publickey en android
- Verificación de la firma RSA de Google Licensing con PyCrypto
- Clave de String en Java RSA
- Android RSA Generación de pares de claves - ¿Debo usar Java estándar / Bouncy Castle / Spongy Castle / JSch / Other?
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.
- Prácticas recomendadas para capturar un runtime de unhandle Excepción para JAVA en el sistema operativo Android?
- ¿Cómo puedo asegurarme de que Android Beam no inicie una nueva instancia de mi actividad "singleTop"?