Problema de descifrado de clave pública pública de Java

Estoy tratando de cifrar y descifrar un mensaje como se menciona en el siguiente código. Básicamente, quiero cifrar un mensaje con una clave pública y convertir ese mensaje cifrado de un byte array a String. Y descifrar esta cadena en texto original. Aquí están los dos métodos. Aquí el cifrado funciona bien, pero el descifrado falla (el error es “Los datos deben comenzar con cero”). Creo que esto está causando porque convierto una matriz de bytes encriptada en String.

¿Cómo puedo solucionar esto? (Quiero tener una matriz de bytes encriptada como cadena y usarla para descifrar) ¿Hay algún otro enfoque (con claves públicas y privadas)?

public static String getEncryptedMessage(String publicKeyFilePath, String plainMessage) { byte[] encryptedBytes; try { Cipher cipher = Cipher.getInstance("RSA"); byte[] publicKeyContentsAsByteArray = getBytesFromFile(publicKeyFilePath); PublicKey publicKey = getPublicKey(publicKeyContentsAsByteArray); cipher.init(Cipher.ENCRYPT_MODE, publicKey); encryptedBytes = cipher.doFinal(plainMessage.getBytes()); return new String(encryptedBytes); } catch (Throwable t) { } } public static String getDecryptedMessage( String privateKeyFilePath, String encryptedMessage) { byte[] decryptedMessage; try { Cipher cipher = Cipher.getInstance("RSA"); byte[] privateKeyContentsAsByteArray = getBytesFromFile(privateKeyFilePath); PrivateKey privateKey = getPrivateKey(privateKeyContentsAsByteArray); cipher.init(Cipher.DECRYPT_MODE, privateKey); decryptedMessage = cipher.doFinal(encryptedMessage.getBytes()); return new String(decryptedMessage); } catch (Throwable t) { } 

Si miras esta página ( http://www.wikijava.org/wiki/Secret_Key_Cryptography_Tutorial ) necesitarás hacer una encoding de base 64 para convertir los bytes en una cadena, luego para descifrarla simplemente descodificarla y luego descifrar.

La encoding Base-64 utiliza los primeros 7 bits de un byte, por ejemplo, para hacer algo que se pueda imprimir o enviar por correo electrónico.

ACTUALIZAR:

Cometí un error, hay 64 caracteres en los que se codificaría, de nuevo, para que sea más fácil de usar como algo imprimible.

¿Por qué no trata el mensaje como una matriz de bytes desde el cifrado hasta el descifrado? ¿Por qué cambiarlo a String en el medio? (Sé que parece una pregunta, pero en realidad es una respuesta …)

El uso de RSA directamente en datos sin formato puede hacer que su aplicación sea vulnerable a un ataque de texto cifrado elegido adaptativo . Para obtener más información, consulte el Capítulo 8, páginas 288-289, del Manual de criptografía aplicada , un libro disponible gratuitamente en CRC Press. (Vale la pena comprar la edición encuadernada , si está realmente interesado en la criptografía, quedará sorprendido por la calidad del precio).

Debido a este ataque, la mayoría de los protocolos que integran RSA utilizan RSA para cifrar claves de sesión generadas aleatoriamente o para firmar funciones hash con salidas que deberían ser indistinguibles de las aleatorias, O mediante el uso de mensajes con un formato muy cuidadoso que no se interpretarán correctamente. (Vea la Nota 8.63 en HAC para más detalles).

    Intereting Posts