zoukankan      html  css  js  c++  java
  • DES 加密解密

    package com.cmsz.common;

    import java.security.Key;
    import java.security.Provider;
    import java.security.Security;

    import javax.crypto.Cipher;

    /**
     * 加密,解密算法
     * @author venus
     *
     */
    public class DES {
        private static String strDefaultKey = "security.defaultkey";
        private  Cipher encryptCipher = null;
        private  Cipher decryptCipher = null;
        private static DES des=null;
        /**
         * 将byte数组转换为表示16进制值的字符串,
         * 如:byte[]{8,18}转换为:0813,
         * 和public static byte[] hexStr2ByteArr(String strIn)
         * 互为可逆的转换过程
         * @param arrB 需要转换的byte数组
         * @return 转换后的字符串
         * @throws Exception 本方法不处理任何异常,所有异常全部抛出
         */
        public String byteArr2HexStr(byte[] arrB)
            throws Exception
        {
            int iLen = arrB.length;
            //每个byte用两个字符才能表示,所以字符串的长度是数组长度的两倍
            StringBuffer sb = new StringBuffer(iLen * 2);
            for (int i = 0; i < iLen; i++)
            {
                int intTmp = arrB[i];
                //把负数转换为正数
                while (intTmp < 0){
                    intTmp = intTmp + 256;
                }
                //小于0F的数需要在前面补0
                if (intTmp < 16){
                    sb.append("0");
                }
                sb.append(Integer.toString(intTmp, 16));
            }
            return sb.toString();
        }


        /**
         * 将表示16进制值的字符串转换为byte数组,
         * 和public static String byteArr2HexStr(byte[] arrB)
         * 互为可逆的转换过程
         * @param strIn 需要转换的字符串
         * @return 转换后的byte数组
         * @throws Exception 本方法不处理任何异常,所有异常全部抛出
         * @author <a href="mailto:zhangji@aspire-tech.com">ZhangJi</a>
         */
        public byte[] hexStr2ByteArr(String strIn)
            throws Exception
        {
            byte[] arrB = strIn.getBytes();
            int iLen = arrB.length;

            //两个字符表示一个字节,所以字节数组长度是字符串长度除以2
            byte[] arrOut = new byte[iLen / 2];
            for (int i = 0; i < iLen; i = i + 2)
            {
                String strTmp = new String(arrB, i, 2);
                arrOut[i / 2] = (byte) Integer.parseInt(strTmp, 16);
            }
            return arrOut;
        }

        /**
         * 默认构造方法,使用默认密钥
         * @throws Exception
         */
        public DES()
            throws Exception
        {
            this(strDefaultKey);
        }
        public static DES getInstance(){
            String key="venustech_tbu_venus4A";//密钥
            
            if(des==null){
                if(key!=null&&!key.equals("")){
                    strDefaultKey=key;                
                }
                try {
                    des=new DES();
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }else{
                if(key!=null&&!key.equals("")&&!key.equals(strDefaultKey)){
                    des=null;
                    strDefaultKey=key;
                    try {
                        des=new DES();
                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            }
            return des;
        }

        /**
         * 指定密钥构造方法
         * @param strKey 指定的密钥
         * @throws Exception
         */
        public DES(String strKey)
            throws Exception
        {
            Security.addProvider((Provider)Class.forName("com.sun.crypto.provider.SunJCE").newInstance());
            Key key = getKey(strKey.getBytes());

            encryptCipher = Cipher.getInstance("DES");
            encryptCipher.init(Cipher.ENCRYPT_MODE, key);

            decryptCipher = Cipher.getInstance("DES");
            decryptCipher.init(Cipher.DECRYPT_MODE, key);
        }

        /**
         * 加密字节数组
         * @param arrB 需加密的字节数组
         * @return 加密后的字节数组
         * @throws Exception
         */
        public byte[] encrypt(byte[] arrB)
            throws Exception
        {
            return encryptCipher.doFinal(arrB);
        }

        /**
         * 加密字符串
         * @param strIn 需加密的字符串
         * @return 加密后的字符串
         * @throws Exception
         */
        public String encrypt(String strIn) throws Exception {
            return byteArr2HexStr(encrypt(strIn.getBytes()));
        }

        /**
         * 解密字节数组
         * @param arrB 需解密的字节数组
         * @return 解密后的字节数组
         * @throws Exception
         */
        public byte[] decrypt(byte[] arrB) throws Exception{
            return decryptCipher.doFinal(arrB);
        }

        /**
         * 解密字符串
         * @param strIn 需解密的字符串
         * @return 解密后的字符串
         * @throws Exception
         */
        public String decrypt(String strIn) throws Exception {
            return new String(decrypt(hexStr2ByteArr(strIn)));
        }

        /**
         * 从指定字符串生成密钥,密钥所需的字节数组长度为8位
         * 不足8位时后面补0,超出8位只取前8位
         * @param arrBTmp 构成该字符串的字节数组
         * @return 生成的密钥
         * @throws java.lang.Exception
         */
        private Key getKey(byte[] arrBTmp) throws Exception {
            //创建一个空的8位字节数组(默认值为0)
            byte[] arrB = new byte[8];
            //将原始字节数组转换为8位
            for (int i = 0; i < arrBTmp.length && i < arrB.length; i++){
                arrB[i] = arrBTmp[i];
            }
            //生成密钥
            Key key = new javax.crypto.spec.SecretKeySpec(arrB, "DES");
            return key;
        }
        
        
        public static void main(String[] args) throws Exception {
            //密钥:venustech_tbu_venus4A
            //密钥构造方法:com.sun.crypto.provider.SunJCE
            
            String encryptString = "111111";
            System.out.println("原始串:"+encryptString);
            String decryptString = DES.getInstance().encrypt("VenusAdmin");
            System.out.println("加密后:"+decryptString);
            System.out.println("解密后:"+DES.getInstance().decrypt("cdcafeef6986b639"));
        }
        
    }

  • 相关阅读:
    Linux 共享库
    使用Visual Studio(VS)开发Qt程序代码提示功能的实现(转)
    ZOJ 3469 Food Delivery(区间DP)
    POJ 2955 Brackets (区间DP)
    HDU 3555 Bomb(数位DP)
    HDU 2089 不要62(数位DP)
    UESTC 1307 windy数(数位DP)
    HDU 4352 XHXJ's LIS(数位DP)
    POJ 3252 Round Numbers(数位DP)
    HDU 2476 String painter (区间DP)
  • 原文地址:https://www.cnblogs.com/besthetiao/p/4615913.html
Copyright © 2011-2022 走看看