Problema con algoritmo de encriptación DES

Saludos comunidad!

Tengo un problema, estoy encriptando cadenas con el algoritmo DES nada más que tengo un detalle, cuando el Cipher me retorna el arreglo de bytes con la encriptación y le aplico el Base64 con algunas cadenas me pone un salto de linea, es decir la cadena encriptada trae un salto de linea y cuando la quiero desencriptar truena y me manda una :

IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher

solo me ocurre con ciertas cadenas, el problema es que no se con que sustituir ese salto de linea para que mi arreglo de bytes quede bien y al aplicarle el Base64 y crear la cadena esta pueda ser desencriptada.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

base64

Seguramente el codificador de base64 que estás utilizando le mete los saltos de línea. El decodificador de base64 debería ignorar esos saltos de línea, ya que no representan datos en base64.

Intenta eliminar los saltos de línea después de codificar los datos cifrados. Eso debe garantizar que se puedan decodificar bien de regreso. Pero no creo que tu problema sea con base64. Lo que deberías intentar es que esas cadenas que te dan problemas, las cifres y descifres SIN haberlas codificado a base64 y decodificar de vuelta; simplemente cifra los datos, e inmediatamente después los descifras. Si eso funciona, entonces sí puedes estar seguro que es la codificación. Si implementaste tu propio codec de base64 entonces revisa que estés decodificando apropiadamente el último bloque (y que ignores los saltos de línea).

Imagen de Jvan

El problema esta en la codificación Base64

Saludos ezamudio!

Ya comprobé lo que me comentaste, tomé la cadena que truena, la encripte y a continuación desencripte sin hacer el Base64 y me retornó la cadena correctamente (como estaba antes de encriptar), eso apunta a que el error esta en la clase Base64 que estoy utilizando que es:

sun.misc.BASE64Encoder y sun.misc.BASE64Decoder

De aquí surge otra duda, las cadenas que quiero encriptar/desencriptar vienen de un WebService hecho en VB.net, ellos utilizan una clase de .Net para hacer la codificación en Base64, esto quiere decir que tendría que apegarme a los resultados que arroje la codificación Base64 de .net?

Imagen de ezamudio

es estandar

base64 es estandar. No se si las clases de sun esperan a fuerza el salto de linea o si prefieren decodificar una sola linea de texto; no estan documentadas, porque son de uso interno y pueden cambiar. Por esto precisamente es que no se recomienda usar clases de esos paquetes.

Tendras que probar quitar los saltos de linea a ver si eso te quita las broncas.

Imagen de Jvan

En efecto

Efectivamente el problema venía de las clases de Base64 de SUN, utilicé la clase Base64(para no reinventar la rueda) que viene en el proyecto JavaMexico2.0 que precisamente tú hiciste y funcionó correctamente(solo cambié lo de los caracteres "+" y "/").

Muchas gracias por el aporte de la clase y por la orientación sensei ezamudio y si van a hacer encodes en Base 64 no utilicen las clases de SUN :P.

Saludos!

Imagen de ezamudio

+ y /

El base64 de javaMexico 2.0 es "url-safe", por eso en vez de + usa - y en vez de / usa creo que _ pero qué bueno que encontraste lo que había que cambiar.

Imagen de jechual

Desencriptar los parametros de una URL enviados a JAVA

Hola que tal eZamudio, soy nuevo en esto de la encriptacion, mi pregunta es concisa tengo unos reportes que los hago con Jassperreport. pero al momento de obtener por web utilizo el famoso windows.open(contexto+url+parametros) en el lado cliente, y este me muestra los parametros como GET, precisamente los parametros tengo que enviarlos encriptados para resolver este problema. Si logre encriptar dichos parametros en el lado cliente, probando con diferentes archivos JS (ejm. MD5.js, SHA256.js,jcrypto.js).. el MD5.js tiene una opcion para que pueda ser decodificado con Base64 en el lado servidor. Tambien tengo una clase que se llama StringEncrypter.java muy popular por internet. el problema que cuando pasa por este metodo:

public String decrypt(String encryptedString) throws EncryptionException {
if ((encryptedString == null) || (encryptedString.trim().length() == 0)) {
throw new IllegalArgumentException("El parametro unencrypted string era null o vacio");
}

try {
SecretKey key = keyFactory.generateSecret(keySpec);
cipher.init(Cipher.DECRYPT_MODE, key);

sun.misc.BASE64Decoder base64decoder = new sun.misc.BASE64Decoder();
byte[] clearText = base64decoder.decodeBuffer(encryptedString);
byte[] decryptedText = cipher.doFinal(clearText);

return bytesToString(decryptedText);
} catch (Exception e) {
throw new EncryptionException(e);
}
}
se cae en esta linea "byte[] decryptedText = cipher.doFinal(clearText);"
me sale los siguientes errores. javax.crypto.BadPaddingException: Given final block not properly padded o javax.crypto.IllegalBlockSizeException: Input length must be multiple of 8 when decrypting with padded cipher.

No he visto muchos foros referentes del envió de parámetros a traves de una pagina web que sean encriptado y como solo pasa la cadena ("http://localhost:38080/ReportesSGSS/reportes.htm?params=b60810dd1646d6c7ec494c3a56786ecd362d8523ac281a3844a3ef550ea33028"), en el otro lado se debe validar esta cadena ("arams=b60810dd1646d6c7ec494c3a56786ecd362d8523ac281a3844a3ef550ea33028""), que lo obtengo con un request.getparameter(""). creo que estoy confundiendo teorias, no si si es factible lo que quiero realizar.!!!. muy aparte mencionas un proyecto de ejmplo javaMexico 2.0 para poder guiarme, si pudieras me indicas la url donde lo puede encontrar...Muchas Gracias de antemano.