Java中的DES加密与解密工具类

DES 加密与解密工具类

/**   
 * DES 加密与解密(主要用于数据库的存储与解密)
 */
public class DesUtil<BASE64Encoder> {
    
    

	private SecretKey key = null;// 密钥
	
	// 定义加密算法,可用(DES,DESede,Blowfish,AES)不同的加密方式结果会不同
	private static String algorithm = "AES";
	
	private static DesUtil desUtil = null;

	public DesUtil() {
    
    
	}

	public static DesUtil getInstance(String strKey) {
    
    
		desUtil = new DesUtil();
		desUtil.createKey(strKey);
		return desUtil;
	}

	// algorithm 算法
	public void createKey(String strKey) {
    
    
		try {
    
    
			KeyGenerator kg = KeyGenerator.getInstance(DesUtil.algorithm);
			byte[] bt = strKey.getBytes("UTF-8");
			SecureRandom sr = new SecureRandom(bt);
			kg.init(sr);
			this.setKey(kg.generateKey());
		} catch (Exception e) {
    
    
		}
	}

	// 加密方法,返回密文
	public String getEnCodeString(String dataStr) {
    
    
		byte[] miwen = null;// 密文
		byte[] mingwen = null;// 明文
		Cipher cipher;
		String result = "";// 密文字符串
		try {
    
    
			mingwen = dataStr.getBytes("UTF-8");
			cipher = Cipher.getInstance(DesUtil.algorithm);
			cipher.init(Cipher.ENCRYPT_MODE, this.getKey());
			miwen = cipher.doFinal(mingwen);
			result = Base64.encode(miwen);// 或者可以用下面的方法得到密文,结果是不一样的,都可以正常解密
			// result=byte2hex(miwen);//密文结果类似2C:37:B0:18:06:64:99:61:DE:60:58:C1:CF:9E:B2:97
		} catch (Exception e) {
    
    
			e.printStackTrace();
		}
		return result;
	}

	// 解密方法,返回明文
	public String getDecodeString(String codeStr) {
    
    
		byte[] miwen = null;
		byte[] mingwen = null;
		String resultData = "";// 返回的明文
		Cipher cipher;
		try {
    
    
			miwen = Base64.decode(codeStr);
			cipher = Cipher.getInstance(DesUtil.algorithm);
			cipher.init(Cipher.DECRYPT_MODE, this.getKey());
			mingwen = cipher.doFinal(miwen);
			resultData = new String(mingwen, "UTF-8");
		} catch (Exception e) {
    
    
			return "密钥不正确或其他原因导致异常,无法解密!";
		}
		return resultData;
	}

	// 二进制转字符串
	public String byte2hex(byte[] b) {
    
    
		String hs = "";
		String stmp = "";
		for (int n = 0; n < b.length; n++) {
    
    
			stmp = (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 SecretKey getKey() {
    
    
		return key;
	}

	public void setKey(SecretKey key) {
    
    
		this.key = key;
	}

	@Contract(pure = true)
    public static String getAlgorithm() {
    
    
		return algorithm;
	}

	public static void setAlgorithm(String algorithm) {
    
    
		DesUtil.algorithm = algorithm;
	}
	
	public static void main(String[] args) {
    
    
		// 以下是加密方法algorithm="AES"的测试
		
		System.out.println(DesUtil.getInstance("lushuaiyin").getEnCodeString("hello"));
		// 输出 LDewGAZkmWHeYFjBz56ylw==
		// 将上面的密文解密:
		System.out.println(DesUtil.getInstance("lushuaiyin").getDecodeString("LDewGAZkmWHeYFjBz56ylw=="));
		// 输出 hello
				
		// 改变密钥测试
		System.out.println(DesUtil.getInstance("suolong").getEnCodeString("hello"));
		// 输出 /RLowOJ+Fr3KdMcdJeNatg==
		System.out.println(DesUtil.getInstance("suolong").getDecodeString("/RLowOJ+Fr3KdMcdJeNatg=="));
		// 输出 hello
		// 如果使用不正确的密钥解密,将会:
		System.out.println(DesUtil.getInstance("suolong").getDecodeString("LDewGAZkmWHeYFjBz56ylw=="));
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_38192427/article/details/120587616