java以字符串格式存储密钥的RSA非对称加密工具类

简要加密说明

rsa即非对称加密算法,生成的密钥为一对,一个叫公钥一个叫私钥,私钥可以解密公钥加密的密文,公钥可以解密私钥加密的密文。网上的一般都是以密钥文件格式存储的使用起来很不方便,所以自己写了个字符串格式存储的工具类。RSA较AES对称加密算法安全性高,但是性能较差。如果想要安全和性能两者兼得,可以两者配合使用,就像https加密算法一样,通信数据用AES加密,AES的密钥用RSA加密进行传输。

话不多说,上代码:

import java.security.Key;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.Cipher;

import org.apache.commons.codec.binary.Base64;
 
/**
 * 非对称加密工具类
 * @author yangjq
 * 2019-04-16
 */
public class RSASecurityUtils {
	/** 指定加密算法为RSA */
	private static final String ALGORITHM = "RSA";
	/** 密钥长度,注:只加密关键信息即可(过长字符串RSA加解密性能较差) */
	private static final int KEYSIZE = 1024;//1024、2048、3072、4096...长度无限制,越长性能越差安全性越高
 
	/**
	 * 生成密钥对
	 * @throws Exception
	 */
	public static void generateKeyPair() throws Exception {
		// /**可信任的随机数源 */
		// SecureRandom secureRandom = new SecureRandom();
		/** 为RSA算法创建一个KeyPairGenerator对象 */
		KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
		/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */
		// keyPairGenerator.initialize(KEYSIZE, secureRandom);
		keyPairGenerator.initialize(KEYSIZE);//默认随机数源
		/** 生成密匙对 */
		KeyPair keyPair = keyPairGenerator.generateKeyPair();
		/** 得到公钥 */
		Key publicKey = keyPair.getPublic();
		/** 得到私钥 */
		Key privateKey = keyPair.getPrivate();
		try {
			/** 密钥转字符串 */
			byte[] privateData=privateKey.getEncoded();
			String privateStr=Base64.encodeBase64String(privateData);
			byte[] publicData=publicKey.getEncoded();
			String publicStr=Base64.encodeBase64String(publicData);
			System.out.println("私钥:"+privateStr);
			System.out.println("公钥:"+publicStr);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
 
	/**
	 * 公钥加密方法
	 * @param source 源数据
	 * @return
	 * @throws Exception
	 */
	public static String encrypt(String publicKey,String source) throws Exception {
		Key key=stringToPublicKey(publicKey);
		/** 得到Cipher对象来实现对源数据的RSA加密 */
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] b = source.getBytes();
		/** 执行加密操作 */
		byte[] b1 = cipher.doFinal(b);
		return Base64.encodeBase64String(b1);
	}
	
	/**
	 * 私钥加密方法
	 * @param source 源数据
	 * @return
	 * @throws Exception
	 */
	public static String encryptPriKey(String privateKey,String source) throws Exception {
		Key key=stringToPrivateKey(privateKey);
		/** 得到Cipher对象来实现对源数据的RSA加密 */
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.ENCRYPT_MODE, key);
		byte[] b = source.getBytes();
		/** 执行加密操作 */
		byte[] b1 = cipher.doFinal(b);
		return Base64.encodeBase64String(b1);
	}
 
	/**
	 * 私钥解密算法
	 * @param cryptograph 密文
	 * @return
	 * @throws Exception
	 */
	public static String decrypt(String privateKey,String cryptograph) throws Exception {
		Key key=stringToPrivateKey(privateKey);
		/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] b1 = Base64.decodeBase64(cryptograph);
		/** 执行解密操作 */
		byte[] b = cipher.doFinal(b1);
		return new String(b);
	}
	
	/**
	 * 公钥解密算法
	 * @param cryptograph 密文
	 * @return
	 * @throws Exception
	 */
	public static String decryptPubKey(String publicKey,String cryptograph) throws Exception {
		Key key=stringToPublicKey(publicKey);
		/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */
		Cipher cipher = Cipher.getInstance(ALGORITHM);
		cipher.init(Cipher.DECRYPT_MODE, key);
		byte[] b1 = Base64.decodeBase64(cryptograph);
		/** 执行解密操作 */
		byte[] b = cipher.doFinal(b1);
		return new String(b);
	}
	
	/**
     * 密钥串转privateKey
     * @param String
     * @return
	 * @throws Exception 
     */
	public static Key stringToPrivateKey(String keyStr) throws Exception {
		byte[] keyBytes=Base64.decodeBase64(keyStr);
		PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
		PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
		return privateKey;
    }
	
	/**
     * 密钥串转publicKey
     * @param String
     * @return
	 * @throws Exception 
     */
	public static PublicKey stringToPublicKey(String keyStr) throws Exception {
		byte[] keyBytes=Base64.decodeBase64(keyStr);
		X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
		KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
		PublicKey publicKey = keyFactory.generatePublic(keySpec);
		return publicKey;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值