`
xiangxm
  • 浏览: 65257 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • xiangxm: xurichusheng 写道一些涉及到密码保存的就需要加密/ ...
    3DES加密
  • xurichusheng: 一些涉及到密码保存的就需要加密/解密了。不需要解密的密码,如登 ...
    3DES加密

3DES加密

    博客分类:
  • Java
阅读更多
package com.xiangxm.javatest.evangesoftdemo;

import java.security.Security;

import javax.crypto.Cipher;

import javax.crypto.SecretKey;

import javax.crypto.spec.SecretKeySpec;

/*字符串 DESede(3DES) 加密解密*/

public class ThreeDes {

	/**
	 * 
	 * @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
	 * 
	 */

	private static final String Algorithm = "DESede"; // 定义加密算法,可用

	// DES,DESede,Blowfish

	// keybyte为加密密钥,长度为24字节

	// src为被加密的数据缓冲区(源)

	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) {

			// TODO: handle exception

			e1.printStackTrace();

		} catch (javax.crypto.NoSuchPaddingException e2) {

			e2.printStackTrace();

		} catch (java.lang.Exception e3) {

			e3.printStackTrace();

		}

		return null;

	}

	// keybyte为加密密钥,长度为24字节

	// src为加密后的缓冲区

	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) {

			// TODO: handle exception

			e1.printStackTrace();

		} catch (javax.crypto.NoSuchPaddingException e2) {

			e2.printStackTrace();

		} catch (java.lang.Exception e3) {

			e3.printStackTrace();

		}

		return null;

	}

	public static void main(String[] args) {

		// 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 = "大公司的分公司的分公司的风格中华人民共和国感谢法";

		System.out.println("加密前的字符串:" + szSrc);

		byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());

		System.out.println("加密后的字符串:" + new String(encoded));

		byte[] srcBytes = decryptMode(keyBytes, encoded);

		System.out.println("解密后的字符串:" + (new String(srcBytes)));

	}

}



----------------------------下面来自Oschina---------------------------------
package com.xiangxm.javatest.evangesoftdemo;

import java.io.ByteArrayOutputStream;
import java.security.*;
import javax.crypto.*;
import javax.crypto.spec.SecretKeySpec;

/*
 *<p>
 *</p>
 *@author xiangxm
 *version  1.0
 *2013-3-23
 *
 *
 */

/**
 *字符串 DESede(3DES) 加密
 */
public class Test3DES {
	private static final String Algorithm = "DESede"; // 定义 加密算法,可用
	// DES,DESede,Blowfish
	private static final String hexString = "0123456789ABCDEF";

	/**
	 * 
	 * @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
	 *            密钥
	 * @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;
	}

	/**
	 * 字符串转为16进制
	 * 
	 * @param str
	 * @return
	 */
	public static String encode(String str) {
		// 根据默认编码获取字节数组
		byte[] bytes = str.getBytes();
		StringBuilder sb = new StringBuilder(bytes.length * 2);

		// 将字节数组中每个字节拆解成2位16进制整数
		for (int i = 0; i < bytes.length; i++) {
			sb.append(hexString.charAt((bytes[i] & 0xf0) >> 4));
			sb.append(hexString.charAt((bytes[i] & 0x0f) >> 0));
		}
		return sb.toString();
	}

	/**
	 * 
	 * @param bytes
	 * @return 将16进制数字解码成字符串,适用于所有字符(包括中文)
	 */
	public static String decode(String bytes) {
		ByteArrayOutputStream baos = new ByteArrayOutputStream(
				bytes.length() / 2);
		// 将每2位16进制整数组装成一个字节
		for (int i = 0; i < bytes.length(); i += 2)
			baos.write((hexString.indexOf(bytes.charAt(i)) << 4 | hexString
					.indexOf(bytes.charAt(i + 1))));
		return new String(baos.toByteArray());
	}

	// 转换成十六进制字符串
	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();
	}

	public static void main(String[] args) {
		// 添加新安全算法,如果用JCE就要把它添加进去
		// 这里addProvider方法是增加一个新的加密算法提供者(个人理解没有找到好的答案,求补充)
		Security.addProvider(new com.sun.crypto.provider.SunJCE());
		// byte数组(用来生成密钥的)
		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 };
		String szSrc = "This is a 3DES test. 测试";
		System.out.println("加密前的字符串:" + szSrc);

		byte[] encoded = encryptMode(keyBytes, szSrc.getBytes());
		System.out.println("加密后的字符串:" + new String(encoded));

		byte[] srcBytes = decryptMode(keyBytes, encoded);
		System.out.println("解密后的字符串:" + new String(srcBytes));
		// ------------------------------------------------------------
		String byt = "字符串转换为16进制";
		byt = encode(byt);
		System.out.println(byt);
		byt = decode(byt);
		System.out.println(byt);

	}
}
分享到:
评论
2 楼 xiangxm 2013-04-10  
xurichusheng 写道
一些涉及到密码保存的就需要加密/解密了。
不需要解密的密码,如登录密码,使用 md5 加密;
需要解密的密码,就可以使用这样的方式加密/解密 了。

  多谢海哥指点
1 楼 xurichusheng 2013-04-10  
一些涉及到密码保存的就需要加密/解密了。
不需要解密的密码,如登录密码,使用 md5 加密;
需要解密的密码,就可以使用这样的方式加密/解密 了。

相关推荐

Global site tag (gtag.js) - Google Analytics