2012-08-12 18 views
6

Estoy desarrollando una aplicación que debe cifrar algunos archivos pequeños (menos de 1 MB) y grandes (aproximadamente 500 MB).
¿Cómo puedo cifrar archivos y guardar la versión cifrada en algún lugar del disco de manera efectiva (es decir, rápida)?
¿Puedo tener un progreso de cifrado si lleva tiempo?Encriptación efectiva de archivos usando AES en java

+0

¿Cuánta seguridad que usted requiere? En general, cuanto más débil es el cifrado, más rápido será y viceversa. –

+1

Puede usar la API 'BouncyCastel'. –

+0

@NoxHarmonium: ¿Cómo debo medirlo? ;-) Necesito que los archivos sean lo más seguros posible. No me importa que el cifrado sea lento, solo quiero que funcione a la velocidad máxima que puede alcanzar. (Me refiero a algo así como la copia de archivo usando 'java.io' y' java.nio') – RYN

Respuesta

6

Suponiendo que tiene una clave AES y alguna secuencia de salida, aquí le mostramos cómo podría agregar un decorador de cifrado a la transmisión.

Cipher enc = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
enc.init(Cipher.ENCRYPT_MODE, key); 
AlgorithmParameters params = enc.getParameters(); 
IvParameterSpec iv = params.getParameterSpec(IvParameterSpec.class); 
out.write(iv.getIV()); 
out = new CipherOutputStream(enc, out); 

Esto agrega el IV al comienzo del texto de cifrado; al descifrar, necesitarás analizar eso para inicializar el cifrado.

Una mejor solución, a largo plazo, sería utilizar la biblioteca que implementa la sintaxis del mensaje criptográfico, la base para S/MIME. Esto registra los metadatos sobre los algoritmos y las claves que se pueden utilizar para el descifrado.

También recomendaría un modo AEAD como GCM o CCM si su proveedor lo implementa. (SunJCE no lo hace). Esto verificará que el archivo se haya descifrado correctamente y no se haya dañado.

+0

@owlstead Sé que la API está ahí para GCM ahora, y esperaba que SunJCE lo proporcione, pero cuando fui a comprobarlo, no pude encontrarla [en la documentación]. (Http://docs.oracle. com/javase/7/docs/technotes/guides/security/SunProviders.html) ¿Conoce algún compromiso de Oracle para proporcionarlo a través de un proveedor de JCE incluido? – erickson

+1

Vaya mis disculpas, probablemente utilicé una ruta de compilación no estándar allí. Desde la fuente: "* Java SE ya definió las interfaces AEAD/GCM en JDK 7. En JDK 8, los proveedores JCA/JCE implementarán estas interfaces AEAD/GCM. También es probable que agreguemos algunos mecanismos adicionales para PKCS11, si el estándar PKCS11 actual lo admite. * " –

+0

Por supuesto, Bouncy Castle API contiene una implementación para realizar el modo GCM. Trataré de construirlo en el proveedor después de terminar mi clase crypto en la universidad de Standford. –

2

Como Bhavik mencionó anteriormente, BouncyCastle sería un buen camino a seguir, es liviano y maduro. Definitivamente puede ver el progreso del cifrado, ya que puede controlar cuánto leer y escribir a la vez. Podrías leer bytes de un archivo, encriptarlos y volver a escribir en otro archivo en una canalización.

Un ejemplo de esto se menciona en esta pregunta: How to encrypt a string/stream with bouncycastle pgp without starting with a file

Cuestiones relacionadas