import java.io.*;
import javax.crypto.*;
import javax.crypto.spec.*;

public class DecryptData
{

/* Deszyfrowanie pliku za pomocą potrójnego algorytmu DES (DESede)..
   Nazwę pliku należy podać w wierszu poleceń
   pomijając rozszerzenie .enc */

    public static void main(String[] args)
    {
        try
        {
// Tworzenie tablicy, w której zostanie umieszczony klucz.
            byte[] encryptKey = "Klucz testowy DESede".getBytes();

// Tworzenie specyfikacji klucze DESede na podstawie klucza.
            DESedeKeySpec spec = new DESedeKeySpec(encryptKey);

// Tworzenie konstruktora kluczy poufnych, który posłuży do generowania kluczy DESede.
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(
                "DESede");

// Generowanie obiektu DESede SecretKey.
            SecretKey theKey = keyFactory.generateSecret(spec);

// Tworzenie obiektu DESede Cipher.
            Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");

// Inicjalizacja obiektu Cipher i ustawianie trybu deszyfrowania.
            cipher.init(Cipher.DECRYPT_MODE, theKey);

// Otwarcie pliku do odszyfrowania.
            FileInputStream in = new FileInputStream(args[0]+".enc");

// Otwieranie pliku wynikowego.
            FileOutputStream out = new FileOutputStream(args[0]);

            byte[] buffer = new byte[8];
            int len;

// Wczytywanie jednego bloku DES w każdym przebiegu.
            while ((len = in.read(buffer)) > 0)
            {
                // Add the bytes to the cipher
                byte[] encrypted = cipher.doFinal(buffer, 0, len);
                out.write(encrypted);
            }

            in.close();
            out.close();
        }
        catch (Exception exc)
        {
            exc.printStackTrace();
        }
    }
}
