DES加密

DES加密封装

public class Crypt {

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

	static boolean debug = false;

	static {
		Security.addProvider(new com.sun.crypto.provider.SunJCE());
	}

	// 生成密钥, 注意此步骤时间比较长
	public static byte[] getKey() throws Exception {
		KeyGenerator keygen = KeyGenerator.getInstance(Algorithm);
		SecretKey deskey = keygen.generateKey();
		if (debug)
			System.out.println("生成密钥:" + byte2hex(deskey.getEncoded()));
		return deskey.getEncoded();
	}

	public static void getKey(String strKey) {
		try {
			KeyGenerator _generator = KeyGenerator.getInstance("DES");
			_generator.init(new SecureRandom(strKey.getBytes()));
			SecretKey deskey = _generator.generateKey();
			System.out.println("生成密钥:" + byte2hex(deskey.getEncoded()));
			_generator = null;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 加密
	public static String encode(String input, String key) throws Exception {
		return byte2hex(encode(input.getBytes(), key.getBytes()));
	}

	// 加密
	public static byte[] encode(byte[] input, byte[] key) throws Exception {
		// SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key, Algorithm);
		SecureRandom sr = new SecureRandom();
		DESKeySpec dks = new DESKeySpec(key);
		SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
		SecretKey deskey = keyFactory.generateSecret(dks);
		if (debug) {
			System.out.println("加密前的二进串:" + byte2hex(input));
			System.out.println("加密前的字符串:" + new String(input));
		}
		Cipher c1 = Cipher.getInstance(Algorithm);
		c1.init(Cipher.ENCRYPT_MODE, deskey, sr);
		byte[] cipherByte = c1.doFinal(input);
		if (debug)
			System.out.println("加密后的二进串:" + byte2hex(cipherByte));
		return cipherByte;
	}

	// 解密
	public static String decode(String input, String key) throws Exception {
		return new String(decode(hex2byte(input), key.getBytes()));
	}

	// 解密
	public static byte[] decode(byte[] input, byte[] key) throws Exception {
		SecretKey deskey = new javax.crypto.spec.SecretKeySpec(key, Algorithm);
		if (debug)
			System.out.println("解密前的信息:" + byte2hex(input));
		Cipher c1 = Cipher.getInstance(Algorithm);
		c1.init(Cipher.DECRYPT_MODE, deskey);
		byte[] clearByte = c1.doFinal(input);
		if (debug) {
			System.out.println("解密后的二进串:" + byte2hex(clearByte));
			System.out.println("解密后的字符串:" + (new String(clearByte)));
		}
		return clearByte;
	}

	// md5()信息摘要, 不可逆
	public static byte[] md5(byte[] input) throws Exception {
		java.security.MessageDigest alg = java.security.MessageDigest.getInstance("MD5"); // or "SHA-1"
		if (debug) {
			System.out.println("摘要前的二进串:" + byte2hex(input));
			System.out.println("摘要前的字符串:" + new String(input));
		}
		alg.update(input);
		byte[] digest = alg.digest();
		if (debug)
			System.out.println("摘要后的二进串:" + byte2hex(digest));
		return digest;
	}

	// 字节码转换成16进制字符串
	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 + ":";
		}
		// System.out.println("hs="+hs);
		return hs.toUpperCase();
	}

	// 将16进制字符串转换成字节码
	public static byte[] hex2byte(String hex) {
		byte[] bts = new byte[hex.length() / 2];
		for (int i = 0; i < bts.length; i++) {
			bts[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
		}
		return bts;
	}

	public static void main(String[] args) throws Exception {
		debug = true;
		getKey("simonesi");
		// byte[] key = getKey();
		byte[] key = "好好学习".getBytes();
		System.out.println(key.length);
		SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
		String time = format.format(new Date());
		// decode(encode("<uid>testsz</uid><pwd>testsz</pwd><time>" + time + "</time>", "SHZHXWDM"), "SHZHXWDM");
		decode(encode("<uid>zyhomepage</uid><pwd>zyhomepage</pwd>aabb", "JTKXYLIB"), "JTKXYLIB");
		// decode("AF940EE6985915ECFE43D931C6CF4FA6DFF923DEB1025217EDE9BF738286BA77BDC0CDF6A6B8D2EC6763D11C5F0B798D",
		// "JTKXYLIB");
		// decode(
		// "F19197667ABED47DA964C67D6B72B96BC15773FC91A2A105DD25378F79A5BCB22662C0F345807EBDD0DF21742CE72BE3DFD925B713D1C64557DCA2FA87400AD2",
		// "TESTKEY2");
		// md5("测试加密".getBytes());
		// md5("A".getBytes());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值