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

    package com.cn.peitest;
    
    import javax.crypto.Cipher;
    import javax.crypto.SecretKey;
    import javax.crypto.SecretKeyFactory;
    import javax.crypto.spec.DESKeySpec;
    import javax.crypto.spec.IvParameterSpec;
    
    /**
     * @功能说明:        <BR>
     * @创建日期:2016年9月21日<BR>
     * @变更记录:<BR>
     * 1、2016年9月21日 LeoLu 更新
     */
    public class DESUtil {
    
      /**用于建立大写的十六进制字符的输出*/
      private static final char[] DIGITS_UPPER = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
     
      /**DES向量*/
      private static final byte[] iv = {0x12, 0x34, 0x56, 0x78, (byte) 0x90, (byte) 0xab, (byte) 0xcd, (byte) 0xef};
     
      //private static final  Logger log = LoggerFactory.getLogger(DESUtil.class);
      /**
       * @函数名称:encodeHex<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明: 将字节数组转换为十六进制字节数组 <br>
       * @参数说明:data byte[] 字节数组<br>
       * @参数说明:toDigits char[] 向量<br>
       * @返回说明:十六进制char[]
       */
      private static char[] encodeHex(byte[] data, char[] toDigits) {
          int l = data.length;
          char[] out = new char[l << 1];
          for (int i = 0, j = 0; i < l; i++) {
              out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
              out[j++] = toDigits[0x0F & data[i]];
          }
          return out;
      }
     
     
      /**
       * @函数名称:encodeHexStr<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明:将16进制字节数组转换为十六进制字符串 <br>
       * @参数说明:data byte[] 16进制字节数组 <br>
       * @参数说明:toDigits char[] 向量 <br>
       * @返回说明:String 返回16进制字符串
       */
      private static String encodeHexStr(byte[] data, char[] toDigits) {
         return new String(encodeHex(data, toDigits));
     }
     
      /**
       * @函数名称:hexStringToString<br>
       * @创建日期:2016年9月21日<br>
       * @功能说明:将16进制字符串转换为10进制字符串 <br>
       * @参数说明:str String 16进制字符串 <br>
       * @返回说明:String
       */
     private static String hexStringToString(String str) {  
        if (str == null || str.equals("")) {  
            return null;  
        }  
        str = str.replace(" ", "");  
        byte[] baKeyword = new byte[str.length() / 2];  
        for (int i = 0; i < baKeyword.length; i++) {  
            try {  
                baKeyword[i] = (byte) (0xff & Integer.parseInt(  
                        str.substring(i * 2, i * 2 + 2), 16));  
            } catch (Exception e) {  
                e.printStackTrace();  
            }  
        }  
        try {  
            str = new String(baKeyword, "UTF-8");  
            new String();  
        } catch (Exception e1) {  
            e1.printStackTrace();  
        }  
        return str;  
    }  
     
      /**
       * @函数名称:encrypt<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明:加密字节数组  <br>
       * @参数说明:arrB byte[] 需要加密的字节数组 <br>
       * @参数说明:key String 秘钥 <br>
       * @返回说明:byte[]
       */
      private static byte[] encrypt(byte[] arrB, String key) throws Exception {  
          return converCrypt(arrB, key, true);  
      }  
     
     
      /**
       * @函数名称:encrypt<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明:加密字符串 <br>
       * @参数说明:xml String 加密字符串 <br>
       * @参数说明:key String 秘钥 <br>
       * @返回说明:String 返回加密后的16进制字符串
       */
      public static String encrypt(String xml, String key) {
        try {
          return encodeHexStr(encrypt(xml.getBytes("UTF-8"), key), DIGITS_UPPER);
        } catch (Exception e) {
          System.out.println(e);
          return "";
        }
       
      }  
     
     
      /**
       * @函数名称:decrypt<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明: 将16进制字节数组进行解密  <br>
       * @参数说明: arrB byte[] 解密字节数组<br>
       * @参数说明:key String 秘钥 <br>
       * @返回说明:byte[] 返回解密后 的16位字节数组
       */
      private static byte[] decrypt(byte[] arrB, String key) throws Exception {
          return converCrypt(arrB, key, false);  
      }
     
      /**
       * @函数名称:converCrypt<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明:将16位的字节数据进行加密或解密 <br>
       * @参数说明: arrB byte[] 需要加密的字节数组<br>
       * @参数说明: key String 秘钥<br>
       * @参数说明:encrypt boolean是否加密,true加密,false解密 <br>
       * @返回说明:byte[] 返回16进制字节数组
       */
      private static byte[] converCrypt(byte[] arrB, String key, boolean encrypt) throws Exception{
        
        String vikey = MD5.sign(key).substring(0, 8).toUpperCase();
        DESKeySpec desKeySpec = new DESKeySpec(vikey.getBytes());  
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");  
        SecretKey secretKey = keyFactory.generateSecret(desKeySpec);  
        IvParameterSpec ivp = new IvParameterSpec(vikey.getBytes());  
        Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
        
        /**加密*/
        if (encrypt == true) {
          cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivp);  
        } else{
          /**解密*/
          cipher.init(Cipher.DECRYPT_MODE, secretKey, ivp);  
        }
        
        return cipher.doFinal(arrB);
        
      }
     
     
      /**
       * @函数名称:decrypt<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明:解密16进制字符串  <br>
       * @参数说明: desStr String 需要解密的16进制字符串<br>
       * @参数说明: key String 秘钥<br>
       * @返回说明:String 返回解密后的10进制字符串
       */
      public static String decrypt(String desStr, String key) {
        try{
          if (null == desStr || null == key) {
            return "";
          }
          return hexStringToString(encodeHexStr(decrypt(hexStringToByte(new String(desStr.getBytes("UTF-8"))), key), DIGITS_UPPER));
        } catch (Exception e) {
          System.out.println();
          return "";
        }
       
      }
     
      /**
       * @函数名称:hexStringToByte<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明:将16进制字符串转换为16进制字节数组 <br>
       * @参数说明:hex String需要转换的16进制字符串 <br>
       * @返回说明:byte[] 返回转换后的16进制字节数组
       */
      private static byte[] hexStringToByte(String hex) {
        int len = (hex.length() / 2);
        byte[] result = new byte[len];
        char[] achar = hex.toCharArray();
        for (int i = 0; i < len; i++) {
         int pos = i * 2;
         result[i] = (byte) (toByte(achar[pos]) << 4 | toByte(achar[pos + 1]));
        }
        return result;
       }
     
      /**
       * @函数名称:toByte<br>
       * @创建日期:2016年9月22日<br>
       * @功能说明: 将字符转换为字节<br>
       * @参数说明: c char 需要转换的字符<br>
       * @返回说明:int 返回字符对应的字节码
       */
      private static int toByte(char c) {
        byte b = (byte) "0123456789ABCDEF".indexOf(c);
        return b;
     }
      /**
       * @构造函数
       */
      public DESUtil() {
        // TODO Auto-generated constructor stub
      }
    
      /**
       * @函数名称:main<br>
       * @创建日期:2016年9月21日<br>
       * @功能说明: <br>
       * @参数说明: <br>
       * @返回说明:void
       */
      public static void main(String[] args) {
        // TODO Auto-generated method stub
         try {
         System.out.println("-----------------------------");
         String bStr = "123";
         String key = "SZAOA589";
         String binSing = encrypt(bStr, key);
         System.out.println("加密前:"+bStr);
         System.out.println("加密后:"+binSing);
         System.out.println("解密后:"+decrypt(binSing, key));
         System.out.println("-------------------------");
        
        } catch (Exception e) {
          // TODO Auto-generated catch bloc
          e.printStackTrace();
        }
         //3B976A2A2919A60B57DFF3518F65E1FF
         //3B976A2A2919A60B57DFF3518F65E1FF
         /*
          * C4A737D04D0D05E2
            BD2DD4FC5050EBD0
          */
         
      }
    
    }
    //================================
    package com.cn.peitest;
    
    import java.security.MessageDigest;
     
    public class MD5 {
         // 生成MD5(截取16位长度)
        public static String sign(String message) {
            String md5 = "";
            try {
                MessageDigest md = MessageDigest.getInstance("MD5"); // 创建一个md5算法对象
                byte[] messageByte = message.getBytes("UTF-8");
                byte[] md5Byte = md.digest(messageByte); // 获得MD5字节数组,16*8=128位
                md5 = bytesToHex(md5Byte).substring(0, 16); // 转换为16进制字符串
            } catch (Exception e) {
                e.printStackTrace();
            }
            return md5;
        }
    
        // 二进制转十六进制
        public static String bytesToHex(byte[] bytes) {
            StringBuffer hexStr = new StringBuffer();
            int num;
            for (int i = 0; i < bytes.length; i++) {
                num = bytes[i];
                if (num < 0) {
                    num += 256;
                }
                if (num < 16) {
                    hexStr.append("0");
                }
                hexStr.append(Integer.toHexString(num));
            }
            return hexStr.toString().toUpperCase();
        }
    }
  • 相关阅读:
    321list,元组,range**数字是不可迭代的!
    320作业
    320基础数据类型初始
    319作业
    316作业
    319 Python基础之格式化输出、逻辑运算符、编码、in not in、while else、
    windows查看端口占用指令
    2016年学习计划
    刷算法的时候有没有必要自写测试用例?
    我们为什么不能只用O记号来谈论算法?
  • 原文地址:https://www.cnblogs.com/xianz666/p/13408822.html
Copyright © 2011-2022 走看看