RSAUtilV2
1.使用了两个properties文件分别保存公/私钥,具体保存的为Base64编码格式;
2.使用UUID 生成SecureRandom,每次都会生成不一样的密钥;
3.其中有个Provider的参数,没有理会,字面意思就指提供这个生成密钥算法的提供者吧,Java默认有一些,可以自己打出来看看;
4.类中使用了slf4j规范的logger(关于这个,请自行搜索学习了),如果不想用,可以把类中所有用LOGGER的地方,都换成Java自带的异常捕获;
5.我用的JDK 1.8,如果版本不够,可能Base64用不了(不想用JDK 1.8,那么需要自行下载一个带Base64功能的JAR包,然后修改我使用Base64的地方);
6.包含’公钥加密-私钥解密’和’私钥加密-公钥解密’;
7.使用起来很简单:直接复制代码,然后用类调用方法,比如 RSAUtilsV2.encryptByPublic(”test”.getBytes(),null);
8.完成这个类的时候,参考了很多网上的博客,非常感谢每一位的分享;
接下来直接上代码:
/**
* RSA算法加密/解密工具类V2
*/
public class RSAUtilV2 {
private static final Logger LOGGER = LoggerFactory.getLogger(RSAUtils.class);
/** 算法名称 */
private static final String ALGORITHM = "RSA";
/** 默认密钥大小 */
private static final int KEY_SIZE = 1024;
/** 用来指定保存密钥对的文件名和存储的名称 */
private static final String PUBLIC_KEY_NAME = "publicKey";
private static final String PRIVATE_KEY_NAME = "privateKey";
private static final String PUBLIC_FILENAME = "publicKey.properties";
private static final String PRIVATE_FILENAME = "privateKey.properties";
/** 密钥对生成器 */
private static KeyPairGenerator keyPairGenerator = null;
private static KeyFactory keyFactory = null;
/** 缓存的密钥对 */
private static KeyPair keyPair = null;
/** Base64 编码/解码器 JDK1.8 */
private static Base64.Decoder decoder = Base64.getDecoder();
private static Base64.Encoder encoder = Base64.getEncoder();
/** 初始化密钥工厂 */
static{
try {
keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
keyFactory = KeyFactory.getInstance(ALGORITHM);
} catch (NoSuchAlgorithmException e) {
LOGGER.error(e.getMessage(),e);
}
}
/** 私有构造器 */
private RSAUtilsV2(){}
/**
* 生成密钥对
* 将密钥分别用Base64编码保存到#publicKey.properties#和#privateKey.properties#文件中
* 保存的默认名称分别为publicKey和privateKey
*/
public static synchronized void generateKeyPair(){
try {
keyPairGenerator.initialize(KEY_SIZE,new SecureRandom(UUID.randomUUID().toString().replaceAll("-","").getBytes()));
keyPair = keyPairGenerator.generateKeyPair();
} catch (InvalidParameterException e){
LOGGER.error("KeyPairGenerator does not support a key length of " + KEY_SIZE + ".",e);
} catch (NullPointerException e){
LOGGER.error("RSAUtils#key_pair_gen is null,can not generate KeyPairGenerator instance.",e);
}
RSAPublicKey rsaPublicKey = (RSAPublicKey)keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate();
String publicKeyString = encoder.encodeToString(rsaPublicKey.getEncoded());
String privateKeyString = encoder.encodeToString(rsaPrivateKey.getEncoded());
storeKey(publicKeyString,PUBLIC_KEY_NAME,PUBLIC_FILENAME);
storeKey(privateKeyString,PRIVATE_KEY_NAME,PRIVATE_FILENAME);
}
/**
* 将指定的密钥字符串保存到文件中,如果找不到文件&