package com.breakfastapi.util;
import org.bouncycastle.asn1.ASN1Encodable;
import org.bouncycastle.asn1.ASN1Primitive;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.springframework.util.Base64Utils;
import javax.crypto.Cipher;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
public class EncrypRSA {
/**
* 算法名称
*/
private static final String ALGORITHM = "RSA";
/**
* 默认密钥大小
*/
private static final int KEY_SIZE = 4096;
/**
* 密钥对生成器
*/
private static KeyPairGenerator keyPairGenerator = null;
private static KeyFactory keyFactory = null;
/**
* 缓存的密钥对
*/
private static KeyPair keyPair = null;
/**
* Base64 编码/解码器 JDK1.8
*/
private static Base64.Decoder decoder = Base64.getDecoder();
private static Base64.Encoder encoder = Base64.getEncoder();
public static final String PEM_CODE_PUB = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAkxmIHf7Wz9KEvPruZxWOION1CM4mUYosxqnyyUOM7vJq4LuvOfyT7IkU4R7VVUlype3DtF7Ck56i5UOQA5WsvoyBReIpr8QEAKD9su+ZJLZPf3ihyjiTnPMX3dnsb6Xw49lkWfOdfNUDLR/3TrnfnIcfox26jiH+BEbowd4No2nezdBi+eJihYudnBkYa4ullCAi1twislEc3get95A37HXnc0+sHJPwOGkedl6aR4jdGBSCqzo1WCsK0vhhA5xhbNqYR4QhDPvLQXwOSK8YH4DPaP8F3cxc/FKx+KunD9Nul1Em3ZBlslbTc8bCU2x3uq9hhAKdMOmCnR+ioOyXMma2RTRHBNzXEm2eT7w/lLYpOhc627cQy1l0TNejAxN3Wri2pUB42uhtT15hqzwCCQxNqTKh4/wx2MwGK7j6zmDR2RJUcdNMou+wQv0oIVmjNQvE1tvD7ZbUjnek4jn7Ga8/jIivpda6vPls5ifzIrZ75pRxgMnnYDTt/rT08LJ7hxtCGes+qvDIW7FU4kNYwsIBJvz3RzDcNBYwgPC3SpNE5JxvJktLGDaIga1q16n8PM9fdRi/FGocMgvquD+Mk4piB17zCyAT+N/wdXPltAyR5uqCCpmeRodVFgBPUJkiZe97UKwbQlpP0jkqYzH2byuchjSnYJQ6X6tpJ2lLDjUCAwEAAQ==";
public static final String PEM_CODE_PRI = "MIIJQQIBADANBgkqhkiG9w0BAQEFAASCCSswggknAgEAAoICAQCTGYgd/tbP0oS8+u5nFY4g43UIziZRiizGqfLJQ4zu8mrgu685/JPsiRThHtVVSXKl7cO0XsKTnqLlQ5ADlay+jIFF4imvxAQAoP2y75kktk9/eKHKOJOc8xfd2exvpfDj2WRZ85181QMtH/dOud+chx+jHbqOIf4ERujB3g2jad7N0GL54mKFi52cGRhri6WUICLW3CKyURzeB633kDfsdedzT6wck/A4aR52XppHiN0YFIKrOjVYKwrS+GEDnGFs2phHhCEM+8tBfA5IrxgfgM9o/wXdzFz8UrH4q6cP026XUSbdkGWyVtNzxsJTbHe6r2GEAp0w6YKdH6Kg7JcyZrZFNEcE3NcSbZ5PvD+Utik6FzrbtxDLWXRM16MDE3dauLalQHja6G1PXmGrPAIJDE2pMqHj/DHYzAYruPrOYNHZElRx00yi77BC/SghWaM1C8TW28PtltSOd6TiOfsZrz+MiK+l1rq8+WzmJ/MitnvmlHGAyedgNO3+tPTwsnuHG0IZ6z6q8MhbsVTiQ1jCwgEm/PdHMNw0FjCA8LdKk0TknG8mS0sYNoiBrWrXqfw8z191GL8UahwyC+q4P4yTimIHXvMLIBP43/B1c+W0DJHm6oIKmZ5Gh1UWAE9QmSJl73tQrBtCWk/SOSpjMfZvK5yGNKdglDpfq2knaUsONQIDAQABAoICAAjvexo/WbMkGZYVNBgk8g5DYt+XDjLTzuZ+elYJeW0mYqGmJP3DvwSWSyNlqRXWMVWs/L9fJjirYT/F++CL3gNxK4UgOOIJaSjUnrSY41ecj3Wx0Tokd6sIBUIfs8IQdXKRyQvBxaZIljnOgEpS9ide+egBrUxm+jQuToNARtnPW45rAygkvVFZasiJqbcWs4cs8JDWrHDihntiQgoQw6TkgJu7kjvmLKhwkj4kfwCraqrEzC80iPsDGlQ4bEQ44p4nJSrq9ssAHJesvn1hzXhUbcT2ANg5Ssi1CUSOwMYwVL5yWocI93R+27djsng41YkMkELhmcTX2mxK+KkH1iNNDVevBWu7TEIWuCPjmGPQRYCNZ+XPCS6c8K18I84LcuvzrpvzFARfcbA1JXRFRp+lyzZ3mu7WzEC4cy/IQuRis7qP+cQDIyT8+f5SPSGtKXQ5aDHlvezbzS2H2jXWaNl0UQwh6qlB3R0UVH0BX6aVkfCVFGI1eBr03Y2toQJXYw7gMB85QMeXO957Q4vh2TGM18pS1/3cfA8klIjHKpTNLcyAox//tx6DvoPSrpYKyzI/ghPF6AOaJ7zJpqn+qK8naPXC3dF3abva2HICnbqx+aBzBCZg6l/+FuPQR2Whm63OoN6bmIYNKdSUTWZHALs2/n1KGGnXxShD3XLIXFhhAoIBAQDIdRa0GO2IjNRNJ0gGiT94lKNYqVJ0uj6DAc7BClgFA3g126TEvPkIs9gyfCGEmoMcuaQq6XoVBC2khPvFEKbEER3VGiJ7pe/b5LSP6t0gJ482zuwjsGxrOKX4EDkIgzjrJkJWEJ1KCNFNpcY/6fkT31amDB3Uzj0t9aniSKivpr/Cl9eW9J14caiOcVRrfPNF/WII/Z7QPpJQTN80eWjY3IdVlR7gXPdl65Oul6si7+3PwR0fHFxlSYbvzXAWK4b4SWuyEpnIwNblxrPUt8y1DWjVUC/thwWaFgmy6onuYbBme9caa7T1gOg8QoZ85QRaqWMLYLhDZMSRhtpMt9VtAoIBAQC726kLIyzTSz8oOy/aeh3lNFW8zaXhG9yiBQRvIFdACMpbl9ONzk8ZZwxe6aBvANURq0gMUxqhuPwyw5mT7XT/dFHMF+hEWXXqQUfN7PRWmuAZ/2ocucKFstgIwsmxIn014x2i6WxyTlCqlXWR8/HNyofkTWHPM7teZIW/ZsTd5OcIefBxva8RnQEAa1uYYmBMRzcN7zHlaWAj7K0CDel10cgPYUlnxYliZD1221vEgj36AMb3p+UWCPIkce496cZHXalBQaazI9nagWn4Md7fX8+lIth7TIEjVbCXhjh8wSHvMzm/hu8YCP+WBLKwoWIWnJBg61kD7NFfnAm7VkbpAoIBACb4hHps4jkKz/dT7K/AnQNPOlZxTKN+1cpYXp6u6R/IZeVqlyTcbDnh5OUjtsx10YmTGbRyAZb2Yf07EUtlilZR0Y/tbcjGINSKKQRVr7mhlzkbj1L86IcL01BfrwbVpAorPPhIcJvFDRPgZ6NjVFYltE3By0bk9YXq3aUtZQYJD/y/0lz5n2ecCR3wMG5ZM15m/VksHWT01TMhTr9/3v9SGEluHTuXN02sN+DYgZ/gL0aVj5jNxbS3T7FtKh5VRf8dHv/Wl+ksfFrdf3aaaQTF35yg40B1YIRtRmNvL3OVsFqsNsxfJiYYco3MjSLYzzjk92lt20TW4VQ9eFEz6B0CggEAZAKbSiydzpc+tmJcJYnhpIZqJqus5dz5ZuAY7jhfet2zLXP00ofFIJb1xQnHuZDN3iw7nSQZB4P97+CmQFSodt8sNOV9Z/XgiqfaXE0L/5dQO0b47PYQEzGVRYS976mW0ztoKbTvYSNEWqxa/SrLzm1GT0rLCY5W7/fAJJfHswIL5T1VvpfnPg9B20FMcCHfdnxrWOXAwIuK/VUg/fj+ExVt1pJKjA5kB5eqCT7a6hEUgaYsRuiBU2vLzY9B8IAmaRP56Z3T64bokiVXjyStrGnLl/SnH20pSvBxpRl1tST0te2ljst9OmR//RPfNZ2VJMiRLKfeqfJHvQjLPYq/EQKCAQBf3gg+qa8Pl0Og0qP8b3Zho4E8Hgw5lu3JUvwPYVzRldF7ga4vQjR2BMxxVlu+PmQsZG7MZRMlpj97wMtN5bHF+N8I5Sl5SnVNpbLoxOzx26kiUS1M0n7ZvzOqb+6ivd3ncCMZ4dALrnPRpsnLSWliZ1swu79SGLTSXq5Vrlh3eMTInrWzFH+jwN3QkhzYsySMNnpqtgxwXWBWToIlUYCzywf5vZtFu3nR5TZgU/uIdIPP6ozy3YuphUlI8ERWhX21G8+HLYVo/NHoYgys2JKOigEcj1cDLUX/bOG+/PqB52zmLHpKT7lfJHVp5zVeTZ8mEYpjD1fKBJ3s9MHDiY2g";
/** 初始化密钥工厂 */
static {
try {
keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
keyFactory = KeyFactory.getInstance(ALGORITHM);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
private EncrypRSA() {
}
public static synchronized Map<String, Object> generateKeyPair() {
try {
keyPairGenerator.initialize(KEY_SIZE, new SecureRandom(UUID.randomUUID().toString().replaceAll("-", "").getBytes()));
keyPair = keyPairGenerator.generateKeyPair();
} catch (Exception e) {
e.printStackTrace();
}
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
String publicKeyString = encoder.encodeToString(rsaPublicKey.getEncoded());
String privateKeyString = encoder.encodeToString(rsaPrivateKey.getEncoded());
Map<String, Object> keyPairMap = new HashMap<String, Object>();
keyPairMap.put("public", publicKeyString);
keyPairMap.put("private", privateKeyString);
System.out.println(publicKeyString);
System.out.println(privateKeyString);
return keyPairMap;
}
public static synchronized Map<String, Object> generatePKS1KeyPair() {
Map<String, Object> keyPairMap = new HashMap<String, Object>();
try {
keyPairGenerator.initialize(KEY_SIZE, new SecureRandom(UUID.randomUUID().toString().replaceAll("-", "").getBytes()));
keyPair = keyPairGenerator.generateKeyPair();
PublicKey pub = keyPair.getPublic();
byte[] pubBytes = pub.getEncoded();
SubjectPublicKeyInfo spkInfo = SubjectPublicKeyInfo.getInstance(pubBytes);
ASN1Primitive pubprimitive = spkInfo.parsePublicKey();
byte[] publicKeyPKCS1 = pubprimitive.getEncoded();
System.out.println(publicKeyPKCS1.toString());
PrivateKey priv = keyPair.getPrivate();
byte[] privBytes = priv.getEncoded();
PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(privBytes);
ASN1Encodable encodable = pkInfo.parsePrivateKey();
ASN1Primitive priprimitive = encodable.toASN1Primitive();
byte[] privateKeyPKCS1 = priprimitive.getEncoded();
System.out.println(privateKeyPKCS1.toString());
keyPairMap.put("public", publicKeyPKCS1);
keyPairMap.put("private", privateKeyPKCS1.toString());
} catch (Exception e) {