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
Respuesta
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.
@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
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. * " –
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. –
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
- 1. Encriptación AES simple usando WinAPI
- 2. Encriptación AES Java -> PHP -> Java
- 3. Encriptación AES en Java y descifrado en C#
- 4. Encriptación AES y almacenamiento de claves?
- 5. Encriptación AES para un NSString?
- 6. Encriptación AES 256 en .NET Framework 2.0
- 7. Encriptación/descifrado AES entre Ruby-OpenSSL, PyCrypto
- 8. Encriptación AES de 16 bytes sin sal
- 9. Ejemplo de AES usando Crypto ++
- 10. Encriptación AES en Oracle y MySQL están dando resultados diferentes
- 11. C# Ejemplo de encriptación AES256 usando System.Security.Cryptography.Aes
- 12. Encriptación de la clave AES con la clave pública RSA
- 13. Encriptación AES para un NSString en el iPhone
- 14. Java AES y usando mi propia clave
- 15. ¿Por qué necesita mucha aleatoriedad para una encriptación efectiva?
- 16. Copia efectiva de varios archivos
- 17. ¿Cómo puedo hacer que mi encriptación AES sea idéntica entre Java y Objective-C (iPhone)?
- 18. Encriptación/descifrado de archivos de gran tamaño (.NET)
- 19. Cómo cifrar un archivo en Java usando AES
- 20. Java AES CBC descifrado
- 21. Java Cipher - AES Padding Problema
- 22. Tamaño de clave AES en Java
- 23. Encriptación RSA .NET Descifrado Java
- 24. Encriptación OpenSSL usando clases .NET
- 25. ¿Están las propiedades de Java en desuso de manera efectiva?
- 26. ¿Encriptación del sistema de archivos para iOS?
- 27. ¿Cómo encriptar en VBScript usando AES?
- 28. Encriptación con clave privada RSA en Java
- 29. CipherInputStream solo lee 16 bytes (AES/Java)
- 30. Encriptación AES en iOS y Android, y descifrado en C# .NET
¿Cuánta seguridad que usted requiere? En general, cuanto más débil es el cifrado, más rápido será y viceversa. –
Puede usar la API 'BouncyCastel'. –
@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