java 加密算法的工具类(SHA,AES,DES,CRC,MD5)

SHA工具类:

package com.haha.demo.util;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class ShaUtil {
	/**
	 * SHA-256加密方法,根据输入字符串,进行SHA-256方式加密,返回加密后的字符串
	 * @param src:要加密的原始字符串
	 * @return 输入字符串有效(不为null),则返回SHA-256加密后的字符串;否则返回null
	 */
	public static String sha256(String src){
		if(src == null){
			return null;
		}
		MessageDigest sha256;
		try {
			sha256 = MessageDigest.getInstance("SHA-256");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
		byte[] inStrArray = src.getBytes(StandardCharsets.UTF_8);
		byte[] sha256Bytes = sha256.digest(inStrArray);
		StringBuilder hexValue = new StringBuilder();
		int val;
		for (byte sha256Byte : sha256Bytes) {
			val = ((int) sha256Byte) & 0xff;
			if (val < 16) {
				hexValue.append("0");
			}
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();
	}

	/**
	 * HmacSHA256加密方法
	 * @param key:加密共享密匙
	 * @param src:要加密的字符串
	 * @return:成功返回加密后的字符串,否则返回null
	 */
	public static String hmacSha256(String key,String src){
		if(key == null || src == null){
			return null;
		}
		SecretKeySpec signKey = new SecretKeySpec(key.getBytes(StandardCharsets.UTF_8), "HmacSHA256");
		Mac mac;
		try {
			mac = Mac.getInstance("HmacSHA256");
			mac.init(signKey);
			byte[] hmacSha256Bytes = mac.doFinal(src.getBytes(StandardCharsets.UTF_8));
			StringBuilder hexValue = new StringBuilder();
			int val;
			for (byte hmacSha256Byte : hmacSha256Bytes) {
				val = ((int) hmacSha256Byte) & 0xff;
				if (val < 16) {
					hexValue.append("0");
				}
				hexValue.append(Integer.toHexString(val));
			}
			return hexValue.toString();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[]args){
		System.out.println(sha256("测试"));
		System.out.println(hmacSha256("jiamimirao","测试"));
	}
}

AES工具类:

package com.haha.demo.util;

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

/**
 * AES加密,解密
 * @author ljh
 *
 */
public class AesUtil {

	public static void main(String[] args){
		try {
			String encryptStr = encrypt("111", "A1B845F45BC6EF59" , "1234567890123456");
			System.out.println(encryptStr);
			String decrypt = decrypt(encryptStr, "A1B845F45BC6EF59" , "1234567890123456");
			System.out.println(decrypt);

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 加密
	 * @param content 待加密内容
	 * @param key     密钥,16位16进制
	 * @param iv      偏移量 ,16位16进制
	 * @return string
	 */
	public static String encrypt(String content, String key, String iv) {
		try {
			SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");    //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES
			IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.ENCRYPT_MODE, keySpec,ivSpec);
			byte[] byteResult = cipher.doFinal(content.getBytes());
			return parseByte2HexStr(byteResult);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 解密
	 * @param encryptStr 待加密内容
	 * @param key     密钥,16位16进制
	 * @param iv      偏移量 ,16位16进制
	 * @return string
	 */
	public static String decrypt(String encryptStr, String key , String iv) {
		try {
			SecretKeySpec  keySpec = new SecretKeySpec(key.getBytes(), "AES");    //两个参数,第一个为私钥字节数组, 第二个为加密方式 AES或者DES
			IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());
			Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
			cipher.init(Cipher.DECRYPT_MODE, keySpec,ivSpec);
			byte[] result = cipher.doFinal(parseHexStr2Byte(encryptStr));
			return new String(result).trim();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}


	/**
	 * 将二进制转成16进制
	 * @param buf
	 * @return String
	 */
	public static String parseByte2HexStr(byte buf[]) {
		StringBuilder sb = new StringBuilder();
		for (byte aBuf : buf) {
			String hex = Integer.toHexString(aBuf & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			sb.append(hex.toUpperCase());
		}
		return sb.toString();
	}

	/**
	 * 将16进制转成2进制
	 * @param hexStr
	 * @return
	 */
	public static byte[] parseHexStr2Byte(String hexStr) {
		if (hexStr.length() < 1)
			return null;
		byte[] result = new byte[hexStr.length()/2];
		for (int i = 0;i< hexStr.length()/2; i++) {
			int high = Integer.parseInt(hexStr.substring(i*2, i*2+1), 16);
			int low = Integer.parseInt(hexStr.substring(i*2+1, i*2+2), 16);
			result[i] = (byte) (high * 16 + low);
		}
		return result;
	}
}

DES工具类:

package com.haha.demo.util;

import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;


public class DesUtil {
	public static void main(String[]args){
		System.out.println(encrypt("测试加密123", "adbcd123"));
		String neirong = encrypt("测试加密123", "adbcd123");
		System.out.println(decrypt(neirong,"adbcd123"));
	}

	/**
	 * 加密
	 * @param data  待加密的内容
	 * @param sKey  密钥
	 * @return
	 */
	public static String encrypt(String data, String sKey) {
		try {
			byte[] key = sKey.getBytes();
			// 初始化向量
			IvParameterSpec iv = new IvParameterSpec(key);
			DESKeySpec desKey = new DESKeySpec(key);
			// 创建一个密匙工厂,然后用它把DESKeySpec转换成securekey
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			SecretKey securekey = keyFactory.generateSecret(desKey);
			// Cipher对象实际完成加密操作
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);
			// 现在,获取数据并加密
			// 正式执行加密操作
			byte[] byteResult =  cipher.doFinal(data.getBytes());
			return parseByte2HexStr(byteResult);
		} catch (Throwable e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 解密
	 * @param src  待加密的内容
	 * @param sKey  秘钥
	 * @return
	 */
	public static String decrypt(String src, String sKey) {
		try {
			byte[] key = sKey.getBytes();
			// 初始化向量
			IvParameterSpec iv = new IvParameterSpec(key);
			// 创建一个DESKeySpec对象
			DESKeySpec desKey = new DESKeySpec(key);
			// 创建一个密匙工厂
			SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
			// 将DESKeySpec对象转换成SecretKey对象
			SecretKey securekey = keyFactory.generateSecret(desKey);
			// Cipher对象实际完成解密操作
			Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
			// 用密匙初始化Cipher对象
			cipher.init(Cipher.DECRYPT_MODE, securekey, iv);
			// 真正开始解密操作
			byte[] result = cipher.doFinal(parseHexStr2Byte(src));
			return new String(result).trim();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	/**
	 * 将二进制转换成16进制
	 *
	 * @param buf
	 * @return
	 */
	public static String parseByte2HexStr(byte buf[]) {
		StringBuilder sb = new StringBuilder();
		for (byte aBuf : buf) {
			String hex = Integer.toHexString(aBuf & 0xFF);
			if (hex.length() == 1) {
				hex = '0' + hex;
			}
			sb.append(hex.toUpperCase());
		}
		return sb.toString();
	}

	/**
	 * 将16进制转换为二进制
	 *
	 * @param hexStr
	 * @return
	 */
	public static byte[] parseHexStr2Byte(String hexStr) {
		if (hexStr.length() < 1) return null;
		byte[] result = new byte[hexStr.length() / 2];
		for (int i = 0; i < hexStr.length() / 2; i++) {
			int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
			int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
			result[i] = (byte) (high * 16 + low);
		}
		return result;
	}
}

MD5工具类:

package com.haha.demo.util;

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5Util {

	/**
	 * MD5加密方法,根据输入字符串,进行md5加密后,输出加密后的字符串
	 * @param src:要加密的原始字符串
	 * @return:输入字符串有效(不为null),则返回MD5加密后的字符串;否则返回null
	 */
	public static String md5(String src){
		if(src == null){
			return null;
		}
		MessageDigest md5;
		try {
			md5 = MessageDigest.getInstance("MD5");
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
			return null;
		}
		byte[] inStrArray = src.getBytes(StandardCharsets.UTF_8);
		byte[] md5Bytes = md5.digest(inStrArray);
		StringBuilder hexValue = new StringBuilder();
		int val;
		for (byte md5Byte : md5Bytes) {
			val = ((int) md5Byte) & 0xff;
			if (val < 16) {
				hexValue.append("0");
			}
			hexValue.append(Integer.toHexString(val));
		}
		return hexValue.toString();
	}

	public static void main(String[]args){
		System.out.println(md5("测试123"));
		System.out.println(md5("abc123"));

	}

}

CRC工具类:

package com.haha.demo.util;

import java.util.zip.CRC32;

public class CRC32Util {
	public static void main(String[]args){
		System.out.println(getCrc32("测试123"));
		System.out.println(getCrc32("ab123"));
	}


	public static String getCrc32(String content){
		CRC32 crc32 = new CRC32();
		crc32.update(content.getBytes());
		Long value = crc32.getValue();
		return Long.toHexString(value);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值