非对称加密算法RSA的实现
package com.wezl.demo;
import com.sun.org.apache.xml.internal.security.utils.Base64;
import org.apache.commons.io.FileUtils;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* @PackageName: com.wezl.demo
* @ClassName: RSAdemo
* @Author: dongxingyaohui
* @Date: 2021/6/5 18:40
*/
public class RSADemo {
public static void main(String[] args) throws Exception {
String res = "测试";
String algorithm = "RSA";
//生成公钥和私钥 ****(此方法第一次运行的时候只调用一次,后续注释 保证公钥和私钥只生成一次)****
generateKeyToFile(algorithm,"a.pub","a.pri");
//获取存储的公钥和私钥的key
PrivateKey priKey = getPriKey("a.pri", algorithm);
PublicKey pubKey = getPubKey("a.pub", algorithm);
//对数据进行加密测试
String encryptRSA = encryptRSA(algorithm, priKey, res);
//对数据进行解密
String decryptRSA = decryptRSA(algorithm, pubKey, encryptRSA);
System.out.println(decryptRSA);
}
/**
* 根目录下读取公钥
* @param s 公钥文件名称
* @param algorithm 加密规则
* @return PublicKey 公钥key的对象
* */
private static PublicKey getPubKey(String s, String algorithm) throws Exception {
String s1 = FileUtils.readFileToString(new File(s), Charset.defaultCharset());
//创建key的对象
KeyFactory instance = KeyFactory.getInstance(algorithm);
//设置公钥的规则
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(s1));
return instance.generatePublic(x509EncodedKeySpec);
}
/**
* 根目录下读取私钥
* @param s 私钥文件名
* @param algorithm 加密方式
* @return PrivateKey 秘钥的key的返回方式
* */
private static PrivateKey getPriKey(String s, String algorithm) throws Exception {
String s1 = FileUtils.readFileToString(new File(s), Charset.defaultCharset());
//创建key的工厂
KeyFactory instance = KeyFactory.getInstance(algorithm);
//创建私钥key的规则
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(s1));
//获取私钥key
PrivateKey privateKey = instance.generatePrivate(pkcs8EncodedKeySpec);
return privateKey;
}
/**
* 保存私钥和公钥到项目的根路径下
* @param algorithm 加密方式
* @param pubPath 公钥的保存地址
* @param priPath 私钥的保存地址
*/
public static void generateKeyToFile(String algorithm,String pubPath,String priPath) throws NoSuchAlgorithmException, IOException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
//生成秘钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//获取公钥
PublicKey aPublic = keyPair.getPublic();
byte[] abytepublic = aPublic.getEncoded();
// 对公钥进行编码
String encodePublic = Base64.encode(abytepublic);
//获取私钥
PrivateKey aPrivate = keyPair.getPrivate();
byte[] abyteprivate = aPrivate.getEncoded();
String encodePrivate = Base64.encode(abyteprivate);
FileUtils.writeStringToFile(new File(pubPath),encodePublic, Charset.forName("UTF-8"));
FileUtils.writeStringToFile(new File(priPath),encodePrivate, Charset.forName("UTF-8"));
}
/**
* 加密方法
* @param algorithm 加密方式
* @param aPrivate 秘钥(公钥或者私钥)
* @param input 数据
* */
public static String encryptRSA(String algorithm,Key aPrivate,String input) throws NoSuchPaddingException, NoSuchAlgorithmException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
// 创建加密对象
Cipher instance = Cipher.getInstance(algorithm);
//初始化加密对象 第一个参数 加密模式 第二个参数 你想使用公钥加密还是私钥加密
//使用私钥进行加密
instance.init(Cipher.ENCRYPT_MODE,aPrivate);
//进行加密
byte[] bytes = instance.doFinal(input.getBytes());
String encode = Base64.encode(bytes);
return encode;
}
/**
* 解密方法
* @param algorithm 加密方式
* @param aPrivate 秘钥(公钥或者私钥)
* @param encryPted 密文
* */
public static String decryptRSA(String algorithm,Key aPrivate,String encryPted) throws Exception{
Cipher instance = Cipher.getInstance(algorithm);
System.out.println("----------解密---------------");
instance.init(Cipher.DECRYPT_MODE,aPrivate);
byte[] decode = Base64.decode(encryPted);
byte[] bytes1 = instance.doFinal(decode);
return new String(bytes1);
}
}
需要注意的是FileUtils 引用的commons.io下的包 依赖
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>