gcm example decryption code cipher java encryption aes

java - example - error de longitud de clave AES inválido



aes java implementation (4)

Normalmente, no puede usar ninguna longitud de clave arbitraria (como lo hace aquí con "supernova") para un cifrado de bloque como AES. Debe usar una longitud de clave compatible (128, 192, 256, etc.) apropiada para su algoritmo de elección.

Una forma común de hacer esto es codificar la contraseña (por ejemplo, a través de SHA) y extraer los primeros N bytes. Esto es mejor de todos modos, ya que le permite "saltear" su contraseña con un valor de inicialización tal que las "claves" de dos usuarios no son idénticas, incluso si sus frases de contraseña son las mismas. Si estás realmente interesado en estas cosas, el trabajo fundamental es Applied Cryptography de Bruce Schneier .

Para detalles prácticos de implementación, see

este código da un error de longitud de clave AES no válido. ¿Cómo puedo corregirlo? (quiero cifrado AES de clave de 128 bits)

package org.temp2.cod1; import java.security.*; import javax.crypto.*; import javax.crypto.spec.*; import java.io.*; public class Code1 { public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException, UnsupportedEncodingException { String s = "9882623867"; byte[] plaintext = s.getBytes("UTF-16"); String s2 = "supernova"; byte[] key = s2.getBytes("UTF-16"); Cipher c = Cipher.getInstance("AES"); SecretKeySpec k = new SecretKeySpec(key, "AES"); c.init(Cipher.ENCRYPT_MODE, k); byte[] encryptedData = c.doFinal(plaintext); System.out.println(encryptedData); } }

cualquier ayuda apreciada


Puede obtener este error cuando la clave que está tratando de usar no es la correcta.

Entonces, en psuedocode, intentas algo como esto:

String key = "123"; SecretKeySpec k = new SecretKeySpec(key, "AES");

pero la clave es demasiado corta, tiene que ser algo así como, digamos 31 caracteres de largo.

Así que verifique su valor de clave -> probablemente esté almacenado en algún lugar incorrectamente.


Utilice un SecretKeyFactory para derivar los bytes clave de una contraseña here. puede ver un ejemplo detallado here. Tenga en cuenta que deberá especificar una longitud de clave de 128 bits en lugar de 256 bits, como se muestra en ese ejemplo.

El siguiente problema con el que se encontrará es que no ha especificado un esquema de relleno. A menos que sus mensajes sean un múltiplo de 16 bytes (el tamaño del bloque AES), eso generará un error. Use PKCS5Padding como se muestra en el ejemplo.

El uso del modo CBC en el cifrado requerirá que se elija un nuevo vector de inicialización para cada mensaje. Este IV único debe enviarse junto con el mensaje encriptado al destinatario.

Intentar realizar criptografía sin una comprensión profunda de los conceptos planteados aquí (y mucho más) es probable que resulte en un sistema inseguro.


Utilice una cadena de valores clave con 16 bytes para un cifrado uniforme, por ejemplo, la clave "thebestsecretkey" funcionará en base64