import com.sun.org.apache.xml.internal.security.utils.Base64;
import javafx.util.Pair;
import org.junit.Before;
import org.junit.Test;
import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
/**
* @author huwenlong
* @date 2020/9/20 11:31
*/
public class Rsa {
String type = "RSA";
private KeyPairGenerator keyPairGenerator;
private KeyPair keyPair;
private Cipher cipher;
private KeyFactory keyFactory;
@Before
public void init() throws Exception {
// 创建密钥对生成器对象
keyPairGenerator = KeyPairGenerator.getInstance(type);
// 生成密钥对
keyPair = keyPairGenerator.generateKeyPair();
cipher = Cipher.getInstance(type);
keyFactory = KeyFactory.getInstance(type);
}
@Test
public void testRsa() throws Exception {
Pair<String, String> pair = getKeys();
// 生成公钥和私钥后通常保存在本地文件,防止每次都生成公钥私钥耗性能
String publicKey = pair.getKey();
String privateKey = pair.getValue();
System.out.println("public key:" + publicKey);
System.out.println("\nprivate key:" + privateKey);
String code = encipher("小明", privateKey);
System.out.println("\ncode:" + code);
System.out.println("\nprimary text:" + decipher(code, publicKey));
}
public Pair<String, String> getKeys() throws Exception {
// 生成私钥
PrivateKey privateKey = keyPair.getPrivate();
// 生成公钥
PublicKey publicKey = keyPair.getPublic();
// 获取私钥字节数组
byte[] privateKeyEncoded = privateKey.getEncoded();
// 获取公钥字节数组
byte[] publicKeyEncoded = publicKey.getEncoded();
// 对公私钥进行base64编码
String privateKeyString = Base64.encode(privateKeyEncoded);
String publicKeyString = Base64.encode(publicKeyEncoded);
return new Pair<>(publicKeyString, privateKeyString);
}
public String encipher(String str, String key) throws Exception {
// 创建私钥key规则
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(Base64.decode(key));
// 私钥加密
cipher.init(Cipher.ENCRYPT_MODE, keyFactory.generatePrivate(pkcs8EncodedKeySpec));
return Base64.encode(cipher.doFinal(str.getBytes()));
}
public String decipher(String str, String key) throws Exception {
// 创建公钥key规则
X509EncodedKeySpec pkcs8EncodedKeySpec = new X509EncodedKeySpec(Base64.decode(key));
// 公钥解密
cipher.init(Cipher.DECRYPT_MODE, keyFactory.generatePublic(pkcs8EncodedKeySpec));
return new String(cipher.doFinal(Base64.decode(str)));
}
}
输出
public key:MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCHnHuemLkcy2DG8CN0U6HoOXeBtwfl9cvx17Ky
wLo/5lQfIcqBmeXRw+atGcrK7wS2JRQYc0WGSugqXfQrFBRkcoUyBVyHJcp/nMRYpTmI7K9OZgeN
JDLUzZzRmz41n+HdXJ+B7mzNdsSixJsp7sm35ioj5HD4bf1MEqeWxvdb+QIDAQAB
private key:MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAIece56YuRzLYMbwI3RToeg5d4G3
B+X1y/HXsrLAuj/mVB8hyoGZ5dHD5q0ZysrvBLYlFBhzRYZK6Cpd9CsUFGRyhTIFXIclyn+cxFil
OYjsr05mB40kMtTNnNGbPjWf4d1cn4HubM12xKLEmynuybfmKiPkcPht/UwSp5bG91v5AgMBAAEC
gYBKRE2DDpqaBVtrt4mDJGYP2qDzHfyqWJEnUfxgXqHhas94+TWBAnpVBZcoB28C8iE/a1D1DvPt
VsqMoUWd7fI4QDg5nl3rT93wNOrqfEdSu9ItwzM7Dx5v5SbRcDN0Y8xaMzDQMZoy/orZhIV41D5j
UCnq4eJsyB2ZQKY4hG/+rQJBAMDIM9QUT/EAQ0km1R49dgeGu1ZwE3wJ7BfmjCEfnZf8vhpmVWol
/2GN4BCaYwzGCDxZ6TcDcf9S5cmmmUYQ54MCQQC0FN557MT935yiKrs7eqwRqs5wIDUWcTLr4w+C
xbHZdK6fSnJSUPjUvhMg/32RWy+vMmrwUsP9pvzMPDRthFnTAkBtJ+7Qwr+RAkkW/nnlqX9PO6aP
ht5BeYzI662kg7ZD/MPXRuJOPD2iCyc3v3MeJHM9WNuIXtcJbvLVfxOCbMfpAkBzjMCEc4yjagxT
ch/ZtokafQMhp0jpMZF/Ep8tRjUsV1aFF3vrndFMkPotPkMQNfaO8Eb2FeV0qOWlFyx86WPJAkA2
WuO+PJkjYkg9FCFBXIlr2qS3FPVSevPaFOsdD61ALZumPK7GeLUD0WfNafAlVqfnG1gMtWNmnicZ
+Np45TZ/
code:AjMwcHL5Fj9D0W6B8jO0MBvFPLOYpukT2ioNdZTX4lOXDFP+nOKdGh+6e8OMuS0sXp1v2xkSuOqc
EfUISkN+jZarSouFHoZepJyridp/LZsQQtE8PFsAC3VNKnnEpFw4bUFNlA4KSuNHLDAbjVMlAHcQ
/qB8dvTCl8/9RxFEXMc=
primary text:小明