package test;

import java.io.UnsupportedEncodingException;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;

import javax.crypto.Cipher;

public class Test {




	public static void main(String[] args) throws UnsupportedEncodingException {
		//加密
		Encoder en = Base64.getEncoder();
		//解密
		Decoder de = Base64.getDecoder();
		String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC18PiGQSQEuP0kv/qLPOr5cwT2QnaAugwwldQNXPLODB4px1U8hgOmGs8z7bVWU9yZjVzXVfBia9Y/TJIzCoeHSGSD3m0PIqPfDCdyA+natWEQVJxJMkEtYzWte3Wfa8e2QG581r64y7zq6Re9/e5BTlXgbUX9clGt/QyabZVufwIDAQAB";
		String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALXw+IZBJAS4/SS/+os86vlzBPZCdoC6DDCV1A1c8s4MHinHVTyGA6YazzPttVZT3JmNXNdV8GJr1j9MkjMKh4dIZIPebQ8io98MJ3ID6dq1YRBUnEkyQS1jNa17dZ9rx7ZAbnzWvrjLvOrpF7397kFOVeBtRf1yUa39DJptlW5/AgMBAAECgYAEh9uofDbJZ1HmeGFk1j+DtrmI6F7LFdb33sNJEed5+hNGNxCIUU4F9OT0Bhdd7vivWjXVpu41hTnwmZeKbdiyGvrgs3zEYM0st2Iv+Em66MVoFcvhxdQuOq13smvDXQ59ZFGApnD7PpHBAGZpAMwCVdw7dd0rYJHyc1oQByk+AQJBAN1CYANeCPXeHjSfpWScVqkj3Ku9uGCZji8qdWfcTdaJw9xxPhK8AQ5+Y2XaD/u5V9PyA68esMBhHyH0hK71w/kCQQDSgjCpQn8G4cAgfJtK9SvP9Eh9lJgUfFGUF2VFQJF0UuVmrCbua9107kht//gsFk2TtnqIGAvLdRqS21HJt/Q3AkEA2ocr/SdrAisW+jKTUAN5NCTPVnBTIlWHMN5mhuX3muUGJTtTa310LbR2x6nQD3bHX/Wv3c4aFGfYL9kpEwR5QQJBAJ1uul/LmF6YNOzW4/kCNLr4kcJBgB9J/mTHvng1WtLpMCFCPHdw+hV6I3cIyRyHrYr8HNVtTlzh/na4SYmX5q8CQHE/mnmgAhQMfsEHzLcDHdxWkISX9jOEPP1zc/FBZxDBF670Ragb7BdEFnSkRo4O33JqjTQ1d1sQRTsbOTULW/k=";
		byte[] bPubKey = de.decode(publicKey);
		byte[] bPriKey = de.decode(privateKey);
		String s = "中文你";
		System.out.println("加密字符串:"+s);
		String ss = en.encodeToString(encryptByRSA1(bPriKey,s.getBytes("UTF-8")));
		System.out.println("加密后的字符串:"+ss);
		String sss = new String(decryptByRSA1(bPubKey,de.decode(ss)),"UTF-8");
		System.out.println("解密后的字符串:"+sss);

	}

	/**
	 * 使用RSA私钥加密数据
	 *
	 * @param pubKeyInByte
	 *            打包的byte[]形式私钥
	 * @param data
	 *            要加密的数据
	 * @return 加密数据
	 */
	public static byte[] encryptByRSA1(byte[] privKeyInByte, byte[] data) {
	  try {
	    PKCS8EncodedKeySpec priv_spec = new PKCS8EncodedKeySpec(
	      privKeyInByte);
	    KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
	    PrivateKey privKey = mykeyFactory.generatePrivate(priv_spec);
	    Cipher cipher = Cipher.getInstance(mykeyFactory.getAlgorithm());
	    cipher.init(Cipher.ENCRYPT_MODE, privKey);
	    return cipher.doFinal(data);
	   } catch (Exception e) {
		   e.printStackTrace();
	    return null;
	   }

	}

	/**
	 * 用RSA公钥解密
	 *
	 * @param privKeyInByte
	 *            公钥打包成byte[]形式
	 * @param data
	 *            要解密的数据
	 * @return 解密数据
	 */
	public static byte[] decryptByRSA1(byte[] pubKeyInByte, byte[] data) {
	 try {
	   KeyFactory mykeyFactory = KeyFactory.getInstance("RSA");
	   X509EncodedKeySpec pub_spec = new X509EncodedKeySpec(pubKeyInByte);
	   PublicKey pubKey = mykeyFactory.generatePublic(pub_spec);
	   Cipher cipher = Cipher.getInstance(mykeyFactory.getAlgorithm());
	   //Cipher cipher = Cipher.getInstance("RSA");
	   cipher.init(Cipher.DECRYPT_MODE, pubKey);
	   return cipher.doFinal(data);
	  } catch (Exception e) {
		  e.printStackTrace();
	   return null;
	  }
	}

	/**
	 * RSA公钥加密
	 *
	 * @param str
	 *            加密字符串
	 * @param publicKey
	 *            公钥
	 * @return 密文
	 * @throws Exception
	 *             加密过程中的异常信息
	 */
	public static String encrypt( String str, String publicKey ) throws Exception{
		//base64编码的公钥
		byte[] decoded = Base64.decodeBase64(publicKey);
		RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded));
		//RSA加密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.ENCRYPT_MODE, pubKey);
		String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8")));
		return outStr;
	}

	/**
	 * RSA私钥解密
	 *
	 * @param str
	 *            加密字符串
	 * @param privateKey
	 *            私钥
	 * @return 铭文
	 * @throws Exception
	 *             解密过程中的异常信息
	 */
	public static String decrypt(String str, String privateKey) throws Exception{
		//64位解码加密后的字符串
		byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8"));
		//base64编码的私钥
		byte[] decoded = Base64.decodeBase64(privateKey);
        RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded));
		//RSA解密
		Cipher cipher = Cipher.getInstance("RSA");
		cipher.init(Cipher.DECRYPT_MODE, priKey);
		String outStr = new String(cipher.doFinal(inputByte));
		return outStr;
	}
}
05-08 11:11