password encrypt decryption decrypt cbc and java security encryption aes jce

encrypt - java.security.NoSuchAlgorithmException: no se puede encontrar ningún proveedor que admita AES/ECB/PKCS7PADDING



java 8 encryption and decryption (3)

No desea especificar el relleno PKCS # 7 para el uso de cifrado de bloque. Desea especificar el relleno PKCS # 5. PKCS # 5 se especifica para su uso con cifrados de bloque, mientras que PKCS # 7 no se usa (se usa para diferentes lugares como en S / MIME). Señalaré que PKCS # 5 y PKCS # 7 en realidad especifican exactamente el mismo tipo de relleno (¡son los mismos!), Pero se llama # 5 cuando se usa en este contexto. :)

Entonces, en lugar de "AES/ECB/PKCS7PADDING" , desea "AES/ECB/PKCS5PADDING" . Esta es una implementación de cifrado que cada implementación de la plataforma Java debe admitir. Vea la documentación de la clase de Cipher para más detalles.

Estaba tratando de cifrar los datos utilizando el algoritmo AES. Sin embargo, con la siguiente excepción se ha producido.

java.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7PADDING

Alguien sabe una solución a este problema? La versión de mi JDK es 1.7.


Para obtener una explicación muy completa del problema que incluye el texto de los estándares criptográficos PKCS # 5 y PKCS # 7, eche un vistazo here .

El relleno PKCS # 5 significa relleno de 1 a 8 bytes. Los propios bytes de relleno contienen la cantidad de bytes de relleno codificados como un byte. Se especificó el relleno PKCS # 5 para DES, pero sería adecuado para cualquier cifrado de bloque con un tamaño de bloque de 8 bytes.

Ahora las especificaciones de DES e incluso la especificación PKCS # 5 para el cifrado basado en contraseña preceden y Java por bastante tiempo. AES solo se estandarizó en 2002, mucho después de la introducción de Java e incluso Java 2. Entonces, el acolchado DES (triple) y PKCS # 5 se integró en Java antes de que AES hiciera su aparición.

Cuando Java, o más precisamente, el proveedor de Sun JCE, adquirió la funcionalidad AES, requirió un método de relleno para un tamaño de bloque de 16 bytes. PKCS # 7 especifica este método de relleno que here , excepto que se define para tamaños de bloque de 2 a 255 bytes (el valor máximo de un byte si codifica un entero sin signo basado en cero). Sin embargo, el método de relleno ya estaba allí; fue nombrado "PKCS5Padding" . Así que en lugar de introducir un nuevo nombre, simplemente se reutilizó "PKCS5Padding" .

A estas alturas, el proveedor de Sun realmente debería admitir "PKCS7Padding" ya que el relleno PKCS # 5 es simplemente incorrecto. No es solo un problema de nombre de Java, es un problema para cualquier desarrollador que intente implementar protocolos criptográficos u otras aplicaciones de Java. Por ahora, sin embargo, debe usar "PKCS5Padding" lugar de "PKCS7Padding" .