天天看点

DES 加解密工具类

一、DES加解密工具类

package com.hans.common.util;

import java.io.*;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Objects;

import javax.crypto.*;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class DES {

    public static final String KEY = "ydiqfkea";

    /**
     * 加密函数
     *
     * @param data
     * 加密数据
     * @param key
     * 密钥
     * @return 返回加密后的数据
     */
    public static byte[] encrypt(byte[] data, byte[] key) {
        try {
            // DES算法要求有一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
            // 从原始密钥数据创建DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key);
            // 创建一个密匙工厂,然后用它把DESKeySpec转换成
            // 一个SecretKey对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(dks);
            // using DES in ECB mode
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
            // 用密匙初始化Cipher对象
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, sr);
            // 执行加密操作
            return cipher.doFinal(data);
        } catch (Exception e) {
            System.err.println("DES算法,加密数据出错!");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 解密函数
     *
     * @param data
     * 解密数据
     * @param key
     * 密钥
     * @return 返回解密后的数据
     */
    public static byte[] decrypt(byte[] data, byte[] key) {
        try {
// DES算法要求有一个可信任的随机数源
            SecureRandom sr = new SecureRandom();
// byte rawKeyData[] = /* 用某种方法获取原始密匙数据 */;
// 从原始密匙数据创建一个DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key);
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
// 一个SecretKey对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(dks);
// using DES in ECB mode
            Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
// 用密匙初始化Cipher对象
            cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);
// 正式执行解密操作
            return cipher.doFinal(data);
        } catch (Exception e) {
            System.err.println("DES算法,解密出错。");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 加密函数
     *
     * @param data
     * 加密数据
     * @param key
     * 密钥
     * @return 返回加密后的数据
     */
    public static byte[] CBCEncrypt(byte[] data, byte[] key, byte[] iv) {
        try {
// 从原始密钥数据创建DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key);
// 创建一个密匙工厂,然后用它把DESKeySpec转换成
// 一个SecretKey对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(dks);
// Cipher对象实际完成加密操作
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
// 若采用NoPadding模式,data长度必须是8的倍数
// Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
// 用密匙初始化Cipher对象
            IvParameterSpec param = new IvParameterSpec(iv);
            cipher.init(Cipher.ENCRYPT_MODE, secretKey, param);
// 执行加密操作
            return cipher.doFinal(data);
        } catch (Exception e) {
            System.err.println("DES算法,加密数据出错!");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 解密函数
     *
     * @param data
     * 解密数据
     * @param key
     * 密钥
     * @return 返回解密后的数据
     */
    public static byte[] CBCDecrypt(byte[] data, byte[] key, byte[] iv) {
        try {
// 从原始密匙数据创建一个DESKeySpec对象
            DESKeySpec dks = new DESKeySpec(key);
// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
// 一个SecretKey对象
            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
            SecretKey secretKey = keyFactory.generateSecret(dks);
// using DES in CBC mode
            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
// 若采用NoPadding模式,data长度必须是8的倍数
// Cipher cipher = Cipher.getInstance("DES/CBC/NoPadding");
// 用密匙初始化Cipher对象
            IvParameterSpec param = new IvParameterSpec(iv);
            cipher.init(Cipher.DECRYPT_MODE, secretKey, param);
// 正式执行解密操作
            return cipher.doFinal(data);
        } catch (Exception e) {
            System.err.println("DES算法,解密出错。");
            e.printStackTrace();
        }
        return null;
    }
    /**
     * sn 解密
     * @return
     */
    public static String decrypt(String sn,String key){
        String result = "";
        try {
            BASE64Decoder base64De = new BASE64Decoder();
            byte[] b = null;
            sn=sn.replaceAll("-", "/").replaceAll("_", "+");
            if("..".equals(sn.substring(sn.length() - 2, sn.length()))){
                sn = sn.substring(0, sn.length()-2) +"==";
            }else if(".".equals(sn.substring(sn.length() - 1, sn.length()))){
                sn = sn.substring(0, sn.length()-1) +"=";
            }
            b = base64De.decodeBuffer(sn);
            result = new String(Objects.requireNonNull(DES.decrypt(b, key.getBytes())));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }



	// 根据密码解密文件。
	public static void decryptFile(String file, String newFile, String key) {
		// DES算法要求有一个可信任的随机数源
		SecureRandom sr = new SecureRandom();
		// byte rawKeyData[] = /* 用某种方法获取原始密匙数据 */;
		// 从原始密匙数据创建一个DESKeySpec对象
		DESKeySpec dks = null;
		InputStream in = null;
		CipherOutputStream cout = null;
		OutputStream out = null;
		try {
			dks = new DESKeySpec(key.getBytes("utf8"));
			// 创建一个密匙工厂,然后用它把DESKeySpec对象转换成
			// 一个SecretKey对象
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey secretKey = keyFactory.generateSecret(dks);
			// using DES in ECB mode
			Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.DECRYPT_MODE, secretKey, sr);

			in = new FileInputStream(file);
			out = new FileOutputStream(newFile);
			cout = new CipherOutputStream(out, cipher);
			byte[] buffer = new byte[1024];
			int count = 0;
			while ((count = in.read(buffer)) > 0) {
				cout.write(buffer, 0, count);
			}
		} catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | IOException e) {
			e.printStackTrace();
		} finally {
			try {
				cout.close();
				out.close();
				in.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}


    /**
     *
     * @param bytes byte数组
     * @return 字符串
     */
	public static String getEncryptStr(byte[] bytes){
        BASE64Encoder base64Encoder = new BASE64Encoder();
        String encoderStr = base64Encoder.encode(Objects.requireNonNull(bytes));
        return encoderStr.replaceAll("/", "-").replaceAll("\\+", "_");
    }
}