• 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文件:点击下载

  • 相关阅读:
    [ 字典树题目 ]
    AC Challenge [ ACM-ICPC 2018 南京赛区网络预赛 ] [dfs + 二进制记忆化搜索 ]
    ACM-ICPC 2018 南京赛区网络预赛 J.Sum [ 类打表 ]
    Bzoj 3224.普通平衡树 [ 权值线段树 ]
    IP:网际协议
    网络概述
    HashSet
    idea中git各颜色文件含义
    keytool证书管理
    openssl证书管理
  • 原文地址:https://www.cnblogs.com/longshiyVip/p/4707924.html
Copyright © 2020-2023  润新知