`

简单的例子3des对称加密的代码

    博客分类:
  • JAVA
阅读更多

一个简单的3des对称加密对象

 

 package com.bruce.geekway.utils;

import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.Base64;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;


public class EncryptUtils {

	private static final String Algorithm = "DESede"; // 定义加密算法,可用,DES,DESede,Blowfish
	
	private static final String KEY = "jk#la$sf%jl9(ksd)gh-sd+sad=HyUWz";

	/**
	 * 3des解码
	 * 
	 * @param value
	 *            待解密字符串
	 * @param key
	 *            原始密钥字符串
	 * @return
	 * @throws Exception
	 */
	public static String Decrypt3DES(String value, String key) throws Exception {
		byte[] b = decryptMode(GetKeyBytes(key), Base64.getDecoder().decode(value));
		return new String(b);
	}
	
	
	/**
	 * 3des解码
	 * 
	 * @param value
	 *            待解密字符串
	 * @param key
	 *            原始密钥字符串
	 * @return
	 * @throws Exception
	 */
	public static String Decrypt3DES(String value) throws Exception {
 		byte[] b = decryptMode(GetKeyBytes(KEY), Base64.getDecoder().decode(value));
		return new String(b);
	}
	

	/**
	 * 3des加密
	 * 
	 * @param value
	 *            待加密字符串
	 * @param key
	 *            原始密钥字符串
	 * @return
	 * @throws Exception
	 */
	public static String Encrypt3DES(String value, String key) throws Exception {
		return byte2Base64(encryptMode(GetKeyBytes(key), value.getBytes()));
	}
	
	
	/**
	 * 3des加密
	 * 
	 * @param value
	 *            待加密字符串
	 * @param key
	 *            原始密钥字符串
	 * @return
	 * @throws Exception
	 */
	public static String Encrypt3DES(String value) throws Exception {
 		return byte2Base64(encryptMode(GetKeyBytes(KEY), value.getBytes()));
	}
	

	/**
	 * 计算24位长的密码byte值,首先对原始密钥做MD5算hash值,再用前8位数据对应补全后8位
	 * 
	 * @param strKey
	 *            密钥
	 * @return
	 * @throws Exception
	 */
	public static byte[] GetKeyBytes(String strKey) throws Exception {
		if (null == strKey || strKey.length() < 1)
			throw new Exception("key is null or empty!");
		MessageDigest alg = MessageDigest.getInstance("MD5");
		alg.update(strKey.getBytes());
		byte[] bkey = alg.digest();
		int start = bkey.length;
		byte[] bkey24 = new byte[24];
		for (int i = 0; i < start; i++) {
			bkey24[i] = bkey[i];
		}
		for (int i = start; i < 24; i++) {// 为了与.net16位key兼容
			bkey24[i] = bkey[i - start];
		}
		return bkey24;
	}

	/**
	 * 加密
	 * 
	 * @param keybyte为加密密钥
	 *            ,长度为24字节
	 * @param src
	 *            为被加密的数据缓冲区(源)
	 * @return
	 */
	public static byte[] encryptMode(byte[] keybyte, byte[] src) {
		try {
			// 生成密钥
			SecretKey deskey = new SecretKeySpec(keybyte, Algorithm); // 加密
			Cipher c1 = Cipher.getInstance(Algorithm);
			c1.init(Cipher.ENCRYPT_MODE, deskey);
			return c1.doFinal(src);
		} catch (java.security.NoSuchAlgorithmException e1) {
			e1.printStackTrace();
		} catch (javax.crypto.NoSuchPaddingException e2) {
			e2.printStackTrace();
		} catch (java.lang.Exception e3) {
			e3.printStackTrace();
		}
		return null;
	}

	/**
	 * 解密
	 * 
	 * @param keybyte
	 *            解密密钥,长度为24字节
	 * @param src
	 *            解密后的缓冲区
	 * @return
	 */
	public static byte[] decryptMode(byte[] keybyte, byte[] src) {
		try {
			// 生成密钥
			SecretKey deskey = new SecretKeySpec(keybyte, Algorithm);
			// 解密
			Cipher c1 = Cipher.getInstance(Algorithm);
			c1.init(Cipher.DECRYPT_MODE, deskey);
			return c1.doFinal(src);
		} catch (java.security.NoSuchAlgorithmException e1) {
			e1.printStackTrace();
		} catch (javax.crypto.NoSuchPaddingException e2) {
			e2.printStackTrace();
		} catch (java.lang.Exception e3) {
			e3.printStackTrace();
		}
		return null;
	}

	/**
	 * 转换成base64编码
	 */
	public static String byte2Base64(byte[] b) {
		return Base64.getEncoder().encodeToString(b);
	}

	/**
	 * 转换成十六进制字符串
	 */
	public static String byte2hex(byte[] b) {
		String hs = "";
		String stmp = "";
		for (int n = 0; n < b.length; n++) {
			stmp = (java.lang.Integer.toHexString(b[n] & 0XFF));
			if (stmp.length() == 1)
				hs = hs + "0" + stmp;
			else
				hs = hs + stmp;
			if (n < b.length - 1)
				hs = hs + ":";
		}
		return hs.toUpperCase();
	}

	/**
	 * 3DEC 加密解密测试
	 */
	public static void main(String[] args) throws Exception {
		
		System.out.println(" key = " + KEY);
		
		String password = "tester-99888777-60";
		
		String enStr =  EncryptUtils.Encrypt3DES(password);
		System.out.println("调用原始密钥算加密结果:" + enStr);

		System.out.println("调用原始密钥算解密结果:" + EncryptUtils.Decrypt3DES(enStr));
		
		System.out.println("在URL中需要做下编码" + URLEncoder.encode(enStr, "utf-8"));
	}

}

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics