使用BC从文件解析RSA私钥和公钥

本文介绍如何使用BC库从文件中解析RSA私钥和公钥。包括四种方法:加载口令保护的私钥、加载无口令保护的私钥、两种加载公钥的方法。通过这些方法,可以实现对RSA密钥的有效管理和使用。

使用BC从文件解析RSA私钥和公钥

项目地址

  • decodeEncryptedPrivateKey 从文件加载口令保护的私钥
  • decodePrivateKey 从文件加载私钥(无口令保护)
  • decodePublicKey 从文件加载公钥
  • decodePublicKey2 从文件加载公钥2

常量及静态方法:

static {
    Security.addProvider(new BouncyCastleProvider());
}

1. 从文件加载口令保护的私钥:

/**
 * 从文件加载口令保护的私钥
 *
 * @param filePath 私钥文件路径
 * @param password 口令
 * @return 私钥
 * @throws IOException               异常
 * @throws OperatorCreationException 异常
 * @throws PKCSException             异常
 */
public static PrivateKey decodeEncryptedPrivateKey(String filePath, String password) throws IOException, OperatorCreationException, PKCSException {
    try (PEMParser pemParser = new PEMParser(new FileReader(filePath))) {
        Object pem = pemParser.readObject();
        if (pem instanceof PKCS8EncryptedPrivateKeyInfo) {
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter()
                    .setProvider(BouncyCastleProvider.PROVIDER_NAME);
            PKCS8EncryptedPrivateKeyInfo keyInfo = (PKCS8EncryptedPrivateKeyInfo) pem;
            InputDecryptorProvider pkcs8Prov = new JceOpenSSLPKCS8DecryptorProviderBuilder()
                    .setProvider(BouncyCastleProvider.PROVIDER_NAME)
                    .build(password.toCharArray());
            return converter.getPrivateKey(keyInfo.decryptPrivateKeyInfo(pkcs8Prov));
        }
        throw new RuntimeException("invalid key file.");
    }
}

2. 从文件加载私钥(无口令保护)

/**
 * 从文件加载私钥(无口令保护)
 *
 * @param filePath 私钥文件路径
 * @return 私钥
 * @throws IOException 异常
 */
public static PrivateKey decodePrivateKey(String filePath) throws IOException {
    try (PEMParser pemParser = new PEMParser(new FileReader(filePath))) {
        Object pem = pemParser.readObject();
        if (pem instanceof PrivateKeyInfo) {
            JcaPEMKeyConverter converter = new JcaPEMKeyConverter()
                    .setProvider(BouncyCastleProvider.PROVIDER_NAME);
            PrivateKeyInfo keyInfo = (PrivateKeyInfo) pem;
            return converter.getPrivateKey(keyInfo);
        }
        throw new RuntimeException("invalid key file.");
    }
}

3. 从文件加载公钥

/**
 * 从文件加载公钥
 *
 * @param filePath 公钥文件路径
 * @return 私钥
 * @throws IOException 异常
 */
public static PublicKey decodePublicKey(String filePath) throws IOException {
    try (PEMParser pemParser = new PEMParser(new FileReader(filePath))) {
        JcaPEMKeyConverter converter = new JcaPEMKeyConverter()
                .setProvider(BouncyCastleProvider.PROVIDER_NAME);
        SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfo.getInstance(pemParser.readObject());
        return converter.getPublicKey(publicKeyInfo);
    }
}

4. 从文件加载公钥2

/**
 * 从文件加载公钥2
 *
 * @param filePath 公钥文件路径
 * @return 公钥
 * @throws IOException              异常
 * @throws NoSuchAlgorithmException 异常
 * @throws InvalidKeySpecException  异常
 * @throws NoSuchProviderException  异常
 */
public static PublicKey decodePublicKey2(String filePath) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
    try (PEMParser pemParser = new PEMParser(new FileReader(filePath))) {
        PemObject pemObject = pemParser.readPemObject();
        byte[] content = pemObject.getContent();
        X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(content);
        KeyFactory factory = KeyFactory.getInstance("RSA", BouncyCastleProvider.PROVIDER_NAME);
        return factory.generatePublic(pubKeySpec);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值