2009-08-02 22 views
3

Dieses ist meine ursprüngliche xml:paar Zeichen nach der Entschlüsselung fehlt

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <row> 
     <id>12</id> 
     <name>Mickey Mouse</name> 
    </row> 
</table> 

Dies ist der Ausgang nach

<?xml version="1.0" encoding="UTF-8"?> 
<table> 
    <row> 
     <id>12</id> 
     <name>Mickey Mouse</name> 
    </row> 
</ 
durch Verschlüsselungs-/Entschlüsselungs-Prozess geht

Wie Sie sehen können, einige Zeichen fehlen.

Hier ist mein Code.

import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.security.InvalidKeyException; 
import java.security.NoSuchAlgorithmException; 

import javax.crypto.BadPaddingException; 
import javax.crypto.Cipher; 
import javax.crypto.CipherInputStream; 
import javax.crypto.CipherOutputStream; 
import javax.crypto.IllegalBlockSizeException; 
import javax.crypto.NoSuchPaddingException; 
import javax.crypto.spec.SecretKeySpec; 

public class Decrypter 
{ 

    /** 
    * @param args 
    * @throws IOException 
    * @throws NoSuchPaddingException 
    * @throws NoSuchAlgorithmException 
    * @throws InvalidKeyException 
    * @throws BadPaddingException 
    * @throws IllegalBlockSizeException 
    */ 
    public static void main(String[] args) throws IOException, 
     NoSuchAlgorithmException, NoSuchPaddingException, 
     InvalidKeyException, IllegalBlockSizeException, BadPaddingException 
    { 
    // TODO Auto-generated method stub 
    File iFile = new File("normal.xml"); 
    FileInputStream fis = new FileInputStream(iFile); 

    File oFile = new File("normal.xml.encrypted"); 
    FileOutputStream fos = new FileOutputStream(oFile); 

    String algorithm = "DESede"; 
    byte[] keyBytes = new byte[] { 0x34, 0x11, 0x12, 0x06, 0x34, 0x11, 
     0x12, 0x06, 0x34, 0x11, 0x12, 0x06, 0x34, 0x11, 0x12, 0x06, 
     0x34, 0x11, 0x12, 0x06, 0x34, 0x11, 0x12, 0x06 }; 

    SecretKeySpec key = new SecretKeySpec(keyBytes, algorithm); 

    // generates encrypted output from normal.xml. 
    Cipher cipher = Cipher.getInstance(algorithm); 
    cipher.init(Cipher.ENCRYPT_MODE, key); 
    CipherOutputStream cos = new CipherOutputStream(fos, cipher); 

    int b; 
    while ((b = fis.read()) != -1) 
    { 
     cos.write(b); 
    } 

    fos.close(); 
    fos = null; 
    fis.close(); 
    fis = null; 

    System.out.println("done"); 

    // decrypt encrypted xml to normal xml. 
    File ieFile = new File("normal.xml.encrypted"); 
    FileInputStream fies = new FileInputStream(ieFile); 

    Cipher ieCipher = Cipher.getInstance(algorithm); 
    ieCipher.init(Cipher.DECRYPT_MODE, key); 
    CipherInputStream cis = new CipherInputStream(fies, ieCipher); 

    File oeFile = new File("normal.xml.encrypted.xml"); 
    FileOutputStream foes = new FileOutputStream(oeFile); 

    int c; 
    while ((c = cis.read()) != -1) 
    { 
     foes.write(c); 
    } 

    foes.close(); 
    cis.close(); 
    fies.close(); 

    System.out.println("done done"); 
    } 

} 

Bitte helfen Sie. Vielen Dank.

+0

Ich musste wirklich darauf starren, um zu sehen, welche Zeichen fehlen. Es scheint die "Tabelle" im schließenden Tag zu sein. – DOK

+0

Das Tabellen-Tag ist nicht notwendig, es sind immer die letzten Zeichen. :( – janetsmith

Antwort

8

Das Problem gefunden. Haben

 cos.close(); 

vor der Zeile:

 fos.close(); 

Zumindest ist das reparierte es auf meiner Box.

+0

Danke, ich hätte nie gedacht, dass die abschließende Sequenz von io stream das Ergebnis beeinflusst Die Moral der Geschichte: Schließen Sie immer die äußere Schicht des Eingabe-/Ausgabestroms. – janetsmith

1

Versuchen Sie, Ihre CipherOutputStream (cos) zu schließen (oder zumindest zu leeren), da es möglicherweise einige Bytes gibt, die nie in die ursprüngliche verschlüsselte Datei geschrieben wurden.

+0

ich versuchte, sie vor dem Schließen der fos cos.flush() zu spülen; fos.flush(); fos.close(); cos.close();. funktioniert immer noch nicht – janetsmith

+0

Flushing ist nicht genug, da der CipherOutputStream wissen muss, dass es keine Daten mehr geben wird, bevor er den letzten Block schreiben kann. –

5

Nach dem verschlüsselten Ausgang zu schreiben, rufen

cos.close(); 

anstelle von

fos.close(); 

Schließen der cos-Objekt auch die zugrunde liegenden fos Objekt geschlossen wird.

0

stimme mit JASON überein. Sie müssen den Cipher-Stream anstelle der Datei schließen. sogar Sie können beide explizit schließen, aber stellen Sie sicher, dass Sie zuerst den Verschlüsselungsstrom und dann den Datenstrom schließen. Nur Spülen hilft nicht. zumindest funktionierte es nicht für mich. :)

Verwandte Themen