Saltar al contenido

Cifre y descifre con codificación AES y Base64

Luego de de una extensa recopilación de datos pudimos solucionar este inconveniente que presentan ciertos de nuestros lectores. Te compartimos la solución y nuestro objetivo es servirte de gran apoyo.

Solución:

Su pedido para cifrar:getBytes, cifrar, codificar, toString
Su pedido de descifrado (incorrecto*):getBytes, descifrar, decodificar, toString

Dos problemas:

  1. Como alguien ya mencionó, debe invertir el orden de las operaciones para el descifrado. No estás haciendo eso.
  2. cifrar le da 16 bytes, codificar 24 bytes, pero toString le da 106 bytes. Algo relacionado con los caracteres no válidos que ocupan espacio adicional.

Nota: Además, no necesita llamar generateKey() dos veces.

Solucione el problema #1 utilizando el orden inverso para el descifrado.
Orden correcto para descifrar:getBytes, decodificar, descifrar, toString

Solucione el problema #2 por reemplazo xxx.toString() con new String(xxx). Haga esto en las funciones de cifrado y descifrado.

Su descifrado debería verse así:

c.init(Cipher.DECRYPT_MODE, key)
val decodedValue = new Base64().decode(encryptedValue.getBytes())
val decryptedVal = c.doFinal(decodedValue)
return new String(decryptedVal)

Esto debería devolverte “dude5”

La línea

String encryptedValue = encryptedByteValue.toString();

es el problema. El tipo de encryptedByteValue es byte[] y llamar a String en él no es lo que quieres hacer allí. En su lugar, intente

String encryptedValue = Base64.getEncoder().encodeToString(encValue);

Entonces usa Base64.decodeBase64(encryptedValue) en descifrar. Sin embargo, debe hacerlo antes de intentar descifrar. Debe deshacer las operaciones en orden inverso al método de cifrado.

¿De dónde obtiene una versión del códec apache que tiene encodeToString o encodeBase64String?

Descargué 1.5 del sitio de apache y aunque dice en la documentación que existen estos métodos, no aparecen cuando completa el código y crean un método desconocido cuando los proporciona.

pude hacer:

byte raw[] = md.digest(); //step 4
byte hashBytes[] = Base64.encodeBase64(raw); //step 5
StringBuffer buffer = new StringBuffer();
for( int i=0; i

y luego el string que obtuve fue muy largo, PERO se descifró correctamente.

No creo que esta sea la forma "correcta" de hacer las cosas, pero no puedo encontrar los métodos que dice la documentación que están allí.

Aquí tienes las comentarios y puntuaciones

Eres capaz de añadir valor a nuestro contenido contribuyendo tu experiencia en las explicaciones.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *