AES+RSA组合加解密工具类

JAVA AES+RSA组合加解密

  • AES+RSA组合使用当初是为了解决前后端分离和公司内部APP与服务器的通信安全问题,传统的接口请求因为没有加密,在公网上面传输不安全,所以就看了很多解决方案,最后采用了AES对原文加密,RSA对AES的iv值进行加密,这样既解决了AES的key在公网传输不安全(这个因为在js里面,所以实际是可以获取到的)和RSA加密缓慢的问题
import java.security.NoSuchAlgorithmException;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.util.HashMap;
import java.util.Map;
import javax.crypto.Cipher;

/**
 * AES+RSA组合加解密工具类
 * @author marke.huang
 * @version 0.1.0
 */
public class AesRsaUtils {
	
	/**
	 * AES加密,RSA私钥对AES的iv进行加密
	 * @param sourceData
	 * 			原文
	 * @param aesKey
	 * 			AES加密算法KEY
	 * @param iv
	 * 			AES加密算法的初始向量
	 * @param rsaPrivateKey
	 * 			RSA加密算法的私钥
	 * @return
	 */
	public static Map<String, String> privateEncryptData(String sourceData, String aesKey, String iv, String rsaPrivateKey) {
		Map<String, String> enctyptMap = new HashMap<String, String>();
		try {
			// AES加密数据
			String enctyptData = AesUtils.doAES(sourceData, aesKey, Cipher.ENCRYPT_MODE, iv);
			enctyptMap.put("enctyptData", enctyptData);
			// RSA私钥加密AES的iv(初始向量)
			RSAPrivateKey privateKey = RsaUtils.getPrivateKey(rsaPrivateKey);
			String ivEncryptData = RsaUtils.privateEncrypt(iv, privateKey);
			enctyptMap.put("ivEncryptData", ivEncryptData);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}
		return enctyptMap;
	}
	
	/**
	 * AES加密,RSA公钥对AES的iv进行加密
	 * @param sourceData
	 * 			原文
	 * @param aesKey
	 * 			AES加密算法KEY
	 * @param iv
	 * 			AES加密算法的初始向量
	 * @param rsaPrivateKey
	 * 			RSA加密算法的公钥
	 * @return
	 */
	public static Map<String, String> publicEncryptData(String sourceData, String aesKey, String iv, String rsaPublicKey) {
		Map<String, String> enctyptMap = new HashMap<String, String>();
		try {
			// AES加密数据
			String enctyptData = AesUtils.doAES(sourceData, aesKey, Cipher.ENCRYPT_MODE, iv);
			enctyptMap.put("enctyptData", enctyptData);
			// RSA私钥加密AES的iv(初始向量)
			RSAPublicKey publicKey = RsaUtils.getPublicKey(rsaPublicKey);
			String ivEncryptData = RsaUtils.publicEncrypt(iv, publicKey);
			enctyptMap.put("ivEncryptData", ivEncryptData);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}
		return enctyptMap;
	}
	
	/**
	 * RSA私钥对AES的iv进行解密,AES解密
	 * @param enctyptData
	 * 				加密数据
	 * @param aesKey
	 * 				AES加密算法KEY
	 * @param ivEncryptData
	 * 				AES解密算法被加密过的初始向量
	 * @param rsaPrivateKey
	 * 				RSA解密算法的私钥
	 * @return
	 */
	public static Map<String, String> privateDecryptData(String enctyptData, String aesKey, String ivEncryptData, String rsaPrivateKey) {
		Map<String, String> dectyptMap = new HashMap<String, String>();
		try {
			// RSA私钥解密AES的iv(初始向量)
			RSAPrivateKey privateKey = RsaUtils.getPrivateKey(rsaPrivateKey);
			String ivDectyptData = RsaUtils.privateDecrypt(ivEncryptData, privateKey);
			dectyptMap.put("ivDectyptData", ivDectyptData);
			// AES解密数据
			String dectyptData = AesUtils.doAES(enctyptData, aesKey, Cipher.DECRYPT_MODE, ivDectyptData);
			dectyptMap.put("dectyptData", dectyptData);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}
		return dectyptMap;
	}
	
