DESede3 加密解密算法-三层DES的加密解密算法

 

package cn.com.pubwin.police.core.util;

import java.security.Security;
import java.security.spec.AlgorithmParameterSpec;

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

import org.apache.commons.codec.binary.Hex;

public class MyDESede {

	/**
	 * @param args在java中调用sun公司提供的3DES加密解密算法时
	 *            ,需要使 用到$JAVA_HOME/jre/lib/目录下如下的4个jar包: jce.jar
	 *            security/US_export_policy.jar security/local_policy.jar
	 *            ext/sunjce_provider.jar
	 */
	public static final String SECRET = "dbat@hsty324&njwi#kns!we";  //密钥
	
	public static final byte[] SECRET_BYTE = SECRET.getBytes();
	
	public static final String IV = "12345678";  //IV

	/**
	 * DES3加密
	 * @param keybyte  为加密密钥,长度为24字节
	 * @param src	        为被加密的数据缓冲区(源)
	 * @return
	 */
	public static byte[] encryptMode(String str) {
		byte[] src = str.getBytes();
		try {
			// 加密
			Cipher c1 = Cipher.getInstance("DESede/CBC/PKCS5Padding");
			// 生成密钥
			DESedeKeySpec dks = new DESedeKeySpec(SECRET_BYTE);
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
			SecretKey deskey = keyFactory.generateSecret(dks);
			// 创建初始化向量对象
			IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
			AlgorithmParameterSpec paramSpec = iv;
			c1.init(Cipher.ENCRYPT_MODE, deskey,paramSpec);
			return c1.doFinal(src);// 在单一方面的加密或解密
		} catch (java.security.NoSuchAlgorithmException e1) {
			// TODO: handle exception
			e1.printStackTrace();
		} catch (javax.crypto.NoSuchPaddingException e2) {
			e2.printStackTrace();
		} catch (java.lang.Exception e3) {
			e3.printStackTrace();
		}
		return null;
	}


	/**
	 * DES3解密
	 * @param keybyte   为加密密钥,长度为24字节
	 * @param src       为加密后的缓冲区
	 * @return
	 */
	public static byte[] decryptMode(byte[] src) {
		try {
			// 解密
			Cipher c1 = Cipher.getInstance("DESede/CBC/PKCS5Padding");
			DESedeKeySpec dks = new DESedeKeySpec(SECRET_BYTE);
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DESede");
			SecretKey deskey = keyFactory.generateSecret(dks);

			// 创建初始化向量对象
			IvParameterSpec iv = new IvParameterSpec(IV.getBytes());
			AlgorithmParameterSpec paramSpec = iv;
			c1.init(Cipher.DECRYPT_MODE, deskey,paramSpec);
			return c1.doFinal(src);
		} catch (java.security.NoSuchAlgorithmException e1) {
			// TODO: handle exception
			e1.printStackTrace();
		} catch (javax.crypto.NoSuchPaddingException e2) {
			e2.printStackTrace();
		} catch (java.lang.Exception e3) {
			e3.printStackTrace();
		}
		return null;
	}

	/**
	  * 把字节数组转换成16进制字符串
	  * @param bArray
	  * @return
	  */
	public static final String bytesToHexString(byte[] bArray) {
	  StringBuffer sb = new StringBuffer(bArray.length);
	  String sTemp;
	  for (int i = 0; i < bArray.length; i++) {
	   sTemp = Integer.toHexString(0xFF & bArray[i]);
	   if (sTemp.length() < 2)
	    sb.append(0);
	    sb.append(sTemp.toUpperCase());
	  }
	  return sb.toString();
	}


	
	 /**
	 * 把sting转成 byte[]
     * @param hexString the hex string
     * @return byte[]
     */
    public static byte[] hexStringToBytes(String hexString) {
        if (hexString == null || hexString.equals("")) {
            return null;
        }
        hexString = hexString.toUpperCase();
        int length = hexString.length() / 2;
        char[] hexChars = hexString.toCharArray();
        byte[] d = new byte[length];
        for (int i = 0; i < length; i++) {
            int pos = i * 2;
            d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1]));
        }
        return d;
    }
    /**
     * Convert char to byte
     * @param c char
     * @return byte
     */
     public static byte charToByte(char c) {
        return (byte) "0123456789ABCDEF".indexOf(c);
    }

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		// 添加新安全算法,如果用JCE就要把它添加进去
		Security.addProvider(new com.sun.crypto.provider.SunJCE());
		// final byte[] keyBytes = {0x11, 0x22, 0x4F, 0x58,
		// (byte)0x88, 0x10, 0x40, 0x38, 0x28, 0x25, 0x79, 0x51,
		// (byte)0xCB,
		// (byte)0xDD, 0x55, 0x66, 0x77, 0x29, 0x74,
		// (byte)0x98, 0x30, 0x40, 0x36,
		// (byte)0xE2
		// }; //24字节的密钥
		String szSrc = "1";
		System.out.println("加密前的字符串:" + szSrc);
		byte[] encoded = encryptMode(szSrc);
		System.out.println("加密后的字符串:" + new String(encoded));
		System.out.println( "Hex转换:"+new String(Hex.encodeHex(encoded)));
		System.out.println("转成16进制字符串:"+bytesToHexString(encoded));
		byte[] srcBytes = decryptMode(encoded);
		System.out.println("解密后的字符串:" + (new String(srcBytes)));

		byte[] aa = hexStringToBytes("E0C17A3B3066B3C7");
		byte[] aaHEX = Hex.decodeHex("E0C17A3B3066B3C7".toCharArray());		
		//String mw = "521E3B9EDEA40813A204CE7F461BEB752FBA94864CB1764B";
		
		System.out.println("16进制转换后密文解密:"+new String(decryptMode(aa)));
		System.out.println("HEX转换后密文解密:"+new String(decryptMode(aaHEX)));
		
	}
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值