2015-01-18 14 views
5

Sto sviluppando un'app per Android che protegge immagini e video come Vaulty e Keep safe. Sto cercando di utilizzare la tecnica di crittografia/decrittografia AES-128 per archiviare immagini e video. L'ho provato prendendo 3 immagini campione di dimensioni 5.13, 4.76 e 5.31 rispettivamente. Ma il tempo che sta consumando per crittografare è 25s, 22s, 27s rispettivamente e il tempo di decifrare è 31s, 30s, 34s ​​rispettivamente. Lo sto testando su HTC One X.La crittografia/decodifica di file Android AES-128 è molto lenta. Come posso aumentare la velocità

Tale velocità non sarà possibile per la mia app in quanto gli utenti scorreranno e visualizzeranno le immagini rapidamente senza interruzioni. Puoi per favore suggerirmi come posso migliorare le prestazioni (velocità) o dovrei passare ad altri algoritmi? Potete per favore suggerirmi altre tecniche attraverso le quali posso cifrare/decodificare immagini e video rapidamente senza compromettere troppo la sicurezza.

Ho provato Vaulty e Keep safe e sono molto veloci. Si dice che Vaulty utilizzi AES-256, ma è ancora molto veloce e reattivo in termini di crittografia e visualizzazione delle immagini. Com'è possibile che vaulty sia così veloce usando AES-256?

codice che sto usando è:

static void encrypt(String filename) throws IOException, NoSuchAlgorithmException, 
     NoSuchPaddingException, InvalidKeyException { 

    // Here you read the cleartext. 
    File extStore = Environment.getExternalStorageDirectory(); 
    startTime = System.currentTimeMillis(); 
    Log.i("Encryption Started",extStore + "/5mbtest/"+filename); 
    FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename); 
    // This stream write the encrypted text. This stream will be wrapped by 
    // another stream. 



    FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+filename+".aes", false); 

    // Length is 16 byte 
    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), 
      "AES"); 
    // Create cipher 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
    cipher.init(Cipher.ENCRYPT_MODE, sks); 
    // Wrap the output stream 
    CipherOutputStream cos = new CipherOutputStream(fos, cipher); 
    // Write bytes 
    int b; 
    byte[] d = new byte[8]; 
    while ((b = fis.read(d)) != -1) { 
     cos.write(d, 0, b); 
    } 
    // Flush and close streams. 
    cos.flush(); 
    cos.close(); 
    fis.close(); 
    stopTime = System.currentTimeMillis(); 
    Log.i("Encryption Ended",extStore + "/5mbtest/"+filename+".aes"); 
    Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+""); 
} 

static void decrypt(String filename) throws IOException, NoSuchAlgorithmException, 
     NoSuchPaddingException, InvalidKeyException { 
    File extStore = Environment.getExternalStorageDirectory(); 
    Log.i("Decryption Started",extStore + "/5mbtest/"+filename+".aes"); 
    FileInputStream fis = new FileInputStream(extStore + "/5mbtest/"+filename+".aes"); 

    FileOutputStream fos = new FileOutputStream(extStore + "/5mbtest/"+"decrypted"+filename,false); 
    SecretKeySpec sks = new SecretKeySpec("MyDifficultPassw".getBytes(), 
      "AES"); 
    // Create cipher 
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
    cipher.init(Cipher.DECRYPT_MODE, sks); 
    startTime = System.currentTimeMillis(); 
    CipherInputStream cis = new CipherInputStream(fis, cipher); 
    int b; 
    byte[] d = new byte[8]; 
    while ((b = cis.read(d)) != -1) { 
     fos.write(d, 0, b); 
    } 

    stopTime = System.currentTimeMillis(); 

    Log.i("Decryption Ended",extStore + "/5mbtest/"+"decrypted"+filename); 
    Log.i("Time Elapsed", ((stopTime - startTime)/1000.0)+""); 

    fos.flush(); 
    fos.close(); 
    cis.close(); 
} 

risposta

8

Una cosa che sta facendo la corsa del codice lenta è la dimensione del buffer:

byte[] d = new byte[8]; 

Si dovrebbe aumentarlo da alcuni ordini di grandezza se vuoi che funzioni velocemente. Data la dimensione dei tuoi file ti suggerirei di usare almeno 1 MB ma oggigiorno puoi realisticamente impostarlo su pochi MB, anche su Android. Prova a cambiarlo in:

byte[] d = new byte[1024 * 1024]; 

e facci sapere quanto ha migliorato la velocità di.

+0

Grazie mille @Mike per l'aiuto, l'ho impostato su 10 MB i.e byte [] d = nuovo byte [10 * 1024 * 1024]; Crittografia: 2.624s, 3.61s, 3.983s Decrittografia: 7.63, 7.129, 7.63 Rispettivamente per 1.jpg, 2.jpg e 3.jpg Ma per me la decrittazione è più lenta e dovrebbe essere più veloce. Per i dispositivi attuali, quante dimensioni dell'array dovrei usare per non rovinare l'app? C'è un modo per trovare la dimensione massima del buffer o la dimensione del buffer più fattibile? – svhr

+1

Preferisco andare con qualcosa tra 8 * 1024 o 64 * 1024. I buffer molto grandi di solito non aumentano le prestazioni. – CodesInChaos

+0

"ma oggigiorno è possibile impostarlo realisticamente su pochi MB, anche su Android" non allocare MB di buffer nell'heap anche "oggigiorno" -> come EJP ha scritto: coppia di Kb dovrebbe essere sufficiente – for3st

5

utilizzare un buffer più grande come suggerito da @MikeLaren, e anche avvolgere il FileOutputStream in un BufferedOutputStream. Quando decifrare, avvolgere il FileInputStream in un BufferedInputStream. O fare entrambi in entrambi i casi: nessun danno fatto.

Nessuna necessità di dimensioni del buffer eroico come un megabyte: 8k o 32k è sufficiente.

+0

Ok Grazie :) – svhr

Problemi correlati