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

  • 相关阅读:
    递归
    书评:《C程序设计语言》
    下一代互联网,今日揭开面纱:IPv6真的要来了
    庆祝Alan Mathison Turing(艾伦·图灵)诞辰100周年!
    svn常用命令行和批处理
    ORACLE 9i数据导入到ORACLE 10G中文出现的乱码问题
    Oracle 11G 的客户端,不再支持连接到ORACLE 8I
    DB2 一个汉字的Byte数,太操蛋了
    关于Windows 7 64位下Visual Studio 2010 开发的Asp.net程序连接Oracle 的出现的问题
    Web Frame 跨域调用Session 丢失问题
  • 原文地址:https://www.cnblogs.com/longshiyVip/p/4707924.html
Copyright © 2011-2022 走看看