CipherInput/OutputStream-Problem

Landei

Top Contributor
Hallo!

Ich kann meine Projektfiles im Klartext als XML oder verschlüsselt über einen CipherInput/OutputStream schreiben. Die verschlüsselte Variante klappt auf einmal (wurde länger nicht verwendet) nicht mehr, es sieht so aus, als wären Zeichen abgeschnitten.

Die Initialisierung der Streams:
Java:
            final byte[] salt = {(byte) ...};
            final char[] c = { ...};

            final KeySpec keySpec = new PBEKeySpec(c, salt, 19);
            final SecretKey key = SecretKeyFactory.getInstance(
                    "PBEWithMD5AndDES").generateSecret(keySpec);
            ecipher = Cipher.getInstance(key.getAlgorithm());
            dcipher = Cipher.getInstance(key.getAlgorithm());
            final AlgorithmParameterSpec paramSpec = new PBEParameterSpec(salt,
                    19);
            ecipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);
            dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

Laden (nutzt den gleichen SaxHandler wie die Klartext-Variante):
Java:
            fis = new FileInputStream(fileName);
            cis = new CipherInputStream(fis, dcipher);
            final SAXParser saxParser = factory.newSAXParser();
            saxParser.parse(new InputSource(cis),
                            new ProjectXmlHandler(project));
Code:
SEVERE: Error loading project: com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException
[com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.invalidByte(UTF8Reader.java:684),
com.sun.org.apache.xerces.internal.impl.io.UTF8Reader.read(UTF8Reader.java:369), 
com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.load(XMLEntityScanner.java:1742),
com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.arrangeCapacity(XMLEntityScanner.java:1619),
com.sun.org.apache.xerces.internal.impl.XMLEntityScanner.skipString(XMLEntityScanner.java:1657),
com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:193),
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771),
com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:737),
com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:107), 
com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1205), 
com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522), 
javax.xml.parsers.SAXParser.parse(SAXParser.java:395), 
zebra.project.EncryptedProjectIO.loadFromFile(EncryptedProjectIO.java:124),
...
Der Fehler tritt kurz vor dem Ende auf, wenn ich mir statt zu parsen das Ding ausgeben lasse, ist Schluss bei
Code:
<filter type="zebra.filter.MinMaxFilter" name="Glatt%40MM25" position="220,360,80,60" color="255,200,0" >
    <input filter="avg%40MM25" port="default" />
    <param key="AVERAGE" value="25"/>
  </filter
Es käme noch:
Code:
>
</project>
Wobei alle Filter vorher mit der gleichen Routine korrekt geschrieben/gelesen werden konnten.

Schreiben (gleicher String wie Klartext-Variante):
Java:
        FileOutputStream fos = new FileOutputStream(fileName);
        final OutputStream writer = new CipherOutputStream(fos, ecipher);
        try {
            writer.write(XmlProjectIO.getProjectXml(project).getBytes("UTF-8")); //oder ohne Angabe, macht keinen Unterschied
            writer.flush();
        }

Durch die Verschlüsselung sehe ich ja noch nicht mal, ob der Fehler beim Schreiben oder Lesen passiert.

Irgendwelche Ideen?
 
Zuletzt bearbeitet von einem Moderator:
Hmmm, vielleicht wegen der falschen Reihenfolge beim Schließen?
Java:
    public void saveToFile(final String fileName, final Project project) throws
            IOException {
        project.setFileName(fileName);
        FileOutputStream fos = new FileOutputStream(fileName);
        final OutputStream writer = new CipherOutputStream(fos, ecipher);
        try {
            writer.write(XmlProjectIO.getProjectXml(project).getBytes("UTF-8"));
            writer.flush();
        } finally {
            if (fos != null) {
                fos.close();
            }
            if (writer != null) {
                writer.close();
            }
        }
    }

Ich teste mal...

[edit]Du bist mein persönlicher Rockstar! Geschlossen habe ich, aber in der verkehrten Reihenfolge!!!
 
Zuletzt bearbeitet:

Zurück
Oben