DESede对称加密算法工具类

利用Cipher的核心功能,自己封装了一个加密解密的工具类,可以直接使用。在使用之前需要先下载commons-codec-1.9.jar,并导入项目。

工具类如下:

package com.pcict.util.test;

import org.apache.commons.codec.binary.Base64;

import javax.crypto.*;
import javax.crypto.spec.DESedeKeySpec;
import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.Key;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.util.Arrays;

/**
 * DESede对称加密算法
 * 
 * @Description
 * @author ljz
 * @created 2015年7月31日 上午11:30:04
 * @version
 * @history
 * @see
 */
public class DESedeUtils {

    // 加密模式
    public static final int ENCRYPT_MODE = Cipher.ENCRYPT_MODE;
    // 解密模式
    public static final int DECRYPT_MODE = Cipher.DECRYPT_MODE;

    private static final String ALGORITHM = "DESede";
    private static final Charset UTF8 = Charset.forName("UTF-8");

    private Cipher cipher = null;
    private int opmode = 0;

    // 初始化加密或解密
    public synchronized boolean init(int mode, String key) {
        if (opmode != 0) {
            return true;
        }

        if (mode != ENCRYPT_MODE && mode != DECRYPT_MODE) {
            return false;
        }

        if (key == null || key.isEmpty()) {
            return false;
        }

        try {
            cipher = Cipher.getInstance(ALGORITHM);
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } finally {
            if (cipher == null) {
                return false;
            }
        }
        Key secKey = getSecKey(key);
        if (secKey == null) {
            return false;
        }
        try {
            cipher.init(mode, secKey, new SecureRandom());
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            return false;
        }
        opmode = mode;
        return true;
    }

    private static Key getSecKey(String key) {
        SecretKey securekey = null;
        try {
            byte[] material = Arrays.copyOf(
                    Base64.decodeBase64(key.getBytes(UTF8)), 24);
            DESedeKeySpec keySpec = new DESedeKeySpec(material);
            SecretKeyFactory keyFactory = SecretKeyFactory
                    .getInstance(ALGORITHM);
            securekey = keyFactory.generateSecret(keySpec);
        } catch (InvalidKeyException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InvalidKeySpecException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return securekey;
    }

    // 加密
    public synchronized String encrypt(String data) {
        if (opmode != ENCRYPT_MODE) {
            return null;
        }
        if (data == null) {
            return null;
        }
        byte[] encData = null;
        try {
            encData = cipher.doFinal(data.getBytes(UTF8));
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (encData == null) {
            return null;
        }
        return new String(Base64.encodeBase64(encData), UTF8);
    }

    // 解密
    public synchronized String decrypt(String data) {
        if (opmode != DECRYPT_MODE) {
            return null;
        }
        if (data == null) {
            return null;
        }
        byte[] decData = null;
        try {
            decData = cipher.doFinal(Base64.decodeBase64(data.getBytes(UTF8)));
        } catch (IllegalBlockSizeException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (BadPaddingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        if (decData == null) {
            return null;
        }
        return new String(decData, UTF8);
    }

}

测试如下:

package com.pcict.util.test;

public class Test {
    public static void main(String[] args) {
        DESedeUtils encoder = new DESedeUtils();
        String key = "123456";
        // 以123456作为加密的密匙,在后面解密的时候也要以该密匙作为解密的密匙
        encoder.init(DESedeUtils.ENCRYPT_MODE, key);
        String str = encoder.encrypt("1");
        System.out.println(str);
        DESedeUtils decoder = new DESedeUtils();
        // 调用初始化解密
        decoder.init(DESedeUtils.DECRYPT_MODE, key);
        String str1 = decoder.decrypt(str);
        System.out.println(str1);
    }
}

 附commons-codec-1.9.jar文件:点击下载

posted @ 2015-08-06 14:39  人生设计师  阅读(1764)  评论(0编辑  收藏  举报