2012-03-29 18 views
0

Ich habe Verschlüsselungsentschlüsselungsmethoden zum Verschlüsseln von Bildern und Videos erstellt. Ich verschlüssele die Videos teilweise, 1 MB um genau zu sein. Die kompliziertere Entschlüsselungsmethode dauert zu lange, um den Inhalt auf dem Android-Gerät zu entschlüsseln. Das img_decrypt dauert jedoch nicht lange. Nicht sicher, warum sie es tun.Warum läuft meine eine Entschlüsselungsmethode viel schneller als die andere?

Hier ist die eine .Diese kann vollständig verschlüsselt Videos oder Bilder entschlüsseln. Entschlüsselt ganze Bilder in ms, wie es nicht funktioniert, um teilweise verschlüsselte Videos zu entschlüsseln.

public void img_decrypt(InputStream in, OutputStream out) { 
    try { 
     // Bytes read from in will be decrypted 
     in = new CipherInputStream(in, dcipher); 

     // Read in the decrypted bytes and write the cleartext to out 
     int numRead = 0; 


     while ((numRead = in.read(buf)) >= 0) { 

      out.write(buf, 0, numRead); 
     } 


     out.close(); 
    } catch (java.io.IOException e) { 
    } 
} 

Und hier ist der andere. Das dauert ewig. Entschlüsselt vollständig verschlüsselte Bilder oder teilweise verschlüsselte Videos.

public void decrypt(InputStream in, OutputStream out) { 
    try { 
     // Bytes written to out will be decrypted 
     AppendableOutputStream out_append = new AppendableOutputStream(out); 
     System.out.println(ecipher.getOutputSize(1024*1024)); 
     OutputStream out_d = new CipherOutputStream(out_append, dcipher); 

     // Read in the decrypted bytes and write the cleartext to out 
     int numRead = 0; 
     int count = 0; 
     int max = 1024; 
     boolean out_d_closed = false; 

     while ((numRead = in.read(buf, 0, max)) > 0) { 
      count += numRead; 
      if(count <= ecipher.getOutputSize(1024*1024)){ 
       out_d.write(buf, 0, numRead); 
       out_d_closed = false; 
       // last encryption pass, close buffer and fix max 
       if(count == ecipher.getOutputSize(1024*1024)){ 
        // fix reading 1k in case max was decreased 
        max = 1024; 
        out_d.close(); 
        out_d_closed = true; 
       } 
       // if next read will go over a meg, read less than 1k 
       else if(count + max > ecipher.getOutputSize(1024*1024)) 
        max = ecipher.getOutputSize(1024*1024) - count; 
      } 
      // past the first meg, don't decrypt 
      else{ 
       out.write(buf, 0, numRead); 
      } 

     } 
     if(!out_d_closed){ 

      out_d.close(); 

     } 
     out.close(); 
    } catch (java.io.IOException e) { 

     e.printStackTrace(); 

    } 
} 

Da das Entschlüsseln() Methode nimmt SOOOOOO lang eine 100 KB-Datei zu entschlüsseln, fragt das Gerät mir abzubrechen oder zu warten.

Wenn ich img_decrypt() verwenden, funktioniert es in keiner Zeit überhaupt. Was für mich keinen Sinn macht, machen sie das Gleiche.

Ich versuche, entschlüsseln() zu verwenden, um den ersten MB des Videos zu entschlüsseln.

Auf dem Computer funktioniert alles gut.

Alle Gedanken könnten hilfreich sein.

Beide Methoden funktionieren zum Entschlüsseln einer vollständig verschlüsselten Datei, entschlüsseln() nehmen jedoch viel zu lange.

Eine weitere Sache. Entschlüsseln() entschlüsselt die Daten beim Schreiben. img_decrypt() entschlüsselt die Daten beim Lesen. Keine Ahnung ob das irgendwas bewirkt.

Danke

+3

Nur neugierig: Wenn der hässliche, verwirrende Code auch langsam ist, warum stört es Sie? – erickson

+0

AppendableOutputStream out_append = new AppendableOutputStream (out); Überschreibt das close(), sodass das übergeordnete Element nicht geschlossen wird. BTW – user1086377

+0

Nach vielen Tests. out_d.write() ist es, was es verlangsamt. Aber in der anderen Methode ist out.write viel schneller. Mit der img_decrypted() -Methode wird das Speichern von Videos, die vollständig entschlüsselt wurden, in etwa 4 Sekunden ausgeführt. Decrypted 1 MB mit dem anderen nehmen Sie rund 20. – user1086377

Antwort

0

Wenn jemand interessiert. FilterOutputStream ist falsch implementiert. Sun schrieb die Schreibmethode falsch. Muss den Schreibvorgang überschreiben, damit er ordnungsgemäß funktioniert.

+0

Sie meinen, dass "die' write' Methode von 'FilterOutputStream' die' write' Methode eines Arguments * auf jedem Byte * zur Ausgabe aufruft, "und dass" diese Methode * nicht * die 'write' Methode ihres zugrundeliegenden Objekts aufruft Eingabestream mit den gleichen Argumenten; Unterklassen von 'FilterOutputStream' sollten eine effizientere Implementierung dieser Methode bieten?" Diese Punkte werden in der Dokumentation deutlich gemacht, daher glaube ich, dass es ehrlicher ist zu sagen, dass Sie die API falsch benutzt haben, als zu sagen: "Sun hat die' write' Methode falsch geschrieben. " – erickson

+0

@erickson aus der Dokumentation "Die Klasse FilterOutputStream selbst überschreibt einfach alle Methoden von OutputStream mit Versionen, die alle Anforderungen an den zugrunde liegenden Ausgabestream übergeben. Unterklassen von FilterOutputStream können einige dieser Methoden zusätzlich überschreiben und zusätzliche Methoden und Felder bereitstellen." – user1086377

+0

Die Dokumentation behauptet, dass die gefilterte outputstream-Klasse nichts anderes tut als die Aufrufe an den zugrunde liegenden Ausgabestream weiterzuleiten, sondern stattdessen die Funktionsweise des zugrunde liegenden Objekts manipuliert und dokumentiert, dass es vermutlich absichtlich Byte-Array-Schreibaufrufe ineffizient gemacht hat. – user1086377

Verwandte Themen