/**
 * @工程名称:cargo-apron
 * @程序包名:com.shenzhenair.ecargo.apron.support.util
 * @程序类名:DESUtil.java
 * @创建日期:2016年9月21日
 */
package com.des;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * @功能说明:        <BR>
 * @创建人员:LeoLu<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) {
      log.error("decript str happen error.", 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) {
      log.error("decript str happen error.", e);
      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.des;

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();
    }
}

java编写md5加密解密算法相关推荐

  1. RSA、MD5加密解密算法全套解析安装教程

    第一部分介绍加密解密算法, 第二部分介绍我小组成功应用的RSA.MD5两种加密解密算法,以及心得体会. 1.加密解密算法介绍 应用的开发中安全很重要,所以信息加密技术显得尤为重要.我们需要对应用中的多 ...

  2. MD5加密解密算法 MD5Utils

    import java.security.MessageDigest;public class MD5Utils {/*** MD5加码 生成32位md5码 */public static Strin ...

  3. java 采用MD5加密解密代码示例(不玩套路, 非标题党, 附带解密代码)

    package cn.demo; import java.io.UnsupportedEncodingException; import java.security.MessageDigest; im ...

  4. java 实现 DES加密 解密算法

    DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...

  5. 【Android 安全】DEX 加密 ( Java 工具开发 | 加密解密算法 API | 编译代理 Application 依赖库 | 解压依赖库 aar 文件 )

    文章目录 一.加密解密算法 API 二.编译代理 Application 依赖库 三.解压代理 Application 依赖库 aar 文件 参考博客 : [Android 安全]DEX 加密 ( 常 ...

  6. Java实现MD5加密解密类

    Java实现MD5加密以及解密类,附带测试类,具体见代码. MD5加密解密类--MyMD5Util,代码如下: [java] view plaincopy package com.zyg.securi ...

  7. java采用MD5加密解密

    public class MD5Util { /*** * MD5加码 生成32位md5码 */ public static String string2MD5(String inStr){ Mess ...

  8. 用java实现3DES加密解密算法

    3DES加密也称三重加密,其底层加密算法与DES相同,只不过它的密钥长度是168位.由于在DES加密算法中,64位密钥中每一个字节的第8位是奇偶校验位,所以每个字节中只有后7位起密钥作用,实际是56位 ...

  9. java变短加密解密算法_java----加密/解密常用算法

    一.常用的加密/解密算法 1.Base64 严格来说,Base64不是一种加密/解密算法,而是一种编码方式,多用于解决中文乱码中. 常用场景:对文件.URL等进行Base64编码,以字符串方式发送给对 ...

最新文章

  1. CSU OJ1960
  2. 褚时健:现在的年轻人太急了,我快90了还在摸爬滚打
  3. 什么是实验室人员比对人员_中实在线——程老师小课堂 实验室人员管理技巧...
  4. 微型计算机技术第三版第三章答案,微型计算机原理与接口技术第三章习题及答案...
  5. java daemon线程的作用_JAVA DAEMON线程的理解
  6. 巧用计算机教授小学英语,巧用微课构建小学英语课堂教学
  7. xdebug+webgrind
  8. 12.Nginx 功能
  9. spring boot全局异常捕捉
  10. RYYB图像格式学习
  11. 【转载】MATLAB入门书籍推荐
  12. linux文件复制和移动
  13. 抖音怎样做伪原创视频 抖音短视频去水印之后怎么保存
  14. 离线百度地图,添加按钮点击切换卫星地图和街道地图(纯JS)
  15. mediawiki 各种扩展整理
  16. k8s重启节点状态NotReady
  17. jenkins部署流程图_jenkins怎样实现自动部署的流程图
  18. 四十四、​Fluent 收敛标准-质量和能量守恒
  19. Java学生信息管理系统——管理员登录模块(简单易上手)
  20. SecureCRT连接开发板

热门文章

  1. 思科路由器学习初步基础--- CCNA入门
  2. win11怎么关闭自动更新系统
  3. list过滤重复数据java_java中List去除重复数据的五种方式
  4. python音乐播放器
  5. dva的使用,附带一个Demo
  6. perl 大小写转化
  7. Android下的linux指令集
  8. 数组中用id区分拆分成多个数组,把属性拆开成多个数组
  9. python初级教练员考试题目_JS | 教练,我想做习题8
  10. 【PLC编程】西门子工艺对象 – 连续控制器CONT_C的使用