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

public class EncryptData
{

/* Szyfrowanie pliku za pomocą potrójnego algorytmu DES (DESede).
   Nazwa pliku jest przekazywana jako parametr w wierszu poleceń. Wynik
   jest zapisywany w pliku o tej samej nazwie, co oryginalny, ale z rozszerzeniem
   ".enc" */

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

// Tworzenie specyfikacji klucza 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");

// Tworzenie 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 szyfrowania.
            cipher.init(Cipher.ENCRYPT_MODE, theKey);

// Otwarcie pliku do szyfrowania.
            FileInputStream in = new FileInputStream(args[0]);

// Otwarcie pliku wynikowego.
            FileOutputStream out = new FileOutputStream(args[0]+".enc");

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

// Odczytywanie jednego bloku DES w każdym przebiegu.
            while ((len = in.read(buffer)) > 0)
            {
                // Dołączanie porcji bajtów do instancji Cipher.
                byte[] encrypted = cipher.doFinal(buffer, 0, len);
                out.write(encrypted);
            }

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