2011-01-11 24 views
6

Intenté descifrar un archivo .dcf de 4.2 MB con la clave AES de 128 bits, pero tardé 33 segundos en descifrar (en la función cipher.doFinal (data)), ¿es normal?Desencriptación AES lenta en Android

Aquí es un fragmento de código:

long start = System.currentTimeMillis()/1000L; 
      try { 
       SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); 
       Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
       cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivspec); 

       android.util.Log.d("TEST", "Start decoding...." + String.valueOf(length)); 

       byte[] decrypted = cipher.doFinal(content); 

       File file2 = new File(Environment.getExternalStorageDirectory().getPath() + "/test.mp3"); 
       OutputStream os = new FileOutputStream(file2); 
       os.write(decrypted); 
      } catch (Exception ex) { 
       ex.printStackTrace(); 
      } 
      long end = System.currentTimeMillis()/1000L; 

      android.util.Log.d("TEST","Time "+ String.valueOf(end-start)); 
+0

espero que esto dependerá del hardware -.? mi deseo hace ciertas cosas mucho más rápido que Wildfire de mi esposa, por ejemplo, ¿Qué intenta esto en – Squonk

+0

@MisterSquonk, probé en el emulador, tomó alrededor de 30-33 segundos, en mi Samsung Galaxy Spica, tomó alrededor de 25-30 segundos. –

+0

Si me explicas cómo crearía un archivo como el que tú ' volver a descifrar, voy a probar tu código en mi HTC Desire (Froyo) si te sirve para saber los resultados. – Squonk

Respuesta

2

usted debe tratar de banco el tiempo necesario sin la escritura del mismo, es decir, llamar System.currentTimeMillis() justo antes y justo después de la llamada a cipher.doFinal().

Dicho esto, un teléfono basado en Android generalmente utiliza un procesador ARM reciente con velocidad de 500 MHz o más, y esa bestia teóricamente es capaz de cifrar AES o descifrar AES varios megabytes de datos por segundo.

Sin embargo, el código de Android usa una máquina virtual casi-Java llamada Dalvik. Antes de Android 2.2, este es un intérprete (sin compilador JIT), lo que significa que es un poco lento para las tareas de uso intensivo de la informática. Si el rendimiento mediocre que observa proviene realmente de la operación AES (y no de la escritura del archivo) entonces la respuesta plausible es que su VM proporciona una implementación AES escrita en Java e interpretada con Dalvik. En ese caso, hay poca cura excepto esperar la presencia de una mejor implementación de VM (una VM podría usar una implementación de código nativo para AES; también, con Android 2.2 y posterior, Dalvik tiene un JIT compiler que debería aumentar el rendimiento de la ejecución del código) .

+0

Hola Thomas, gracias por tu respuesta. He eliminado la escritura de archivos y me tomó entre 30 y 33 segundos en la función cipher.doFinal en froyo emulator o 25-30 segundos en Samsung Galaxy Spica (eclair). Mi amigo hizo la misma tarea en Blackberry y tardó unos 8 segundos. –

0

yo sepa, no hay manera de conseguir el acceso al hardware de cifrado/descifrado AES del chip ARM a través de las API de Android :-(

Este es un gran descuido por parte de Google por desgracia ... hace que el uso de AES en otras plataformas un LOT más rápido ....