import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.IsEqual.equalTo;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.RSA;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.gen.RSAKeyGenerator;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import org.junit.Test;
@Test
public void generateRsaKeyPair()
throws NoSuchAlgorithmException, JOSEException, InvalidKeySpecException {
RSAKey rsaJWK = new RSAKeyGenerator(2048)
.keyID(IdUtil.fastSimpleUUID())
.generate();
PublicKey publicKey = rsaJWK.toPublicKey();
String publicKeyEncode = Base64.getEncoder().encodeToString(publicKey.getEncoded());
byte[] publicKeyDecode = Base64.getDecoder().decode(publicKeyEncode);
PrivateKey privateKey = rsaJWK.toPrivateKey();
String privateKeyEncode = Base64.getEncoder().encodeToString(privateKey.getEncoded());
byte[] privateKeyDecode = Base64.getDecoder().decode(privateKeyEncode);
KeyPair keyPair = new KeyPair(publicKey, privateKey);
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(publicKeyDecode);
PublicKey generatePublic1 = KeyFactory.getInstance("RSA").generatePublic(x509EncodedKeySpec);
String genPublicKeyEncode1 = Base64.getEncoder().encodeToString(generatePublic1.getEncoded());
KeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(privateKeyDecode);
PrivateKey generatePrivate1 =
KeyFactory.getInstance("RSA").generatePrivate(pkcs8EncodedKeySpec);
String genPrivateKeyEncode1 = Base64.getEncoder().encodeToString(generatePrivate1.getEncoded());
assertThat(publicKeyEncode, equalTo(genPublicKeyEncode1));
assertThat(privateKeyEncode, equalTo(genPrivateKeyEncode1));
RSA rsa = SecureUtil.rsa(privateKeyEncode, publicKeyEncode);
PublicKey genPublicKey2 = rsa.getPublicKey();
String genPublicKeyEncode2 = Base64.getEncoder().encodeToString(genPublicKey2.getEncoded());
PrivateKey genPrivateKey2 = rsa.getPrivateKey();
String genPrivateKeyEncode2 = Base64.getEncoder().encodeToString(genPrivateKey2.getEncoded());
assertThat(publicKeyEncode, equalTo(genPublicKeyEncode2));
assertThat(privateKeyEncode, equalTo(genPrivateKeyEncode2));
}