如何在 Java 中将此私钥读取为 ECPrivateKey?

发布于 2025-01-12 11:45:07 字数 1765 浏览 3 评论 0原文

我有以下私钥,并尝试使用 BouncyCaste 和以下代码将其读取为 ECPrivateKey 的实例。但是,我遇到了空指针异常:

Key:

-----BEGIN EC PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgtqnvswtIdNxKy07B
D3Y9vvlpwvSDqWCvyWmWTNea2ImgCgYIKoZIzj0DAQehRANCAATa0LtPPOI+De/u
RY1vSxR7gFGSoyjaDZyif/sWujLZWEj6Rc2IEl62VfWQD3GeYCEEKP9qzpOGyO+b
HWR98kNd
-----END EC PRIVATE KEY-----

Parsing code:

private PrivateKey readPemAsPrivateKey(final String pem) throws IOException {
    final PEMParser pemParser = new PEMParser(new StringReader(pem));
    final Object parsedPem = pemParser.readObject();
    if (!(parsedPem instanceof PEMKeyPair)) {
        throw new IOException("Attempted to parse PEM string as a keypair, but it's actually a " + parsedPem.getClass());
    }

    Security.addProvider(new BouncyCastleProvider());

    final JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

    return converter.getKeyPair((PEMKeyPair) parsedPem).getPrivate();
}

The exception:

! java.lang.NullPointerException: null
! ... 29 common frames omitted
! Causing: org.bouncycastle.openssl.PEMException: unable to convert key pair: null
! at org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair(Unknown Source) ~

有谁知道如何将此密钥读取为 ECPrivateKey 对象?

注意:

当我运行以下 openssl 命令时,它会以 Bouncycastle 接受的格式吐出密钥。不幸的是,在生产中我无法选择预处理密钥——我必须按原样使用密钥并在代码中处理它。

$ openssl ec -inform PKCS8 -in T5TK5598S7.p8 
read EC key
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIGaopmcUKDBihelMJbKUyRmaR6F3Eo90EZaqZJ3/mBr0oAoGCCqGSM49
AwEHoUQDQgAEnYaxPG+o57xM5o/M5QNn0ocwlw12ZNVWFEo9tKDQ7Jz5Gz/0eMcP
mEhm5msFFpWgrY0/T92MfwByuaLws/rM3w==
-----END EC PRIVATE KEY-----

I have the following private key, and am attempting to read it as an instance of ECPrivateKey using BouncyCaste with the following code. However, I'm getting a null pointer exception:

Key:

-----BEGIN EC PRIVATE KEY-----
MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgtqnvswtIdNxKy07B
D3Y9vvlpwvSDqWCvyWmWTNea2ImgCgYIKoZIzj0DAQehRANCAATa0LtPPOI+De/u
RY1vSxR7gFGSoyjaDZyif/sWujLZWEj6Rc2IEl62VfWQD3GeYCEEKP9qzpOGyO+b
HWR98kNd
-----END EC PRIVATE KEY-----

Parsing code:

private PrivateKey readPemAsPrivateKey(final String pem) throws IOException {
    final PEMParser pemParser = new PEMParser(new StringReader(pem));
    final Object parsedPem = pemParser.readObject();
    if (!(parsedPem instanceof PEMKeyPair)) {
        throw new IOException("Attempted to parse PEM string as a keypair, but it's actually a " + parsedPem.getClass());
    }

    Security.addProvider(new BouncyCastleProvider());

    final JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");

    return converter.getKeyPair((PEMKeyPair) parsedPem).getPrivate();
}

The exception:

! java.lang.NullPointerException: null
! ... 29 common frames omitted
! Causing: org.bouncycastle.openssl.PEMException: unable to convert key pair: null
! at org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter.getKeyPair(Unknown Source) ~

Does anyone know how I can read this key as an ECPrivateKey object?

Note:

When I run the following openssl command, it spits the key out in a format that Bouncycastle does accept. Unfortunately, in production I don't have the option to pre-process the key--I have to work with the key as-is and process it in code.

$ openssl ec -inform PKCS8 -in T5TK5598S7.p8 
read EC key
writing EC key
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIGaopmcUKDBihelMJbKUyRmaR6F3Eo90EZaqZJ3/mBr0oAoGCCqGSM49
AwEHoUQDQgAEnYaxPG+o57xM5o/M5QNn0ocwlw12ZNVWFEo9tKDQ7Jz5Gz/0eMcP
mEhm5msFFpWgrY0/T92MfwByuaLws/rM3w==
-----END EC PRIVATE KEY-----

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文