java rsa 私钥推导公钥 demo
时间: 2023-06-20 14:04:02 浏览: 116
以下是使用 Java 实现 RSA 密钥对生成,以及从私钥推导公钥的示例代码:
```java
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.EncodedKeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
public class RSAExample {
public static void main(String[] args) throws Exception {
// 生成 RSA 密钥对
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
PublicKey publicKey = keyPair.getPublic();
// 从私钥推导公钥
EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(privateKey.getEncoded());
EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(privateKeySpec.getEncoded());
PublicKey derivedPublicKey = KeyFactory.getInstance("RSA").generatePublic(publicKeySpec);
// 测试加解密
String message = "Hello, world!";
byte[] encrypted = encrypt(message.getBytes(), publicKey);
byte[] decrypted = decrypt(encrypted, privateKey);
System.out.println(new String(decrypted));
}
public static byte[] encrypt(byte[] plainText, PublicKey publicKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(plainText);
}
public static byte[] decrypt(byte[] cipherText, PrivateKey privateKey) throws Exception {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(cipherText);
}
}
```
首先,我们使用 `KeyPairGenerator` 生成一个 2048 位的 RSA 密钥对。然后,我们从私钥中提取出 PKCS#8 编码格式的字节数组,并使用 `X509EncodedKeySpec` 将其转换为公钥,即可完成从私钥推导公钥的过程。
最后,我们使用 `encrypt` 和 `decrypt` 方法测试加解密功能。注意,加密和解密时使用的是公钥和私钥,而不是推导出来的公钥和原始私钥。
阅读全文