2009-02-25 22 views
13

Tenemos un requisito para hacer algún desarrollo de Rijndael en Java.Soporte de Rijndael en Java

¿Alguna recomendación para artículos, bibliotecas, etc. que nos ayuden?

¿Alguna sugerencia para el mantenimiento del almacén de claves y cómo almacenar las claves de forma segura?

Editar:

Tendría que ser de código abierto. Esencialmente, es solo el cifrado/descifrado estándar de datos usando Rijndael.

+0

Rijndael == AES – lImbus

Respuesta

21

Java incluye AES fuera de la caja. Rijndael es AES. No necesita ninguna biblioteca externa. Solo necesita algo como esto:

byte[] sessionKey = null; //Where you get this from is beyond the scope of this post 
byte[] iv = null ; //Ditto 
byte[] plaintext = null; //Whatever you want to encrypt/decrypt 
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
//You can use ENCRYPT_MODE or DECRYPT_MODE 
cipher.calling init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sessionKey, "AES"), new IvParameterSpec(iv)); 
byte[] ciphertext = cipher.doFinal(plaintext); 

Y eso es todo, para el cifrado/descifrado. Si está procesando grandes cantidades de datos, es mejor que lea fragmentos que son múltiplos de 16 bytes y llama a actualización en lugar de doFinal (simplemente llama a doFinal en el último bloque).

+7

Rijndael no es igual a AES, pero en su lugar es AES con algunas restricciones: tamaño de bloque fijo de 128 bits y algunos modos de cifrado no admitidos. Cualquier implementación completa de AES debería ser utilizable como Rijndael. – Cheeso

+14

Esto es exactamente lo contrario, AES es un subconjunto de Rijndael –

+3

@ BrunoRohée es correcto. AES es un subconjunto de Rijndael, mira esto http://stackoverflow.com/questions/748622/differences-between-rijndael-and-eses – tony9099

1

javax.crypto tiene soporte AES: http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html

En cuanto al almacenamiento de clave segura, el método habitual es derivar una clave de cifrado a partir de la entrada del usuario (una frase de contraseña) utilizando una función de hash criptográfica, y el uso de la clave derivada a Encriptar el llavero. O bien, si solo necesita una clave, puede usar la clave derivada.

Siempre tenga en cuenta que la seguridad del sistema está directamente relacionada con la fuerza de la función de hash utilizada. Utilice una función hash criptográficamente segura, junto con una sal si es posible, y hash más de una vez (cientos de veces, por ejemplo).

Dicho esto, la pregunta es muy vaga.

+0

También vale la pena señalar que 'javax.crypto' utiliza una versión muy optimizada de AES y es bastante rápido. – tony9099

5

Para una gran biblioteca gratuita, recomiendo BouncyCastle. Se mantiene activamente, de alta calidad, y tiene una buena variedad de ejemplos de código. Para documentación de referencia, tendrá que confiar más en el JCE docs.

No puedo decir qué biblioteca usamos para cumplir con los requisitos de certificación FIPS. Pero hay alternativas a CryptoJ que son mucho, mucho más baratas.

En general, recomendaría generar una nueva clave para cada mensaje cifrado con un cifrado simétrico como Rijndael, y luego cifrar esa clave con un algoritmo asimétrico como RSA. Estas claves privadas se pueden almacenar en un almacén de claves basado en software protegido con contraseña como PKCS # 12 o Java "JKS", o, para mayor seguridad, en token de hardware de "tarjeta inteligente" u otro módulo de hardware criptográfico.

3

Como mi empresa descubrió recientemente, AES no es del todo Rijndael. AES tiene la restricción de que las claves DEBEN ser 128, 192 o 256 bits; sin embargo, Rijndael también permite claves que son 160 y 224.

Como lo indica erickson arriba, BouncyCastle proporciona un objeto Rijndael que NO admite las longitudes de clave adicionales: 128/160/192/224/256 bits. Específicamente, eche un vistazo a la API liviana.

Gnu-crypto es otra biblioteca de código abierto; sin embargo, tampoco proporciona soporte para claves de 160 y 224 bits.

Por lo tanto, si está buscando específicamente el soporte total de Rijndael, entonces BouncyCastle es el único que he encontrado hasta ahora.

+1

Si necesita usar Java para el desarrollo de Android (aunque la pregunta no lo dice, vale la pena señalar que Bounty Castle tiene ahora un hermano, que le da más flexibilidad a Android, conocido como Spongy Castle, que es un derivado ... y bastante bueno en realidad) – tony9099