非对称加密算法-RSA
@Test
public void test2() throws Exception {
//原文
String input = "明文魑魅魍魉";
//算法
String algorithm = "RSA";
//获取私钥对象
Key privateKey = getPrivateKey(algorithm);
//获取公钥对象
Key publicKey = getPublicKey(algorithm);
//加密
String encryption = encryption(algorithm, privateKey, input);
System.out.println(encryption);
//解密
String decrypt = decrypt(algorithm, publicKey, encryption);
System.out.println(decrypt);
}
/**
* 获取私钥对象
*
* @param algorithm
* @return
* @throws Exception
*/
public static Key getPrivateKey(String algorithm) throws Exception {
StringBuilder privateKeyString = new StringBuilder();
BufferedReader readerPrivate = new BufferedReader(new FileReader("private.txt"));
String linePrivate;
while ((linePrivate = readerPrivate.readLine()) != null) {
privateKeyString.append(linePrivate);
}
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(Base64.decode(privateKeyString.toString()));
return keyFactory.generatePrivate(keySpec);
}
/**
* 获取公钥对象
*
* @param algorithm
* @return
* @throws Exception
*/
public static Key getPublicKey(String algorithm) throws Exception {
StringBuilder publicKeyString = new StringBuilder();
BufferedReader readerPublic = new BufferedReader(new FileReader("public.txt"));
String linePublic;
while ((linePublic = readerPublic.readLine()) != null) {
publicKeyString.append(linePublic);
}
KeyFactory keyFactory = KeyFactory.getInstance(algorithm);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(Base64.decode(publicKeyString.toString()));
return keyFactory.generatePublic(keySpec);
}
/**
* 加密
*
* @param algorithm 算法
* @param privateKey 私钥加密
* @param input 明文
* @return
* @throws Exception
*/
public static String encryption(String algorithm, Key privateKey, String input) throws Exception {
//创建加密对象
Cipher cipher = Cipher.getInstance(algorithm);
//对加密进行初始化
//第一个参数:加密的模式
//第二参数:想使用公钥加密还是私钥加密
//使用私钥进行加密
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
//加密 :密文
byte[] bytes = cipher.doFinal(input.getBytes());
//base64编码
return Base64.encode(bytes);
}
/**
* 解密
*
* @param algorithm 算法
* @param publicKey 公钥解密
* @param encode 密文
* @return
* @throws Exception
*/
public static String decrypt(String algorithm, Key publicKey, String encode) throws Exception {
//创建加密对象
Cipher cipher = Cipher.getInstance(algorithm);
//公钥解密
cipher.init(Cipher.DECRYPT_MODE, publicKey);
//base64解码
byte[] decode = Base64.decode(encode);
//解密:明文
byte[] decodeByte = cipher.doFinal(decode);
return new String(decodeByte);
}
/**
* 生成公钥和私钥文件
*
* @throws Exception
*/
@Test
public void getPubliceKey() throws Exception {
//算法
String algorithm = "RSA";
//创建密钥对生成器对象
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm);
//生成密钥对
KeyPair keyPair = keyPairGenerator.generateKeyPair();
//生成私钥
PrivateKey aPrivate = keyPair.getPrivate();
//生成公钥
PublicKey aPublic = keyPair.getPublic();
//生成私钥子节数组
byte[] privateEncoded = aPrivate.getEncoded();
//生成公钥子节数组
byte[] publicEncoded = aPublic.getEncoded();
//对公私钥进行base64编码
String privateEncodedString = Base64.encode(privateEncoded);
String publicEncodedString = Base64.encode(publicEncoded);
Files.write(Paths.get("private.txt"), privateEncodedString.getBytes());
Files.write(Paths.get("public.txt"), publicEncodedString.getBytes());
}
效果演示
本地生成公钥和密钥文件