Java RSA加密解密实现方法分析
本文介绍了Java中RSA加密解密的实现方法。主要讲解了如何生成密钥对、如何进行加密解密、如何将密钥序列化和反序列化等操作。同时为了方便实际开发,我们也提供了BASE64 jar包下载链接。
生成密钥对
首先我们需要使用Java中的KeyPairGenerator
类来生成RSA密钥对。代码如下:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
keyPairGenerator.initialize(1024, random);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
在上述代码中,我们使用了RSA算法并且指定了密钥长度为1024位。生成的密钥对包含公钥和私钥,可以通过KeyPair
对象获取。
加密解密
在得到密钥对之后,我们可以使用公钥进行加密,使用私钥进行解密。代码如下:
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
String plainText = "Hello World";
byte[] cipherText = null;
byte[] result = null;
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipherText = cipher.doFinal(plainText.getBytes());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
result = cipher.doFinal(cipherText);
System.out.println("PlainText: " + new String(plainText));
System.out.println("CipherText: " + new String(cipherText));
System.out.println("Result: " + new String(result));
在上述代码中,我们使用了Java中的Cipher
类进行加密解密操作。使用init
方法进行初始化操作,doFinal
方法进行加密解密操作。同时在实际开发中,我们一般将加密后的结果进行BASE64编码操作,使其更易于传输和存储。
序列化和反序列化
在实际开发中,我们需要将生成的密钥对进行序列化和反序列化操作以方便存储和传输。代码如下:
// 序列化
FileOutputStream fos = new FileOutputStream("keyPair.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(keyPair);
oos.close();
// 反序列化
FileInputStream fis = new FileInputStream("keyPair.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
KeyPair keyPair = (KeyPair) ois.readObject();
ois.close();
在上述代码中,我们使用了Java中的ObjectOutputStream
和ObjectInputStream
类进行序列化和反序列化操作。将生成的密钥对写入到文件中,然后读取出来即可。
示例
下面是两个简单的示例,第一个示例演示了生成密钥对、加密解密和BASE64编码解码操作;第二个示例演示了序列化和反序列化操作。
示例1:生成密钥对、加密解密和BASE64编码解码操作
import java.security.*;
import javax.crypto.*;
import java.util.Base64;
public class EncryptDecryptExample {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
keyPairGenerator.initialize(1024, random);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
// 加密
String plainText = "Hello World";
byte[] cipherText = null;
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
cipherText = cipher.doFinal(plainText.getBytes());
// BASE64编码
String encodedCipherText = Base64.getEncoder().encodeToString(cipherText);
String encodedPrivateKey = Base64.getEncoder().encodeToString(privateKey.getEncoded());
String encodedPublicKey = Base64.getEncoder().encodeToString(publicKey.getEncoded());
// BASE64解码
byte[] decodedCipherText = Base64.getDecoder().decode(encodedCipherText);
byte[] decodedPrivateKey = Base64.getDecoder().decode(encodedPrivateKey);
byte[] decodedPublicKey = Base64.getDecoder().decode(encodedPublicKey);
// 解密
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] result = cipher.doFinal(decodedCipherText);
System.out.println("PlainText: " + plainText);
System.out.println("CipherText: " + encodedCipherText);
System.out.println("DecodedCipherText: " + new String(decodedCipherText));
System.out.println("Result: " + new String(result));
}
}
示例2:序列化和反序列化操作
import java.io.*;
import java.security.*;
public class SerializeDeserializeExample {
public static void main(String[] args) throws Exception {
// 生成密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = new SecureRandom();
keyPairGenerator.initialize(1024, random);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 序列化
FileOutputStream fos = new FileOutputStream("keyPair.ser");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(keyPair);
oos.close();
// 反序列化
FileInputStream fis = new FileInputStream("keyPair.ser");
ObjectInputStream ois = new ObjectInputStream(fis);
KeyPair keyPair2 = (KeyPair) ois.readObject();
ois.close();
// 验证
PublicKey publicKey1 = keyPair.getPublic();
PrivateKey privateKey1 = keyPair.getPrivate();
PublicKey publicKey2 = keyPair2.getPublic();
PrivateKey privateKey2 = keyPair2.getPrivate();
System.out.println("PublicKey equals: " + publicKey1.equals(publicKey2));
System.out.println("PrivateKey equals: " + privateKey1.equals(privateKey2));
}
}
BASE64 jar包下载
为了方便使用BASE64操作,我们提供了BASE64 jar包下载链接:
https://github.com/haochenpan/markdown-qna-creator/files/7221178/commons-codec-1.15.jar.zip
将下载下来的jar包导入到项目中即可使用。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java RSA加密解密实现方法分析【附BASE64 jar包下载】 - Python技术站