How do I encrypt and decrypt files using DES?
Author: Deron Eriksson
Description: This Java tutorial describes how to encrypt and decrypt files using DES.
Tutorial created using: Windows XP || JDK 1.5.0_09 || Eclipse Web Tools Platform 2.0 (Eclipse 3.3.0)


The CipherExample class gives an example of using DES (Data Encryption Standard) to encrypt and decrypt files. DES requires a key (ie, password) that is at least 8 characters long. An exception will be thrown if the password does not meet the minimum size requirements. The CipherExample class takes a plaintext file, "original.txt", and encrypts its contents, storing the ciphertext result in the "encrypted.txt" file. It then takes the "encrypted.txt" file and decrypts its ciphertext contents, storing the resulting plaintext in "decrypted.txt". When done, the contents of "original.txt" and "decrypted.txt" match. The encryption is handled by the use of a DES key and a DES cipher.

CipherExample.java

package test;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;

public class CipherExample {

	public static void main(String[] args) {
		try {
			String key = "squirrel123"; // needs to be at least 8 characters for DES

			FileInputStream fis = new FileInputStream("original.txt");
			FileOutputStream fos = new FileOutputStream("encrypted.txt");
			encrypt(key, fis, fos);

			FileInputStream fis2 = new FileInputStream("encrypted.txt");
			FileOutputStream fos2 = new FileOutputStream("decrypted.txt");
			decrypt(key, fis2, fos2);
		} catch (Throwable e) {
			e.printStackTrace();
		}
	}

	public static void encrypt(String key, InputStream is, OutputStream os) throws Throwable {
		encryptOrDecrypt(key, Cipher.ENCRYPT_MODE, is, os);
	}

	public static void decrypt(String key, InputStream is, OutputStream os) throws Throwable {
		encryptOrDecrypt(key, Cipher.DECRYPT_MODE, is, os);
	}

	public static void encryptOrDecrypt(String key, int mode, InputStream is, OutputStream os) throws Throwable {

		DESKeySpec dks = new DESKeySpec(key.getBytes());
		SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
		SecretKey desKey = skf.generateSecret(dks);
		Cipher cipher = Cipher.getInstance("DES"); // DES/ECB/PKCS5Padding for SunJCE

		if (mode == Cipher.ENCRYPT_MODE) {
			cipher.init(Cipher.ENCRYPT_MODE, desKey);
			CipherInputStream cis = new CipherInputStream(is, cipher);
			doCopy(cis, os);
		} else if (mode == Cipher.DECRYPT_MODE) {
			cipher.init(Cipher.DECRYPT_MODE, desKey);
			CipherOutputStream cos = new CipherOutputStream(os, cipher);
			doCopy(is, cos);
		}
	}

	public static void doCopy(InputStream is, OutputStream os) throws IOException {
		byte[] bytes = new byte[64];
		int numBytes;
		while ((numBytes = is.read(bytes)) != -1) {
			os.write(bytes, 0, numBytes);
		}
		os.flush();
		os.close();
		is.close();
	}

}

For further information about cryptography in JavaSW, you can go to http://java.sun.com/j2se/1.5.0/docs/guide/security/CryptoSpec.html and http://java.sun.com/j2se/1.5.0/docs/guide/security/jce/JCERefGuide.html.