Java-Chiffre.doFinal() schreiben extra bytes

Ich bin mit der Implementierung von Verschlüsselung /Entschlüsselung unter Verwendung der Java Verschlüsselung und AES. Alles funktioniert gut, außer, dass es 5 zusätzliche bytes, die geschrieben auf den Aufruf von doFinal(). So, Ende ich mit einer richtig decodierten string mit 5 extra-bytes angehängt.

Ich glaube, der Grund ist, dass der gesamte block des 16-Byte geschrieben wird. Ich sehe 3 16-byte-Blöcke geschrieben, darunter das Letzte. Die Eingabe-verschlüsselte Datei beträgt 64 bytes. Der unverschlüsselte text 43 bytes.

In der Dokumentation für doFinal zeigt an, dass es zurückgeben kann, die Anzahl der geschriebenen bytes für den Ausgabepuffer. Es ist jedoch 0,16,16,16. Ich habe versucht, jede form von doFinal und Updates die keine änderung im Verhalten.

Macht es Art von Gefühl, dass es schriftlich aus, ein full-block, denn das ist, wie die meisten dieser algorithmen arbeiten. Allerdings, wenn es gar nicht geht, mir zu sagen, die Größe der output-Daten, wie soll ich verhindern, überschüssige Daten?

Sollte ich vielleicht mit einem anderen Algorithmus? AES256 ist eine Voraussetzung, aber ich Frage mich, wenn Sie einen anderen block geben oder padding geben der es erlauben würde, es zu schreiben die richtige Anzahl von bytes.

Führung?

Geschnippelt für (einige) Kürze:

decryptCipher = Cipher.getInstance("AES");
decryptCipher.init(Cipher.DECRYPT_MODE, aesKey);

Geschäftlichen Teil des Entschlüsselungs-routine.

    long bytesToRead = inputFile.length();

    while ((inLen = in.read(buffer)) > 0) {
        int bytesOut = 0;
        byte[] cryptBytes = null;
        int outLen = cipher.getOutputSize(inLen);
        cryptBytes = new byte[outLen];

        if (bytesToRead <= buffer.length) {
            try {
                bytesOut = cipher.doFinal(buffer, 0, inLen, cryptBytes, 0);
            } catch (ShortBufferException e) {
                //TODO Auto-generated catch block
                e.printStackTrace();
            }
        } else
            try {
                bytesOut = cipher.update(buffer, 0, inLen, cryptBytes, 0);
            } catch (ShortBufferException e) {
                //TODO Auto-generated catch block
                e.printStackTrace();
            }

        out.write(cryptBytes, 0, bytesOut);
        bytesToRead -= inLen;

    }
    try {
        out.flush();
        in.close();
        out.close();
    } catch (IOException e) {
        //TODO Auto-generated catch block
        e.printStackTrace();
    }
InformationsquelleAutor wadesworld | 2009-08-04
Schreibe einen Kommentar