【问题标题】:Can org.bouncycastle.openssl.PEMReader read java.security.PrivateKey?org.bouncycastle.openssl.PEMReader 可以读取 java.security.PrivateKey 吗?
【发布时间】:2012-01-05 19:44:58
【问题描述】:

我有以下代码:

PrivateKey key = null;
X509Certificate cert = null;
KeyPair keyPair = null;

final Reader reader = new StringReader(pem);
try {
    final PEMReader pemReader = new PEMReader(reader, new PasswordFinder() {
        @Override
        public char[] getPassword() {
            return password == null ? null : password.toCharArray();
        }
    });

    Object obj;
    while ((obj = pemReader.readObject()) != null) {
        if (obj instanceof X509Certificate) {
            cert = (X509Certificate) obj;
        } else if (obj instanceof PrivateKey) {
            key = (PrivateKey) obj;
        } else if (obj instanceof KeyPair) {
            keyPair = (KeyPair) obj;
        }
    }
} finally {
    reader.close();
}

它会读取 PrivateKey 吗?换句话说,任何 PEM 文件都可以只包含纯私钥吗?如果是,您能否提供一个示例 PEM 文件?

提前感谢。

【问题讨论】:

标签: java cryptography openssl bouncycastle public-key-encryption


【解决方案1】:

一个文件可以只包含一个私钥,它可以是加密的或明文的。 OpenSSL 一直这样做。

不过,我查看了PEMReader 的代码,看起来它会从 RSA 私钥返回 KeyPair(私钥文件包含对应公钥的所有必要信息)。看起来它永远不会简单地从 readObject() 返回一个 PrivateKey

这是来自 OpenSSL 的未加密 1024 RSA 私钥。

-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC/oBTZGo0cgHHdZD8LgDpUVOPjsI58PrTJPtrlVT7kyznmzFEt
TW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7AzVhuHkChgGh9eZmphsnvq1W
LjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn1wrGrg00jMvKP5kcpwIDAQAB
AoGBAI9oJ/IKEszfu1cqLJxYzE5McXf2q8uDyhxJs9upHjZveNem1KGIr+y0B4gd
6nSwiBUidu7nxb+tAWLd7IQKBnhKC3AtGNT7qTwnXelKsJhaok2+kEEuzjQYnmsP
AreEsAi/FlHj/kAyjGBoQ4QLrx1sp2cDcBTP78PeJfZvm/RxAkEA7zVuumjrz3ui
zmBzQI1pwD9F0REyE5zJfgUz5iDQbK2RRPhcQ9LCZdEJRU0vdWTBmmgadYwpg0uG
hYFwCy7PWwJBAM0Tk+pMRwke0m4oiI4mKh0u4enHXE2RFMUtTMjGILHt8+m4Q7rd
KGfO9/ylK82LhbT0Z/BeszbnneaAefkxFaUCQQDephVSXKZgkOuQvCWKSBXOYxZQ
6nh52M2TBrSv1ospHMTCNYlrd5iJvG+smZM66XVqistV7ggVtQ6Y5Umsnv1RAkBW
l/K4V1cTcdFXNIRcyZ60zewUw9qk4iMME1G94XNCzoBU6zqmN+Zs1wb9xlzVoRln
TGBrLgGsqGaTQyK9500FAkBuKohFvOgFHSKOskiVu/swByWZANEZsoEPUx7V6vXH
Tk+qftY64tt4AazHPVyVtsj1oqOv3zbulfnotFvU1nmp
-----END RSA PRIVATE KEY-----

这是对应的公钥:

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/oBTZGo0cgHHdZD8LgDpUVOPj
sI58PrTJPtrlVT7kyznmzFEtTW9cqxlw6EOo09tTTrjikLDA2M5xzejbLGPb8sa7
AzVhuHkChgGh9eZmphsnvq1WLjuXCk5yWOR9ziaBKKFeNXOsdvDp3eMDM+wz3vzn
1wrGrg00jMvKP5kcpwIDAQAB
-----END PUBLIC KEY-----

KeyStore 用于在 Java 应用程序中携带公钥、私钥和对称密钥。大多数 Java 应用程序以 PKCS #8 编码(不是the same as the OpenSSL format)存储私钥,而公钥用SubjectPublicKeyInfo 结构表示(与 OpenSSL 相同)。 p>

【讨论】:

  • 感谢您的回答。您的私钥样本还包含公钥,因此它是一个密钥对。您可以使用以下命令提取公钥:openssl pkey -inform PEM -pubout -outform PEM。我想知道是否可以有一个只有纯私钥的 PEM,没有关于公钥的信息。
  • @Martin 实际上,我的样本包含的是RSAPrivateKey,定义为 PKCS #1。正如我所说,它确实包含公共指数(以及中国剩余定理值),以促进公共密钥的恢复。 PEMReader(或 OpenSSL 实用程序)可以读取的任何私钥都必须采用这种标准格式,尽管它可以包含在 PKCS #8 或 PEM 包装器中。 SSH2 的一些实现不寻常,因为它们不使用 PKCS #1 密钥。 PEMReader 将永远返回PrivateKey;如果私钥不是 PKCS #1 格式,它将引发异常。
猜你喜欢
  • 1970-01-01
  • 2014-04-08
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2012-01-25
  • 2020-05-18
  • 2021-05-01
  • 1970-01-01
相关资源
最近更新 更多