Java DES算法程序

时间:2020-02-23 14:36:29  来源:igfitidea点击:

Java密码术扩展(JCE)提供了用于使用各种算法来生成密钥和数据加密/解密的框架和实现。
在本教程中,我们将使用Java DES实现来加密和解密文件。

DES是一种分组密码算法,其中我们必须使用相同的密钥进行加密和解密。
它是基本的密码技术之一。
这是不安全的,因为我们需要为客户端应用程序提供安全密钥以解密数据。

Java DES加密解密步骤

  • 首先,我们需要使用DES算法获取KeyGenerator实例。

  • 生成将用于加密和解密的" SecureKey"(密钥)。

  • 使用DES算法获取Cipher实例,一个实例用于加密模式,另一个实例用于解密模式。
    使用键和IvParameterSpec对象初始化密码对象。

  • 为了加密,请使用加密密码创建" CipherOutputStream"的对象。
    为了解密,使用解密密码创建CipherInputStream的对象。

  • 读取输入流并写入输出流。

下面的示例首先加密文件,然后将加密的数据保存到新文件。
然后,它解密相同的文件以创建纯文本文件。

package com.theitroad.des;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.spec.AlgorithmParameterSpec;

import javax.crypto.Cipher;
import javax.crypto.CipherInputStream;
import javax.crypto.CipherOutputStream;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

public class DESEncryptionExample {
	private static Cipher encryptCipher;
	private static Cipher decryptCipher;
	private static final byte[] iv = { 11, 22, 33, 44, 99, 88, 77, 66 };

	public static void main(String[] args) {
		String clearTextFile = "/Users/hyman/source.txt";
		String cipherTextFile = "/Users/hyman/cipher.txt";
		String clearTextNewFile = "/Users/hyman/source-new.txt";

		try {
			//create SecretKey using KeyGenerator
			SecretKey key = KeyGenerator.getInstance("DES").generateKey();
			AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

			//get Cipher instance and initiate in encrypt mode
			encryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			encryptCipher.init(Cipher.ENCRYPT_MODE, key, paramSpec);

			//get Cipher instance and initiate in decrypt mode
			decryptCipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			decryptCipher.init(Cipher.DECRYPT_MODE, key, paramSpec);

			//method to encrypt clear text file to encrypted file
			encrypt(new FileInputStream(clearTextFile), new FileOutputStream(cipherTextFile));

			//method to decrypt encrypted file to clear text file
			decrypt(new FileInputStream(cipherTextFile), new FileOutputStream(clearTextNewFile));
			System.out.println("DONE");
		} catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException
				| InvalidAlgorithmParameterException | IOException e) {
			e.printStackTrace();
		}

	}

	private static void encrypt(InputStream is, OutputStream os) throws IOException {

		//create CipherOutputStream to encrypt the data using encryptCipher
		os = new CipherOutputStream(os, encryptCipher);
		writeData(is, os);
	}

	private static void decrypt(InputStream is, OutputStream os) throws IOException {

		//create CipherOutputStream to decrypt the data using decryptCipher
		is = new CipherInputStream(is, decryptCipher);
		writeData(is, os);
	}

	//utility method to read data from input stream and write to output stream
	private static void writeData(InputStream is, OutputStream os) throws IOException {
		byte[] buf = new byte[1024];
		int numRead = 0;
		//read and write operation
		while ((numRead = is.read(buf)) >= 0) {
			os.write(buf, 0, numRead);
		}
		os.close();
		is.close();
	}

}

程序终止后,您可以检查纯文本文件是否具有相同的数据,以及加密文件没有纯文本数据。