2015-01-18 11 views
5

Ich entwickle eine Android App, die Bilder und Videos wie Vaulty und Keep safe sichert. Ich versuche, die AES-128-Verschlüsselung/Entschlüsselungstechnik zum Speichern von Bildern und Videos zu verwenden. Ich versuchte es, indem ich 3 Beispielbilder der Größe 5.13, 4.76 und 5.31 beziehungsweise nahm. Aber die Zeit, die es verschlingt, zu verschlüsseln, ist 25s, 22s, 27s bzw. Zeit zu entschlüsseln ist 31s, 30s, 34s ​​jeweils. Ich teste es auf HTC One X.Android AES-128 Verschlüsselung/Entschlüsselung der Datei ist sehr langsam. Wie kann ich die Geschwindigkeit erhöhen?

Eine solche Geschwindigkeit wird nicht machbar für meine App als Benutzer werden blättern und Bilder schnell und ohne Unterbrechung anzeigen. Können Sie mir bitte vorschlagen, wie ich die Leistung (Geschwindigkeit) verbessern kann oder sollte ich zu anderen Algorithmen wechseln? Können Sie mir bitte andere Techniken vorschlagen, mit denen ich Bilder und Videos schnell verschlüsseln/entschlüsseln kann, ohne die Sicherheit zu sehr zu gefährden?

Ich versuchte Vaulty und Keep safe, und sie sind sehr schnell. Vaulty soll AES-256 verwenden, aber es ist immer noch sehr schnell und reaktionsschnell in Bezug auf das Verschlüsseln und Anzeigen von Bildern. Wie ist es möglich, dass Vaulty so schnell mit AES-256 ist?

-Code ich verwende ist:

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(); 
} 

Antwort

8

Eine Sache, die Ihr Code laufen langsam ist die Größe des Puffers macht:

byte[] d = new byte[8]; 

Sie sollten es durch ein paar Aufträge stoßen von Größe, wenn Sie wollen, dass es schnell läuft. Angesichts der Größe Ihrer Dateien würde ich vorschlagen, mindestens 1 MB zu verwenden, aber heutzutage können Sie realistisch auf ein paar MB setzen, sogar auf Android. Versuchen Sie es zu ändern:

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

und lassen Sie uns wissen, wie viel hat das die Geschwindigkeit verbessert.

+0

Vielen Dank @Mike für die Hilfe, ich habe es auf 10MB gesetzt, d. H. Byte [] d = neues Byte [10 * 1024 * 1024]; Verschlüsselung: 2.624s, 3.61s, 3.983s Entschlüsselung: 7.63, 7.129, 7.63 respektive für 1.jpg, 2.jpg und 3.jpg Aber für mich ist die Entschlüsselung langsamer und es sollte schneller gehen. Wie viel Arraygröße sollte ich für aktuelle Geräte verwenden, die die App nicht zum Absturz bringen würde? Gibt es eine Möglichkeit, die maximale Puffergröße oder die praktikabelste Puffergröße zu finden? – svhr

+1

Ich würde lieber mit etwas zwischen 8 * 1024 oder 64 * 1024 gehen. Sehr große Puffer erhöhen normalerweise nicht die Leistung. – CodesInChaos

+0

"aber heutzutage können Sie realistisch auf ein paar MBs setzen, sogar auf Android" nicht MBs Puffer im Heap sogar "heutzutage" zuweisen -> wie EJP schrieb: paar Kb sollte ausreichen – for3st

5

Verwenden Sie einen größeren Puffer, wie durch @MikeLaren vorgeschlagen, und auch die FileOutputStream in einem BufferedOutputStream. wickeln Wenn Entschlüsseln, wickeln Sie das FileInputStream in einem BufferedInputStream. Oder beides in beiden Fällen: kein Schaden angerichtet.

Keine heroischen Puffergrößen wie ein Megabyte erforderlich: 8k oder 32k ist ausreichend.

+0

Ok Danke :) – svhr

Verwandte Themen