rsa数据加密

package com.sgcc.common;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;

import org.apache.commons.lang3.StringUtils;

import com.alibaba.fastjson.JSONObject;

import java.io.UnsupportedEncodingException;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class RsaUtil {

	private String privateKey = "MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKzQRnD0MfToiCoGBIOeN0bqmKKcnyahrYRuZpwucIQJgCcDMz4u6lM1dW0DVw3jjJBK4tEye3z4FnthNE7yFlXVdncj8iHUdF/F4rNTsE/ATK3PdSlCa0jCoYHrcb1jB8HBc7zly8qCQUB+KsVchsTd+6pm9KJXtAQtPg7SciqxAgMBAAECgYAfAScCMO2dkPKNB5NbwdENCh3kXtE27x7geaYzMynApqu1VB+ncmdcEmVE76p4tXCMmsLi4XnCTAhMjn4CA/D5nbbqtlC+ihhnRMnuSHXGKFxenZhqwRglr18mtitQm2hNJHZyptjrGeWbviG1957J/qJLdJ22XhDK9m4f7ESM2QJBAOBsCECyxJSRxSVbJJGCUVtt+tP4rXb261PvWKgLxrW41WLT8HirzXBRSg8AqcKHxiKiamQ83hij37EPI3Ni/+sCQQDFIT3JLQ6LuD+t9XECRsHdIRVwHs+hENkcNC8oGFmNMiv400mtMFGo73KsW1rX21cYyh3DugJu5L/es5fBuLTTAkB6Xo3VcWS9OgrMhrkW2n8wInTtliBHyPWia9TktJ8iQWmhHL13nv5DKx/9tDfciZohEnx+sa3Ms7ZqXj3PUgEHAkEArKFfqj1674B6w6ydOpEcVLoUPAu/aB2JA9nvMf2g7rVxLIZbjv8xg++tTKLz+vRqYZseVbkfSF2qaSx9SXinYQJACEbamOTKNUEwZLEqNkZ7UQ9MyktazZeRnvGOjNiTPXaKaXCTfPeZXty85g5zjg8QRBj6rEibncJgQZoqSP33BA==";
	private String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCs0EZw9DH06IgqBgSDnjdG6piinJ8moa2EbmacLnCECYAnAzM+LupTNXVtA1cN44yQSuLRMnt8+BZ7YTRO8hZV1XZ3I/Ih1HRfxeKzU7BPwEytz3UpQmtIwqGB63G9YwfBwXO85cvKgkFAfirFXIbE3fuqZvSiV7QELT4O0nIqsQIDAQAB";

	public void initKey() throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException,
			UnsupportedEncodingException, BadPaddingException, IllegalBlockSizeException, InvalidKeySpecException {
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
		keyPairGenerator.initialize(1024);

		long time = System.currentTimeMillis();

		KeyPair keyPair = keyPairGenerator.generateKeyPair();

		RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
		RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

		System.out.println("publicKey:" + Base64.getEncoder().encodeToString(publicKey.getEncoded()));
		System.out.println("privateKey:" + Base64.getEncoder().encodeToString(privateKey.getEncoded()));

		System.out.println("execute time:" + (System.currentTimeMillis() - time));

		System.out.println("===================================================");
	}

	public String encryptByPrivateKey(String privateKey, String text)
			throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException,
			BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
		RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);

		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, rsaPrivateKey);
		byte[] bytes = cipher.doFinal(text.getBytes("utf-8"));
		return Base64.getEncoder().encodeToString(bytes);
	}

	public String encryptByPublicKey(String publicKey, String text)
			throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException,
			BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
		RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);

		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, rsaPublicKey);
		byte[] bytes = cipher.doFinal(text.getBytes("utf-8"));
		return Base64.getEncoder().encodeToString(bytes);
	}

	public String decryptByPrivateKey(String privateKey, String text)
			throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException,
			BadPaddingException, IllegalBlockSizeException {
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKey));
		RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyFactory.generatePrivate(pkcs8EncodedKeySpec);

		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, rsaPrivateKey);
		byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(text));
		return new String(bytes);
	}

	public String decryptByPublicKey(String publicKey, String text)
			throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException,
			BadPaddingException, IllegalBlockSizeException {
		KeyFactory keyFactory = KeyFactory.getInstance("RSA");
		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey));
		RSAPublicKey rsaPublicKey = (RSAPublicKey) keyFactory.generatePublic(x509EncodedKeySpec);

		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, rsaPublicKey);
		byte[] bytes = cipher.doFinal(Base64.getDecoder().decode(text));
		return new String(bytes);
	}

	/**
	 * 
	 */
	public void vaildParam(String text, String md5) {
		// test MD5加密
		// 验证加密后与 md5 是否 一致
	}

	/**
	 * 公钥加密
	 * 
	 * @param Rsaparam
	 * @return
	 */
	public String rsaEncryptionByPubK(String Rsaparam) {
		// TODO Auto-generated method stub
		String mv = "";
		try {
			mv = encryptByPublicKey(publicKey, Rsaparam);
		} catch (UnsupportedEncodingException | InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException
				| NoSuchPaddingException | BadPaddingException | IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}

	/**
	 * 私钥加密
	 * 
	 * @param Rsaparam
	 * @return
	 */
	public String rsaEncryptionByPriK(String Rsaparam) {
		// TODO Auto-generated method stub
		String mv = "";
		try {
			mv = encryptByPrivateKey(privateKey, Rsaparam);
		} catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException
				| BadPaddingException | IllegalBlockSizeException | UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}

	/*public static void main(String[] args) {
		String p = new RsaUtil().rsaAnalysisByPubK("fiP0d3MupEubdciJTmj9a3i/4rGnX3OqpxDcNY6MxPVit2b7cncU640d0RrCgeaK0Otq0b7vMkC/Gidkj5GpYOgc2Is3XFtOn6qpywtnhWR/BhThXWIT1WaFPQLdZWBZq1ocGI762iFOE4q3LAlQ6UmTBcPWJqgvv/RGjM9eh+c=");
		System.out.println(p);
	}*/
	
	/**
	 * 公钥解密
	 * 
	 * @param Rsaparam
	 * @return
	 */
	public String rsaAnalysisByPubK(String Rsaparam) {
		// TODO Auto-generated method stub
		String mv = "";
		try {
			mv = decryptByPublicKey(publicKey, Rsaparam);
		} catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException
				| BadPaddingException | IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}

	/**
	 * 私钥解密
	 * 
	 * @param Rsaparam
	 * @return
	 */
	public String rsaAnalysisByPriK(String Rsaparam) {
		// TODO Auto-generated method stub
		String mv = "";
		try {
			mv = decryptByPrivateKey(privateKey, Rsaparam);
		} catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException
				| BadPaddingException | IllegalBlockSizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return mv;
	}

	/**
	 * 解析rsa加密对象
	 * 
	 * @param Rsaparam
	 * @return
	 */
	public String rsaAnalysis(String Rsaparam) {
		return recursion(Rsaparam).toJSONString();
	}

	public static void main(String[] args) {
		RsaUtil rsa = new RsaUtil();
		String str = "{\"serviceCode\":\"f07\",\"data\":{\"common\":{\"TOKEN\":\"6a58370e5d5f42c892e0da454299c403\",\"CHANNEL_RESOURCE\":\"123456789\"},\"data\":{\"BNKCRDNO\":\"6214830177541538\"}} }";
		String str1="{\"data\":{\"common\":{\"CHANNEL_RESOURCE\":\"fiP0d3MupEubdciJTmj9a3i/4rGnX3OqpxDcNY6MxPVit2b7cncU640d0RrCgeaK0Otq0b7vMkC/Gidkj5GpYOgc2Is3XFtOn6qpywtnhWR/BhThXWIT1WaFPQLdZWBZq1ocGI762iFOE4q3LAlQ6UmTBcPWJqgvv/RGjM9eh+c=\",\"TOKEN\":\"pOhY1GLydz85gZCxcDED6SfBW7wKgDA0F0EIYcQTzUN4YxgFhhBfpQChj7kgiMstZrpaygLVp133V5WlMszk51tGJDe4b5qd70l9uDSrnYYmcEz43DM9bIQcp4DdR3Lb/LjIajBCK5n/hynqLRQGQPtWicAmW5OlTP8ISMFHTxA=\"},\"data\":{\"BNKCRDNO\":\"Y61tL1U1tk8kwWVVClxwBoCVuWXk5kldJ9gmYddTclNpxoytpWXmB2hqk2K4AEGRpHLNsbfpH238bxrE0Djecc9vJIOAFnZRo7rjUNXjwFkSqSV/M+2A/XMCM4YeLpUlc2URLGScB5vmArw986aRdjyvS9wE1WvAH+M9Z6Pwffw=\"}},\"serviceCode\":\"bCb0xRXIaNj9jVnkcegerJI3x175CZ2KAmvy/jzEb0Ud5BdIinKNowhwE4kte3e+s1Mvjze8ma1gHqbmXvyv3J7Yy7POYBdg7g5jXbt45EyJoiiSqkK8Bas6YSpnaGNBVwPWAl1iYeZ6Vl6fmy7uY0rfuYNJq9uTdUT0rsMczpM=\"}";
		String str2 = "{\"uscInfo\":{\"isEncrypt\":false,\"deviceId\":\"865772032263400\",\"member\":\"grid_online\",\"tenant\":\"state_grid\",\"deviceIp\":\"127.0.0.1\"},\"quInfo\":{\"password\":\"0263bcf70efc6b086280efe4c8d5bf2e\",\"optSys\":\"android\",\"account\":\"17611257312\",\"addressCity\":330300,\"addressRegion\":330324,\"addressProvince\":330000,\"pushId\":\"1507bfd3f7d57d1011d\"} }";
		System.out.println(str);
		System.out.println(rsa.recursion(str2).toJSONString());
	}

	private JSONObject recursion(String param) {
		if (isJsonObject(param)) {
			JSONObject jsonObject = JSONObject.parseObject(param);
			Set<String> set = jsonObject.keySet();
			for (String key : set) {
				String value = jsonObject.get(key).toString();
				if (isJsonObject(value)) {
					jsonObject.put(key, recursion(value));
				} else {
					//value = rsaEncryptionByPriK(value);//私钥加密
					value = rsaAnalysisByPubK(value);//公钥解密
					jsonObject.put(key, value);
				}
			}
			return jsonObject;
		} else {
			return null;
		}
	}

	/**
	 * 判断字符串是否可以转化为json对象
	 * 
	 * @param content
	 * @return
	 */
	public static boolean isJsonObject(String content) {
		if (StringUtils.isBlank(content))
			return false;
		try {
			JSONObject jsonStr = JSONObject.parseObject(content);
			if (content.contains(":")) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			return false;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_36364521/article/details/84065176
今日推荐