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

以上就是java 实现DES 加密解密的示例代码的详细内容,更多关于java des加密解密的资料请关注我们其它相关文章!

(0)

相关推荐

  • java中DES加密解密

    废话不多说,直接奉上代码: 复制代码 代码如下: package com.eabax.plugin.yundada.utils; import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.Invalid

  • PHP、Java des加密解密实例

    des加密是对称加密中在互联网应用的比较多的一种加密方式,php 通过mcrypt扩展库来支持des加密,要在Php中使用des加密,需要先安装mcrypt扩展库 下面是加密解密的实例 复制代码 代码如下: $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);  $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);  $key = "This is a very secre

  • 兼容PHP和Java的des加密解密代码分享

    php代码: <?php class DES { var $key; var $iv; //偏移量 function DES($key, $iv=0) { $this->key = $key; if($iv == 0) { $this->iv = $key; } else { $this->iv = $iv; } } //加密 function encrypt($str) { $size = mcrypt_get_block_size ( MCRYPT_DES, MCRYPT_MO

  • Java实现的3des加密解密工具类示例

    本文实例讲述了Java实现的3des加密解密工具类.分享给大家供大家参考,具体如下: package com.gcloud.common; import org.apache.poi.poifs.property.Child; import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.*; import javax.crypto.spec.IvParameterSpec; import javax

  • java常用工具类之DES和Base64加密解密类

    一.DES加密和解密 package com.itjh.javaUtil; import java.io.UnsupportedEncodingException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; import java.security.spec.InvalidKeySpecExc

  • java使用des加密解密示例分享

    复制代码 代码如下: import java.security.Key;import java.security.SecureRandom;import java.security.spec.AlgorithmParameterSpec; import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import javax.crypto.spec.IvPar

  • Java使用Hutool实现AES、DES加密解密的方法

    在Java世界中,AES.DES加密解密需要使用Cipher对象构建加密解密系统,Hutool中对这一对象做再包装,简化了加密解密过程. 介绍 AES和DES同属对称加密算法,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去.收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文.在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加

  • Java实现的DES加密解密工具类实例

    本文实例讲述了Java实现的DES加密解密工具类.分享给大家供大家参考,具体如下: 一个工具类,很常用,不做深入研究了,那来可直接用 DesUtil.java package lsy; import java.security.Key; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; imp

  • 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> *

  • asp.net实现的DES加密解密操作示例

    本文实例讲述了asp.net实现的DES加密解密操作.分享给大家供大家参考,具体如下: //加密方法 private string encrypt(string strToEncrypt) { if (strToEncrypt == null || strToEncrypt == "") return strToEncrypt; DESCryptoServiceProvider des = new DESCryptoServiceProvider(); //把字符串放到byte数组中,

  • [J2SE]Java中3DES加密解密调用示例

    jce.jar security/US_export_policy.jar security/local_policy.jar ext/sunjce_provider.jar Java运行时会自动加载这些包,因此对于带main函数的应用程序不需要设置到CLASSPATH环境变量中.对于WEB应用,不需要把这些包加到WEB-INF/lib目录下. 以下是java中调用sun公司提供的3DES加密解密算法的样本代码: 复制代码 代码如下: /*字符串 DESede(3DES) 加密*/ import

  • Python和Java进行DES加密和解密的实例

    DES 为 Data Encryption Standard (数据加密标准)的缩写,是一种常见的对称加密算法.有关对称加密与非对称加密的特点及其应用场景,本文就不描述了,读者可以自行 google .本文说明如何使用 Java 和 Python 两种语言来实现 DES 的加解密. 最近碰到的应用场景是这样的.我们需要对接一个系统 S,系统 S 已经对用户的身份进行了验证,新系统 N 也需要对用户的身份进行验证.采用的身份验证方法是由旧系统 S 对用户 ID 进行加密,然后新系统 N 对加密后的

  • Java实现的RSA加密解密算法示例

    本文实例讲述了Java实现的RSA加密解密算法.分享给大家供大家参考,具体如下: import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.

  • Java实现DES加密与解密,md5加密以及Java实现MD5加密解密类

    很多时候要对秘要进行持久化加密,此时的加密采用md5.采用对称加密的时候就采用DES方法了 import java.io.IOException; import java.security.MessageDigest; import java.security.SecureRandom; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import j

随机推荐