klasa crypto i algorytm 3-DES

0

jednym z problemów które mam to problem z zaszyfrowanym blokiem danych. W specyfikacji algorytmu 3-DES pisze, że używa bloków 64 bitowych. Więc wczytuje 64 bity (8 bajtów) z pliku i nastepnie jak używam funkcji
outputBuffer = c.doFinal(inputBuffer);
gdzie inputBuffer to 8 bajtowy ciąg niezakodowanych znaków.

po wykonaniu tej funkcji outputBuffer ma długość 16 bajtów, nie wiem dlaczego.

Kolejnym problemem to drugi odczyt bloku danych niezaszyfrowanych.

Oto kod klasy szyfrującej:

package szyfrator;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;

/**
 *
 * @author wafcio
 */
public class cipher3des {
    private SecretKey key;
    private Cipher c;
    private byte[] inputBuffer;
    private byte[] outputBuffer;
    private int offsetReader;
    private int offsetWriter;
    private InputStream input;
    private OutputStream output;
    private int eof;


    public void start(String inputFile, String outputFile, String mode) {
        offsetReader = 0;
        offsetWriter = 0;
        inputBuffer = new byte[8];
        outputBuffer = new byte[8];
        eof = 0;
      
        try {
            input = new FileInputStream(inputFile);
            output = new FileOutputStream(outputFile);
        } catch (FileNotFoundException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }

        //three key generated
        key = generateKey();
  
        //get cipher instance
        try {
            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);
        }
    }

    private SecretKey generateKey() {
        // Get a key generator for Triple DES (a.k.a DESede)
        KeyGenerator keygen = null;
        try {
            keygen = KeyGenerator.getInstance("DESede");
            keygen.init(168);
        } catch (NoSuchAlgorithmException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }
        // Use it to generate a key
        return keygen.generateKey();
    }

    public void encrypt() {
        try {
            c.init(Cipher.ENCRYPT_MODE, key);
            readFile();
            while(eof>-1) {
                outputBuffer = c.doFinal(inputBuffer);
                writeFile();
                readFile();
            }
        } catch (IllegalBlockSizeException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadPaddingException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void decrypt() {
        try {
            c.init(Cipher.DECRYPT_MODE, key);
            readFile();
            while(eof>-1) {
                outputBuffer = c.doFinal(inputBuffer);
                writeFile();
                readFile();
            }
        } catch (IllegalBlockSizeException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (BadPaddingException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InvalidKeyException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void readFile() {
        for(int i = 0; i<inputBuffer.length; i++) {
            inputBuffer[i] = 0;
            outputBuffer[i] = 0;
        }

        try {
            eof = input.read(inputBuffer, offsetReader, 8);
            offsetReader += eof;
        } catch (IOException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private void writeFile() {
        try {
            output.write(outputBuffer, offsetWriter, eof);
            offsetWriter += eof;
        } catch (IOException ex) {
            Logger.getLogger(cipher3des.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
0

Nie doFinal tylko update. doFinal kończy zapis i wstawia uzupełnienie do 168 bitowego bloku by wiadomość była długości klucza.

1 użytkowników online, w tym zalogowanych: 0, gości: 1