2008-12-04 27 views
5

Estoy usando un cifrado AES con un tamaño de bloque de 16 bytes.Java Cipher - AES Padding Problema

Si trato de encriptar una cadena de 16 bytes no tengo problemas, pero cualquier otra longitud, no un múltiplo de 16, arroja una excepción.

Sé con 3-DES que puede especificar un tipo de relleno como parte del algoritmo y se maneja sin trabajo adicional (por ejemplo, DES/CBC/PKCS5Padding), pero ¿hay alguna manera de especificar esto con AES?

¿O necesito rellenar manualmente las cuñas a un múltiplo de 16, y luego quitarlas cuando descifro? Aquí hay una muestra de código abreviado.

encrypt = Cipher.getInstance("AES", provider); 
encrypt.init(Cipher.ENCRYPT_MODE, key) ; 
byte[] encrypted = encrypt.doFinal(plainTxt.getBytes()) ; 

Todas y cada una de las siguientes son bienvenidas!

Gracias de antemano, Ciarán

+2

comentario pedante: AES solo tiene un tamaño de bloque de 16 bytes, por definición. Rijndael (el nombre original y la especificación) tenía tamaños de bloques de 16,24 y 32 bytes, pero para uso en AES solo se permiten bloques de 16 bytes. Rijndael también admite keysizes 128, 160, 192, 224, 256, pero solo 128, 192 y 256 son compatibles con AES. –

Respuesta

5

Se debe trabajar exactamente lo mismo con AES, es decir, el modo de relleno tiene que ser especificada junto con el sistema de cifrado. Los modos de relleno que se implementan dependen del proveedor y se deben describir en su documentación.

De acuerdo con la documentación JCE: http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html#AppA modos de relleno estándar como PKCS5Padding deben ser siempre compatibles (al menos, así es como yo lo interpreto).

+0

Niño, estoy familiarizado con esa página :) Cuando dices el proveedor, ¿te refieres a la implementación de la JCE que estoy usando? Verificaré los documentos por eso. –

+0

Sí, el proveedor (el segundo parámetro en el método getInstance()) básicamente implementa la interfaz Cipher. Puede tener más de un proveedor de criptografía activo. El JDK de Sun viene con el proveedor SunJCE preinstalado –

+0

Como estaba codificando una 'prueba de concepto' del AES a través de Java/Coldfusion, implementé mi propio relleno utilizando el método 2 que se describe aquí: http: //www.di-mgt. com.au/cryptopad.html. Podría echar un vistazo más de cerca a lo real. Aunque marcaré esto como la respuesta. –