zoukankan      html  css  js  c++  java
  • 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文件:点击下载

  • 相关阅读:
    【codevs1690】开关灯 (线段树 区间修改+区间求和 (标记))
    【codevs1191】数轴染色 (线段树 区间修改+固定区间查询)
    【机器学习】李航 统计学习方法 知识点总结
    【机器学习】生成模型 判别模型
    【机器学习】贝叶斯定理、精准推断、最大似然估计、连续特征参数估计、EM算法
    python queue 讲解
    【tensorflow】 CNN卷积神经网络原理讲解+图片识别应用(附源码)
    URL解析过程
    Python 可迭代对象迭代器生成器的区别
    【Linux】 修改主机名
  • 原文地址:https://www.cnblogs.com/longshiyVip/p/4707924.html
Copyright © 2011-2022 走看看