至于 3DES 为什么会出现呢?其实,这个不难想到。由于 DES 是一种非常简便的加密算法,但是密钥长度比较短,计算量比较小,相对来说,比较容易被破解。因此,在 DES 的基础上,使用三重数据加密算法,对数据进行加密,这样来说,破解的概率就小了很多。

1、3DES的概念

      1.1 3DES 

            将密钥长度增至112位或168位,通过增加迭代次数提高安全性。

3DES,也就是“Triple DES”,中文名“三重数据加密算法”,它相当于是对每个数据块应用三次 DES 加密算法。由于计算机运算能力的增强,原版 DES 密码的密钥长度变得容易被暴力破解;3DES 即是设计用来提供一种相对简单的方法,即通过增加 DES 的密钥长度来避免类似的攻击,而不是设计一种全新的块密码算法

      1.2 缺点

           处理速度较慢、密钥计算时间较长、加密效率不高。

      1.3 3DES的实现原理   



          使用 3 条 56 位的密钥对数据进行三次加密。3DES(即 Triple DES)是 DES 向 AES 过渡的加密算法(1999年,NIST 将 3-DES 指定为过渡的加密标准)。


         其具体实现如下:设 Ek() 和 Dk() 代表 DES 算法的加密和解密过程,K 代表 DES 算法使用的密钥,P 代表明文,C 代表密文,这样:


            3DES 加密过程为: C = Ek3 ( Dk2 ( Ek1 ( P ) ) )


            3DES 解密过程为: P = Dk1 ( EK2 ( Dk3 ( C ) ) )


      1.4 JDK实现

           

3DES 秘钥 分发 3des密钥长度_3DES 秘钥 分发

2、3DES的编码步骤

     2.1  生成密钥

         

3DES 秘钥 分发 3des密钥长度_ide_02

     2.1  加/解密

       

3DES 秘钥 分发 3des密钥长度_ide_03

3、3DES算法的实现

TripleDESUtil.java


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

public class TripleDESUtil {

	/**
	 * 生成密钥
	 * 
	 * @return
	 */
	public static byte[] initKey() {
		try {
			// 秘钥生成器
			KeyGenerator keyGen = KeyGenerator.getInstance("DESede");
			// 初始化秘钥生成器
			keyGen.init(168); // 112 168
			// 生成密钥
			SecretKey secretKey = keyGen.generateKey();
			return secretKey.getEncoded();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * 使用DES算法,对数据进行加密
	 * 
	 * @param data
	 *            要加密的数据
	 * @param key
	 *            加密数据的秘钥
	 * @return
	 */
	public static byte[] encrypt(byte[] data, byte[] key) {
		try {
			// 恢复密钥
			SecretKey secretKey = new SecretKeySpec(key, "DESede");
			// cipher完成加密或者解密
			Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
			// 根基密钥,对Cipher进行初始化ENCRYPT_MODE(加密),DECRYPT_MODE(解密)
			cipher.init(Cipher.ENCRYPT_MODE, secretKey);
			// 解密/加密
			byte[] cipherBytes = cipher.doFinal(data);
			return cipherBytes;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}

	/**
	 * 使用DES数据解密
	 * 
	 * @param data
	 *            要解密的数据
	 * @param key
	 *            解密数据用到的秘钥
	 * @return
	 */
	public static byte[] decrypt(byte[] data, byte[] key) {
		try {
			// 恢复密钥
			SecretKey secretKey = new SecretKeySpec(key, "DESede");
			// cipher完成加密或者解密
			Cipher cipher = Cipher.getInstance("DESede/ECB/PKCS5Padding");
			// 根基密钥,对Cipher进行初始化ENCRYPT_MODE(加密),DECRYPT_MODE(解密)
			cipher.init(Cipher.DECRYPT_MODE, secretKey);
			// 解密/加密
			byte[] plainBytes = cipher.doFinal(data);
			return plainBytes;
		} catch (Exception e) {
			throw new RuntimeException(e);
		}

	}
}

字节数组换位

public class BytesToHex {

	public static String fromBytesToHex(byte[] resultBytes) {
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < resultBytes.length; i++) {
			if (Integer.toHexString(0xFF & resultBytes[i]).length() == 1) {
				builder.append("0").append(
						Integer.toHexString(0xFF & resultBytes[i]));
			} else {
				builder.append(Integer.toHexString(0xFF & resultBytes[i]));
			}
		}
		return builder.toString();
	}

}

测试代码

public class Test {
	// 待加密的明文
	public static final String DATA = "test";

	public static void main(String[] args) {
		long start = System.currentTimeMillis();
		/* Test 3DES */
		byte[] tridesKey = TripleDESUtil.initKey();
		System.out
				.println("3DES KEY : " + BytesToHex.fromBytesToHex(tridesKey));
		byte[] tridesResult = TripleDESUtil.encrypt(DATA.getBytes(), tridesKey);
		System.out.println(DATA + ">>>3DES 加密>>>"
				+ BytesToHex.fromBytesToHex(tridesResult));

		byte[] tridesPlain = TripleDESUtil.decrypt(tridesResult, tridesKey);
		System.out.println(DATA + ">>>3DES 解密>>>" + new String(tridesPlain));
		System.out.println(System.currentTimeMillis() - start);
	}
}