RSA如何无视PEM文件格式直接读取PEM文件为PrivateKey和PublicKey

这篇文章给大家介绍RSA如何无视PEM文件格式直接读取PEM文件为PrivateKey和PublicKey,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

创新互联是一家专注于网站制作、做网站与策划设计,金山网站建设哪家好?创新互联做网站,专注于网站建设10多年,网设计领域的专业建站公司;建站业务涵盖:金山等地区。金山做网站价格咨询:028-86922220

 RSA无视PEM文件格式(pkcs#1,pkcs#8,有无密码 )直接读取PEM文件为PrivateKey,PublicKey

import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMDecryptorProvider;
import org.bouncycastle.openssl.PEMEncryptedKeyPair;
import org.bouncycastle.openssl.PEMKeyPair;
import org.bouncycastle.openssl.PEMParser;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.bouncycastle.openssl.jcajce.JceOpenSSLPKCS8DecryptorProviderBuilder;
import org.bouncycastle.openssl.jcajce.JcePEMDecryptorProviderBuilder;
import org.bouncycastle.operator.InputDecryptorProvider;
import org.bouncycastle.operator.OperatorCreationException;
import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo;
import org.bouncycastle.pkcs.PKCSException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;
import java.io.StringReader;
import java.security.Key;
import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;

/**
 * RSA无视PEM文件格式(pkcs#1,pkcs#8,有无密码 )直接读取PEM文件为PrivateKey,PublicKey
 */
public class RSAUtil {
    private final static Logger logger = LoggerFactory.getLogger(RSAUtil.class);

    static {
        java.security.Security.addProvider(
                new org.bouncycastle.jce.provider.BouncyCastleProvider()
        );

    }

    public static PrivateKey privateKey(String pemString, String password) {
        try {
            return (PrivateKey) parseKey(pemString, password);
        } catch (IOException e) {
            logger.error("privateKey error", e);
            e.printStackTrace();
        }
        return null;
    }

    public static PrivateKey privateKey(String pemString) {
        try {
            return (PrivateKey) parseKey(pemString, null);
        } catch (IOException e) {
            logger.error("privateKey error", e);
        }
        return null;
    }

    public static PublicKey publicKey(String pemString) {
        try {
            return (PublicKey) parseKey(pemString, null);
        } catch (IOException e) {
            logger.error("publicKey error", e);
        }
        return null;
    }

    /**
     * Parses a Key instance from a PEM representation.
     * 

     * When the provided key is encrypted, the provided pass phrase is applied.      *      * @param pemString  a PEM representation of a private key (cannot be null or empty)      * @param passPhrase optional pass phrase (must be present if the private key is encrypted).      * @return a  Key instance (never null)      */     public static Key parseKey(String pemString, String passPhrase) throws IOException {         if (passPhrase == null) {             passPhrase = "";         }         try (StringReader reader = new StringReader(pemString); //              PEMParser pemParser = new PEMParser(reader)) {             final Object object = pemParser.readObject();             final JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider(BouncyCastleProvider.PROVIDER_NAME);             final KeyPair kp;             if (object instanceof PEMEncryptedKeyPair) {                 // Encrypted key - we will use provided password                 final PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(passPhrase.toCharArray());                 kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));             } else if (object instanceof PKCS8EncryptedPrivateKeyInfo) {                 // Encrypted key - we will use provided password                 try {                     final PKCS8EncryptedPrivateKeyInfo encryptedInfo = (PKCS8EncryptedPrivateKeyInfo) object;                     final InputDecryptorProvider provider = new JceOpenSSLPKCS8DecryptorProviderBuilder().build(passPhrase.toCharArray());                     final PrivateKeyInfo privateKeyInfo = encryptedInfo.decryptPrivateKeyInfo(provider);                     return converter.getPrivateKey(privateKeyInfo);                 } catch (PKCSException | OperatorCreationException e) {                     throw new IOException("Unable to decrypt private key.", e);                 }             } else if (object instanceof PrivateKeyInfo) {                 return converter.getPrivateKey((PrivateKeyInfo) object);             } else if (object instanceof SubjectPublicKeyInfo) {                 return converter.getPublicKey((SubjectPublicKeyInfo) object);             } else {                 // Unencrypted key - no password needed                 kp = converter.getKeyPair((PEMKeyPair) object);             }             return kp.getPrivate();         }     } }

关于RSA如何无视PEM文件格式直接读取PEM文件为PrivateKey和PublicKey就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。


网站栏目:RSA如何无视PEM文件格式直接读取PEM文件为PrivateKey和PublicKey
转载来源:http://azwzsj.com/article/iichsc.html