首页 > Java > java教程 > 如何从 PEM 编码文件中提取 RSA 私钥?

如何从 PEM 编码文件中提取 RSA 私钥?

Mary-Kate Olsen
发布: 2024-11-09 04:52:02
原创
517 人浏览过

How to Extract an RSA Private Key from a PEM Encoded File?

从 PEM 编码的私钥文件获取 RSA 私钥

在这种情况下,提供的私钥以 PEM 格式编码,特别是使用 PKCS#1。要从此 PEM 编码文件中检索 RSA 私钥,您可以使用以下方法之一:

方法 1:使用 DER 序列解析修改代码

提供的Java 代码读取 PEM 编码密钥并尝试对其进行解码。下面建议的修改将允许它解析 PKCS#1 格式的私钥:

...
// Skip version seq[0];
BigInteger modulus = seq[1].getBigInteger();
BigInteger publicExp = seq[2].getBigInteger();
BigInteger privateExp = seq[3].getBigInteger();
...
RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);

KeyFactory factory = KeyFactory.getInstance("RSA");
return factory.generatePrivate(keySpec);
...
登录后复制

方法 2:使用 Sun 提供程序改进代码

另一种解决方案是利用 sun.security 提供程序进行 DER 序列解析,并利用 java.security 包进行密钥生成。这种方法提供了更简洁且符合 FIPS 标准的实现:

import java.io.File;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.PrivateKey;

public static PrivateKey pemFileLoadPrivateKeyPkcs1(File pemFileName) throws GeneralSecurityException, IOException {
    // PKCS#1 format
    String PEM_RSA_PRIVATE_START = "-----BEGIN RSA PRIVATE KEY-----";
    String PEM_RSA_PRIVATE_END = "-----END RSA PRIVATE KEY-----";

    Path path = Paths.get(pemFileName.getAbsolutePath());
    String privateKeyPem = new String(Files.readAllBytes(path));
    privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");
    privateKeyPem = privateKeyPem.replaceAll("\s", "");

    DerInputStream derReader = new DerInputStream(Base64.getDecoder().decode(privateKeyPem));
    DerValue[] seq = derReader.getSequence(0);

    if (seq.length < 9) {
        throw new GeneralSecurityException("Could not parse a PKCS1 private key.");
    }

    // Skip version seq[0];
    BigInteger modulus = seq[1].getBigInteger();
    BigInteger publicExp = seq[2].getBigInteger();
    BigInteger privateExp = seq[3].getBigInteger();
    BigInteger prime1 = seq[4].getBigInteger();
    BigInteger prime2 = seq[5].getBigInteger();
    BigInteger exp1 = seq[6].getBigInteger();
    BigInteger exp2 = seq[7].getBigInteger();
    BigInteger crtCoef = seq[8].getBigInteger();

    RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);
    KeyFactory factory = KeyFactory.getInstance("RSA");
    return factory.generatePrivate(keySpec);
}
登录后复制

此代码将成功从提供的 PEM 文件中读取并解析私钥,并为您提供 RSA 私钥对象。

以上是如何从 PEM 编码文件中提取 RSA 私钥?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板