d -> ed + φ(n)k = 1
φ(n) -> (p-1)(q-1)
p,q -> n=qp
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
public class RsaTest {
private static final String ALGORITHM = "RSA";
public static void main(String[] args)
throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchPaddingException, InvalidKeyException, BadPaddingException, IllegalBlockSizeException {
KeyPairGenerator generator = KeyPairGenerator.getInstance(ALGORITHM);
generator.initialize(1024); // 初始化长度
KeyPair keyPair = generator.generateKeyPair();
PrivateKey privateKey = keyPair.getPrivate();
String privateKeyStr = Base64.getEncoder().encodeToString(privateKey.getEncoded());
PublicKey publicKey = keyPair.getPublic();
String publicKeyStr = Base64.getEncoder().encodeToString(publicKey.getEncoded());
// 输出
System.out.println(privateKeyStr);
System.out.println(publicKeyStr);
// 由字符串变回KeyPair
KeyFactory keyFactory = KeyFactory.getInstance(ALGORITHM);
PublicKey publicKey1 = keyFactory.generatePublic(
new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr.getBytes())));
PrivateKey privateKey1 = keyFactory.generatePrivate(
new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyStr.getBytes())));
System.out.println(publicKey1.equals(publicKey)); // 返回true
System.out.println(privateKey1.equals(privateKey));
String msg = "123xx";
// 加密
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] code = cipher.doFinal(msg.getBytes());
// 解密
cipher.init(Cipher.PRIVATE_KEY, privateKey);
String msg1 = new String(cipher.doFinal(code));
System.out.println(msg.equals(msg1));
}
}