2016-08-29 1 views
0

Ich möchte eine verschlüsselte Datei mit einer magischen Zahl in ihrem ersten Zeichen erstellen.
Wenn ich die Datei verschlüsseln, geht alles gut, aber wenn ich zuerst die magische Zahl schreibe, dann wird der verschlüsselte Teil gekürzt.Android-Datei gekürzt/abgeschnitten

Ich verwende eine TXT-Datei zum Testen.

Dies ist mein Code:

 FileInputStream fis= new FileInputStream(file) 
     [...] 
     //Write magic number 
     fos.write("%AES".getBytes(),0,4); 
     byte[] ivbytes = new byte[]{(byte)'a', (byte)'b', (byte)'c', (byte)'d', (byte)'e', (byte)'f', (byte)'g', (byte)'h', (byte)'i', (byte)'j', (byte)'k', (byte)'l', (byte)'m', (byte)'n', (byte)'o', (byte)'p'}; 
     IvParameterSpec iv = new IvParameterSpec(ivbytes); 
     while(pwd.length()<16) { 
      pwd+="_"; 
     } 
     SecretKeySpec sks = new SecretKeySpec(pwd.getBytes(), "AES"); 
     // Create cipher 
     Cipher cipher = Cipher.getInstance("AES/CFB8/NoPadding"); 
     cipher.init(Cipher.ENCRYPT_MODE, sks,iv); 
     // Wrap the output stream 
     CipherOutputStream cos = new CipherOutputStream(fos, cipher); 
     while((k = fis.read(d)) > 0) 
     { 
      cos.write(d, 0, k); 
     } 
     // Flush and close streams. 
     cos.flush(); 
     cos.close(); 
     fis.close(); 
     [...] 

dies ist der hexadezimale Inhalt missing byte

Debuggen das gleiche wie die von 4 versetzt ist, aber wenn es Zeit für die letzte Lese ist, wird das Ergebnis turuncated.

Ich versuche, die Datei zu verschlüsseln, dann verwenden Sie eine zweite mit magischer Nummer gefolgt von einem Byte zu Byte kopieren, aber nichts ist es immer gleich.

für das Debuggen erstellen ich eine Textdatei mit der Sequenz „1234567890“ ich diese zwei with and without magicNumber

eine Rückkehr die richtige Reihenfolge, die otherone return „“

+0

Debug, schaue k und die geschriebene Datei in hex, finde den Unterschied. – zaph

+0

der Unterschied ist die Größe von dem, was ich als magische Zahl, die geschnitten wird, vorgesetzt, auch die Größe der erstellten Datei ist die gleiche wie das Original. –

+0

Wo wird 'fis' erstellt? – zaph

Antwort

0
hexadezimal erhalten

Das Problem sind die Daten gelesen von fis.read(d) fehlen die letzten vier Bytes.

Wo ist fis erstellt und wie? Watch k und d in der while((k = fis.read(d)) > 0) Schleife. Das Problem ist nicht die Verschlüsselung, es liest die richtige Eingabe.

+0

fis wird mit dieser Zeile deklariert: FileInputStream fis = new FileInputStream (Datei); und Datei ist ein Parameter; k lesen 55 Zeit 8 Byte, das letzte Lesen (die Zahl 56) lesen 6 Byte mit Wert 115, 117,101,46,13,10,105, 105, die letzten zwei werden nicht für die Schreibsignatur schreiben, aber auch mit write (byte []) ist nutzlos. –

+0

Fügen Sie zusätzliche Informationen zu der Frage hinzu, ein Kommentar wie dieser ist wirklich schwer zu verstehen. Eine vollständige Frage hilft wirklich, siehe: [mcve]. – zaph

+0

ich füge einige Informationen hinzu –