Algorytm szyfrujący: DESede (Triple DES), tryb ECB
Przy szyfrowaniu i deszyfrowaniu korzystam z providera SunJCE

szyfrowanie odbywa się normalnie przy wykorzystaniu metody update, ale od razu po zaszyfrowaniu chciałem sprawdzić, czy tekst zaszyfrowany jest poprawny, więc zainicjalizowałem Cipher.DECRYPT_MODE, i przy wykonaniu pierwszego update, bufor wynikowy był pusty, za drugim razem dane były prawidłowe, a za trzecim razem, dane były jeszcze inne (bufor wejściowy za każdym razem był taki sam i wynosił 8 bajtów).

oto moj kod:

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package szyfratorworkspace;

import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.Cipher;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec;
import javax.crypto.spec.PBEParameterSpec;

/**
 *
 * @author wafcio
 */
public class cip {
    private String mode;
    private String password;
    private SecretKey encKey;
    private char[] pass;
    private PBEParameterSpec paramSpec;
    private Cipher cp;
    private String message;
    private byte[] inputBuffer;
    private byte[] outputBuffer;
    private byte[] hide;

    public void encrypt(String mode, String password) {
        System.out.println("SZYFROWANIE");

        this.mode = mode;
        this.password = password;

        encKey = this.passwordToSecretKey();

        try {
            cp = Cipher.getInstance(encKey.getAlgorithm());
            c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");

            cp.init(Cipher.ENCRYPT_MODE, encKey, paramSpec);
            c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchPaddingException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
        }

        message = "ala ma k";
        inputBuffer = message.getBytes();

        outputBuffer = cp.update(inputBuffer);

        System.out.println("Wiadomosc niezaszyforwana: " + message);
        System.out.println("Wiadomosc niezaszyforwana bajtowo: " + Arrays.toString(inputBuffer));
        System.out.println("Wiadomosc zaszyforwana bajtowo: " + Arrays.toString(outputBuffer));

        hide = outputBuffer;
    }

    private SecretKey passwordToSecretKey() {
        byte[] salt = {
            (byte)0xA9, (byte)0x9B, (byte)0xC8, (byte)0x32,
            (byte)0x56, (byte)0x35, (byte)0xE3, (byte)0x03
        };
        int iterationCount = 19;

        int len = 24;
        pass = new char[len];
        int pos = 0;
        while(pos < len) {
            System.arraycopy(password.toCharArray(), 0, pass, pos, password.length());
            pos += password.length();
        }

        SecretKey secretKey = null;
        PBEKeySpec pbeKeysPass = null;
        try {
            pbeKeysPass = new PBEKeySpec(pass, salt, iterationCount);
            SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWithSHA1AndDESede");
            secretKey = factory.generateSecret(pbeKeysPass);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeySpecException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }

        this.paramSpec = new PBEParameterSpec( pbeKeysPass.getSalt(), pbeKeysPass.getIterationCount() );

        return secretKey;
    }

    public void decrypt(String mode, String password) {
        System.out.println("DESZYFROWANIE");
        this.mode = mode;
        this.password = password;

        encKey = this.passwordToSecretKey();

        try {
            cp = Cipher.getInstance(encKey.getAlgorithm());
            c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");

            cp.init(Cipher.DECRYPT_MODE, encKey, paramSpec);
            c = Cipher.getInstance("DESede/" + mode + "/PKCS5Padding");
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (NoSuchPaddingException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidAlgorithmParameterException ex) {
            Logger.getLogger(cip.class.getName()).log(Level.SEVERE, null, ex);
        }

        inputBuffer = hide;
        //outputBuffer = cp.update(inputBuffer);
        //cp.update(inputBuffer, outputBuffer);

        System.out.println();
        System.out.println("Pierwsze wywołanie 'update'");
        System.out.println("Wartości wejściowe: " + Arrays.toString(inputBuffer));
        outputBuffer = cp.update(inputBuffer);
        System.out.println("Wartości wyjściowe: " + Arrays.toString(outputBuffer));

        System.out.println();
        System.out.println("Drugie wywołanie 'update'");
        System.out.println("Wartości wejściowe: " + Arrays.toString(inputBuffer));
        outputBuffer = cp.update(inputBuffer);
        System.out.println("Wartości wyjściowe: " + Arrays.toString(outputBuffer));

        System.out.println();
        System.out.println("Trzecie wywołanie 'update'");
        System.out.println("Wartości wejściowe: " + Arrays.toString(inputBuffer));
        outputBuffer = cp.update(inputBuffer);
        System.out.println("Wartości wyjściowe: " + Arrays.toString(outputBuffer));
        //outputBuffer = cp.update(inputBuffer);
        //outputBuffer = cp.update(inputBuffer);
        //System.out.println("Wiadomosc zaszyforwana bajtowo: " + Arrays.toString(inputBuffer));
        //System.out.println("Wiadomosc niezaszyforwana bajtowo: " + Arrays.toString(outputBuffer));
        //System.out.println("Wiadomosc niezaszyforwana: " + message);
    }
}

a w wyniku otrzymuje

SZYFROWANIE
Wiadomosc niezaszyforwana: ala ma k
Wiadomosc niezaszyforwana bajtowo: [97, 108, 97, 32, 109, 97, 32, 107]
Wiadomosc zaszyforwana bajtowo: [-75, 60, 11, 50, -62, 125, 30, 27]
DESZYFROWANIE

Pierwsze wywołanie 'update'
Wartości wejściowe: [-75, 60, 11, 50, -62, 125, 30, 27]
Wartości wyjściowe: []

Drugie wywołanie 'update'
Wartości wejściowe: [-75, 60, 11, 50, -62, 125, 30, 27]
Wartości wyjściowe: [97, 108, 97, 32, 109, 97, 32, 107]

Trzecie wywołanie 'update'
Wartości wejściowe: [-75, 60, 11, 50, -62, 125, 30, 27]
Wartości wyjściowe: [-84, 74, -60, 32, 54, 90, -7, -97]
BUILD SUCCESSFUL (total time: 0 seconds)

ktoś mi jest w stanie wytłumaczyć czemu tak się dzieje ?

EDIT:
zauważyłem, przy kolejnych testach, że wykonanie dopiero 2. update'a na danych wejściowych zwraca prawidłowy wynik. W pierwszym i od trzeciego w zwyż zwracane są jakieś "śmieci" (dane różne od oryginału)