	/**
	 * RSA公钥对AES的iv进行解密,AES解密
	 * @param enctyptData
	 * 				加密数据
	 * @param aesKey
	 * 				AES加密算法KEY
	 * @param ivEncryptData
	 * 				AES解密算法被加密过的初始向量
	 * @param rsaPrivateKey
	 * 				RSA解密算法的公钥
	 * @return
	 */
	public static Map<String, String> publicDecryptData(String enctyptData, String aesKey, String ivEncryptData, String rsaPublicKey) {
		Map<String, String> dectyptMap = new HashMap<String, String>();
		try {
			// RSA公钥解密AES的iv(初始向量)
			RSAPublicKey publicKey = RsaUtils.getPublicKey(rsaPublicKey);
			String ivDectyptData = RsaUtils.publicDecrypt(ivEncryptData, publicKey);
			dectyptMap.put("ivDectyptData", ivDectyptData);
			// AES解密数据
			String dectyptData = AesUtils.doAES(enctyptData, aesKey, Cipher.DECRYPT_MODE, ivDectyptData);
			dectyptMap.put("dectyptData", dectyptData);
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (InvalidKeySpecException e) {
			e.printStackTrace();
		}
		return dectyptMap;
	}
	
	public static void main(String[] args) {
		// 源数据
		String sourceData = "123abc";
		// AES的KEY
		String aesKey = "MTIzNDU2NzgxMjM0NTY3OA==";
		// AES的iv
		String iv = "MTIzNDU2Nzg5MDEyMzQ1Ng==";
		// RSA公钥
		String rsaPublicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApPVGHbt3DryBYbFF-KrLp1Dr4Drbo2IjsPNFmzb0QtcIBADxrTd1XuX2PV8PiQ2rAeAeG80eXxrzPsxZR0ruNRig9P0uMlLir7wtWMNvu6HYNsV10b9ZBnRg28EiizMbkORbKhoa_kCYwbgXtoL7EWVVNzENfiTB9PJCyHqgJSoLdDtpEOc3HIk42RmT_3fCsVpQCB2uIqQxFsZNTZLFM2qbTrLdyfBey7NkDkChMNOPtBWzxLqbnyIPgDkPeM9eN8MDEP_7MlQi7wxdUKbWqiXPnpEiI2kuRKZ0SuVUw78XEXhMdaZ_MfYhP0CFE3gypfItfEoJTh8HvPwAAl_P3QIDAQAB";
		// RSA私钥
		String rsaPrivateKey = "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCk9UYdu3cOvIFhsUX4qsunUOvgOtujYiOw80WbNvRC1wgEAPGtN3Ve5fY9Xw-JDasB4B4bzR5fGvM-zFlHSu41GKD0_S4yUuKvvC1Yw2-7odg2xXXRv1kGdGDbwSKLMxuQ5FsqGhr-QJjBuBe2gvsRZVU3MQ1-JMH08kLIeqAlKgt0O2kQ5zcciTjZGZP_d8KxWlAIHa4ipDEWxk1NksUzaptOst3J8F7Ls2QOQKEw04-0FbPEupufIg-AOQ94z143wwMQ__syVCLvDF1QptaqJc-ekSIjaS5EpnRK5VTDvxcReEx1pn8x9iE_QIUTeDKl8i18SglOHwe8_AACX8_dAgMBAAECggEAJB8EWUbfUXYEM870djj6KttspzdkOIDpNVpz48LTFl7NRckqIqa5-AuNkc9C0N1SFLFNjoNqMuOtH5NyOksFYdGQj0zwZHsjYd1oJZ94FENim8292K3YkfICcqR2SrpofyAN-WhpgELHYGYOJTxFu3-vuwvt-zET2q4A4zL85d4WxNoJEKZES1gwAatIxWaw_U_874L2iRRV-lcgGCUkJpeW3z7w6An_9d7_xmaro14cEnGTpJQemSjz3k3gCSqoziKdD314M5i4HSfZq8YH8HlDvkF2aHWFc5pPthvbNtGrGmVsknoGEg5VfaRYT7RzVefHh0U1O7FKIyAQ8c6HYQKBgQDUA9NUirpjlyU0FkbvatOD6Tcbpg-XHlV6gM7ioCDTI6TIaVPK5RJFBOskVwroXKxDBKvRXxR7_Yy_iyqNDcspbcDnZdpLm1_q0BMWTwyEAgRazQbfmaETJHlbTXGifrfIj-qrrWG8EUrpNmOwSXurwWOQy9D8GqnVjMtXStIrfQKBgQDHLj744Ap_Gx3OytYPYfLpayzviwvBs7o9bjchDVDCl8fCjLdHiWDpnA8dhmLUxJ7UVbn4VgR4QhrMqwjkoPUbLkOAaCPE7r6Z2mAUuJE1OiV-MUOI_UxJ3HEqMm1vA6frajcUS3ChpI19XZGOix4ss9QQacO88Q1wlLeJcYOj4QKBgQCcl5q-JZzXM-qplw6bhOZm1pj6VePL9P6jdYHYxvaXnAr4bzsRb7HXwnM-qv-GcfRVp5yUDsrdbX9IdixedGKq3cKN5p-eGkt07mw6nPYchjTbL_W0rw7WSalMs12L7FYnz4w_ctbuBkOzDpYAvbWXPUYhyzg3DCaGcPA7MCsdLQKBgFOiCXL6r62bNzLjXGptGFAGXoHegns8-hBdPOy16JksngYEi9iPyI-OpZIiIVFxlbdWn5W0mH_eUd5qWnuVUhWtoU5Da_F-xa1YUkuhC-ermJ6aFN9qbCP_Wcz8C5M3l8RzftkYrBxTOc3QAhQ2Od9PStXxcuzc0mXZLA-cCEhBAoGBAIUYABxTwot1ZfyDcsCE-9gB80sXM4u_1-AvT_qa_777gFe6kTEwlX1PBvpAMSx2YaVYIvFohBBZY-Fz7pTsc7Nx4mDkc-F86uMwF8LS-X-yWlZ0QltPX6O5CZ5Y9Mt0cFfQ_l-AnhetTRb6OolFEAz_BoWxRw1-vsB442gr5c5P";
		
		System.out.println("源数据:" + sourceData);
		System.out.println("iv:" + iv);
		
		// 公钥加密
		Map<String, String> publicEncryptMap = publicEncryptData(sourceData, aesKey, iv, rsaPublicKey);
		String publicEncryptData = publicEncryptMap.get("enctyptData"); // 公钥加密后的数据
		String ivPublicEncryptData = publicEncryptMap.get("ivEncryptData"); // 公钥加密后的iv
		System.out.println("AES加密后的数据:" + publicEncryptData);
		System.out.println("RSA公钥加密后的iv:" + ivPublicEncryptData);
		// 私钥解密
		Map<String, String> privateDecryptMap = privateDecryptData(publicEncryptData, aesKey, ivPublicEncryptData, rsaPrivateKey);
		String privateDecryptData = privateDecryptMap.get("dectyptData"); // 私钥解密后的数据
		String ivPrivateDecryptData = privateDecryptMap.get("ivDectyptData"); // 私钥解密后的iv
		System.out.println("AES解密后的数据:" + privateDecryptData);
		System.out.println("RSA私钥解密后的iv:" + ivPrivateDecryptData);
		System.out.println("===================================================");
		// 私钥加密
		Map<String, String> privateEncryptMap = privateEncryptData(sourceData, aesKey, iv, rsaPrivateKey);
		String privateEncryptData = privateEncryptMap.get("enctyptData"); // 私钥加密后的数据
		String ivPrivateEncryptData = privateEncryptMap.get("ivEncryptData"); // 私钥加密后的iv
		System.out.println("AES加密后的数据:" + privateEncryptData);
		System.out.println("RSA私钥加密后的iv:" + ivPrivateEncryptData);
		// 公钥解密
		Map<String, String> publicDecryptMap = publicDecryptData(privateEncryptData, aesKey, ivPrivateEncryptData, rsaPublicKey);
		String publicDecryptData = publicDecryptMap.get("dectyptData"); // 私钥解密后的数据
		String ivPublicDecryptData = publicDecryptMap.get("ivDectyptData"); // 私钥解密后的iv
		System.out.println("AES解密后的数据:" + publicDecryptData);
		System.out.println("RSA私钥解密后的iv:" + ivPublicDecryptData);
	}

}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值