importjava.io.File;importjava.nio.charset.Charset;importjava.security.KeyFactory;importjava.security.KeyPair;importjava.security.KeyPairGenerator;importjava.security.PrivateKey;importjava.security.PublicKey;importjava.security.spec.PKCS8EncodedKeySpec;importjava.security.spec.X509EncodedKeySpec;importjava.util.Base64;importjavax.crypto.Cipher;importorg.apache.commons.io.FileUtils;public classRSAUtil {private static String algorithm = "RSA"; //加密算法
private static String pubPath = "C:\\key\\publickey";private static String priPath = "C:\\key\\privatekey";/*** 生成密钥对并保存在本地文件中
*
*@paramalgorithm : 算法
*@parampubPath : 公钥保存路径
*@parampriPath : 私钥保存路径
*@throwsException*/
public static void generateKeyToFile(String algorithm, String pubPath, String priPath) throwsException {//创建密钥对生成器对象
KeyPairGenerator keyPairGenerator =KeyPairGenerator.getInstance(algorithm);//生成密钥对
KeyPair keyPair =keyPairGenerator.generateKeyPair();//生成公钥 私钥
PublicKey publicKey =keyPair.getPublic();
PrivateKey privateKey=keyPair.getPrivate();//获取公私钥字节数组
byte[] publicKeyEncoded =publicKey.getEncoded();byte[] privateKeyEncoded =privateKey.getEncoded();//对公私钥进行base64编码
String publicKeyString =Base64.getEncoder().encodeToString(publicKeyEncoded);
String privateKeyString=Base64.getEncoder().encodeToString(privateKeyEncoded);//保存公私钥到文件
FileUtils.writeStringToFile(new File(pubPath), publicKeyString, Charset.forName("UTF-8"));
FileUtils.writeStringToFile(new File(priPath), privateKeyString, Charset.forName("UTF-8"));
}/**解密
*@paramencrypted:密文
*@return:原文
*@throwsException*/
public static String decryptRSA(String encrypted) throwsException {//将文件内容转为字符串
String privateKeyString = FileUtils.readFileToString(newFile(priPath), Charset.defaultCharset());//获取密钥工厂
KeyFactory keyFactory =KeyFactory.getInstance(algorithm);//构建密钥规范 进行Base64解码
PKCS8EncodedKeySpec spec = newPKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyString));//生成私钥
PrivateKey key =keyFactory.generatePrivate(spec);//创建加密对象
Cipher cipher =Cipher.getInstance(algorithm);//进行解密
cipher.init(Cipher.DECRYPT_MODE, key);//由于密文进行了Base64编码, 在这里需要进行解码
byte[] decode =Base64.getDecoder().decode(encrypted);//对密文进行解密,不需要使用base64,因为原文不会乱码
byte[] bytes1 =cipher.doFinal(decode);return newString(bytes1);
}/*** 使用密钥加密数据
*
*@paraminput :原文
*@return:密文
*@throwsException*/
public static String encryptRSA(String input) throwsException {//将文件内容转为字符串
String publicKeyString = FileUtils.readFileToString(newFile(pubPath), Charset.defaultCharset());//获取密钥工厂
KeyFactory keyFactory =KeyFactory.getInstance(algorithm);//构建密钥规范 进行Base64解码
X509EncodedKeySpec spec = newX509EncodedKeySpec(Base64.getDecoder().decode(publicKeyString));
PublicKey key=keyFactory.generatePublic(spec);//创建加密对象
Cipher cipher =Cipher.getInstance(algorithm);//初始化加密
cipher.init(Cipher.ENCRYPT_MODE, key);//私钥加密
byte[] bytes =cipher.doFinal(input.getBytes());//对密文进行Base64编码
returnBase64.getEncoder().encodeToString(bytes);
}
}