【Android开发经验】比DES加密更安全的算法——3DES加密算法

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992

    在前面的文章里面,我们讨论了DES算法,同时也明白了如何才能保证不同平台下的加密和解密结果的一致性。但是DES作为出现了很长时间的一种加密算法,随着计算机运算能力的加强,DES加密容易被暴力破解,其安全性变得有点低。于是,为了增强数据的安全性,3DES算法就应运而生了。

    3DES,顾名思义,就是对DES加密算法的改进,3DES通过对每个数据进行3次DES加密,从而降低被破解的可能性。

     如果我们要使用3DES加密,需要以下几个步骤

    ①传入共同约定的密钥(keyBytes)以及算法(Algorithm),来构建SecretKey密钥对象

        SecretKey deskey = new SecretKeySpec(keyBytes, Algorithm);    

    ②根据算法实例化Cipher对象。它负责加密/解密

        Cipher c1 = Cipher.getInstance(Algorithm);    

    ③传入加密/解密模式以及SecretKey密钥对象,实例化Cipher对象

        c1.init(Cipher.ENCRYPT_MODE, deskey);    

    ④传入字节数组,调用Cipher.doFinal()方法,实现加密/解密,并返回一个byte字节数组

        c1.doFinal(src);

   

    具体的代码实现过程如下

package com.qust;

import java.io.UnsupportedEncodingException;

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

/**
 * 
 * @ClassName: com.qust.SecretUtils
 * @Description: 3DES加密解密工具类
 * @author zhaokaiqiang
 * @date 2014-11-13 下午11:28:14
 * 
 */
public class DES3Utils {

	// 定义加密算法,DESede即3DES
	private static final String Algorithm = "DESede";
	// 加密密钥
	private static final String PASSWORD_CRYPT_KEY = "zhaokaiqiang1992";

	/**
	 * 加密方法
	 * 
	 * @param src
	 *            源数据的字节数组
	 * @return
	 */
	public static byte[] encryptMode(byte[] src) {
		try {
			// 生成密钥
			SecretKey deskey = new SecretKeySpec(
					build3DesKey(PASSWORD_CRYPT_KEY), Algorithm);
			// 实例化Cipher
			Cipher cipher = Cipher.getInstance(Algorithm);
			cipher.init(Cipher.ENCRYPT_MODE, deskey);
			return cipher.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 src
	 *            密文的字节数组
	 * @return
	 */
	public static byte[] decryptMode(byte[] src) {
		try {
			SecretKey deskey = new SecretKeySpec(
					build3DesKey(PASSWORD_CRYPT_KEY), 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;
	}

	/**
	 * 根据字符串生成密钥24位的字节数组
	 * 
	 * @param keyStr
	 * @return
	 * @throws UnsupportedEncodingException
	 */
	public static byte[] build3DesKey(String keyStr)
			throws UnsupportedEncodingException {
		byte[] key = new byte[24];
		byte[] temp = keyStr.getBytes("UTF-8");

		if (key.length > temp.length) {
			System.arraycopy(temp, 0, key, 0, temp.length);
		} else {
			System.arraycopy(temp, 0, key, 0, key.length);
		}
		return key;
	}
}

    测试类的代码如下

package com.qust;

public class Main {

	public static void main(String[] args) {
		String msg = "使用3DES对数据进行加密";
		System.out.println("【加密前】:" + msg);

		// 加密
		byte[] secretArr = DES3Utils.encryptMode(msg.getBytes());
		System.out.println("【加密后】:" + new String(secretArr));

		// 解密
		byte[] myMsgArr = DES3Utils.decryptMode(secretArr);
		System.out.println("【解密后】:" + new String(myMsgArr));
	}
}


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。