2012-01-29 12 views
6

Estoy trabajando en el cifrado de archivos. Puedo cifrar/descifrar los archivos pero me enfrenta a un problema de rendimiento importante. Cuando simplemente leo/escribo un archivo de video de 700 MB de tamaño, mi código tiene un rendimiento de alrededor de 27-28 MB/s. Pero cuando realizo el cifrado (actualmente estoy usando PBEWithMD5AndDES, que cambiaría más adelante), el código muestra velocidades de 9 MB/s. Aconseja en qué puedo mejorar.Asesorar sobre el rendimiento del cifrado de archivos en Java

Fragmento de código:

int c = 0, BUF_SIZE = 8192; 
    byte[] b = new byte[BUF_SIZE]; 
    FileInputStream fis; 
    DataInputStream dis; 
    FileOutputStream fos; 
    DataOutputStream dos; 
    CipherOutputStream cos; 


    try { 
     // Create PBE parameter set 
     pbeParamSpec = new PBEParameterSpec(salt, iterationCount); 

     // Create PBE Cipher 
     Cipher pbeCipher = Cipher.getInstance(algorithm); 

     // get key 
     key = generateKeyFromPassword(password); 

     // Initialize PBE Cipher with key and parameters 
     pbeCipher.init(Cipher.ENCRYPT_MODE, key, pbeParamSpec); 

     fis = new FileInputStream(inFile); 
     dis = new DataInputStream(fis); 
     fos = new FileOutputStream(outFile); 
     dos = new DataOutputStream(fos); 
     cos = new CipherOutputStream(fos, pbeCipher); 


     while ((c = dis.read(b)) > 0) { 
      cos.write(b); 
      //dos.write(b); 
     } 

     fis.close(); 
     dis.close(); 
     //dos.close(); 
     cos.close(); 


    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

Estadísticas sin cifrado:
velocidad es de alrededor de 27.97 MB/s
Hora Exacta = 25.02 seg
Tamaño Archivo = 700 MB

Estadísticas con encriptación:
La velocidad es alrededor de 9. 69 MB/s
Hora Exacta = 72.171 seg
Tamaño del archivo = 700 MB

+0

¿Has probado una nueva clave de bloque, como AES? – CodesInChaos

+0

¿Qué tipo de CPU tienes? Cuando se realiza correctamente, el cifrado AES debe superar los 30 MB/s, incluso en hardware antiguo. – CodesInChaos

+0

Estoy trabajando en la CPU: intel i3 @ 2.27 GHz OS: Ubuntu 10.10 – ketan

Respuesta

0

cifrado simplemente es la CPU. Tal vez pueda encontrar una implementación más eficiente y afeitarse un par de% del tiempo de ejecución, o utilizar un motor de hardware dedicado y obtener un mejor rendimiento por unos pocos dólares.

Lo primero que me gustaría asegurar es que su aplicación puede hacer frente al hecho de que esto solo llevará un tiempo. Esto significa poner la criptografía en operaciones de fondo, preparar el contenido antes de su uso y consideraciones de diseño similares.

+0

10 MB/s es muy lento, incluso con encriptación. Usando multihilo y AES my i3 2.6 GHz maneja 200MB/s. Pero no estoy familiarizado con las características de rendimiento de DES. – CodesInChaos

+0

@thinksteep "afeitarse un poco%" me suena como un inglés válido. No hay necesidad de arreglarlo – CodesInChaos

+0

@CodeInChaos, si es correcto, lo siento! – kosa

2

Intente envolver el flujo de entrada de datos con un flujo de entrada en el búfer para los iniciadores. También verifique esto link para una comparación de rendimiento de diferentes algoritmos en Java. AES ciertamente producirá un resultado considerablemente más rápido que DES.

4

En primer lugar: si es posible, no lo hagas tú mismo. El cifrado es muy (¡muy!) Fácil de perder de forma que los resultados sean inseguros. Si es posible, use un componente externo o una biblioteca para hacer la mayor parte del trabajo de cifrado que sea práctico.

En segundo lugar, si va a hacer esto usted mismo como ahora, no use DES. DES ya no es un cifrado lo suficientemente fuerte. Triple-DES está bien, pero lo que realmente quieres usar es AES. Se considera que las CPU seguras y modernas se tuvieron en cuenta durante su diseño, se puede elegir la longitud de las claves para equilibrar la seguridad con el rendimiento y las CPU modernas tienen aceleración de hardware para AES (AES-NI). (No sé si Java usa esto, pero si no lo hace, ciertamente podría comenzar en el futuro, mientras que las posibilidades de eso para Triple-DES son cero.)

En tercer lugar, estás leyendo y escribiendo un byte a la vez. Mientras que el cifrado va a ser intensivo en la CPU en cualquier caso, hacerlo en este momento será más lento de lo necesario. Leer y escribir a través de un byte[] de 4kB aproximadamente debería tener un rendimiento mucho mejor.

0

¿Has probado BouncyCastle como alternativa? En todas partes donde he visto la criptografía Java utilizada, se utilizó en lugar de las API integradas.

Cuestiones relacionadas