2009-11-19 11 views
23

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

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 apreció

Respuesta

21

Use un SecretKeyFactory para derivar bytes de clave de un password.You puede ver un ejemplo detallado here. Tenga en cuenta que debe especificar una longitud de clave de la 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 un conocimiento profundo de los conceptos planteados aquí (y mucho más) es probable que resulte en un sistema inseguro.

10

Por lo general, no se puede utilizar cualquier longitud de clave arbitraria (como lo estás haciendo aquí con "supernova") para un cifrado de bloques 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 realmente estás interesado en estas cosas, el trabajo seminal es Applied Cryptography by Bruce Schneier.

Para prácticos detalles de implementación, see

1

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

Así que en psuedocode, que estamos tratando algo como esto:

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

pero la clave es demasiado corta - tiene que ser algo como, digamos 31 caracteres de longitud.

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

-1

Use una cadena Valor clave con 16 bytes para un cifrado uniforme, p. La clave "thebestsecretkey" funcionará en base64

Cuestiones relacionadas