使用Java将RSA公钥导出为PEM字符串

7

我正在使用Spongy Castle(Android)生成一个PEM编码的字符串,用于RSA公钥,该公钥将上传到服务器。目前我的操作如下:

    PublicKey publicKey = keyPair.getPublic();
    StringWriter writer = new StringWriter();
    PemWriter pemWriter = new PemWriter(writer);
    pemWriter.writeObject(new PemObject("RSA PUBLIC KEY", publicKey.getEncoded()));
    pemWriter.flush();
    pemWriter.close();
    return writer.toString();

现在你可以看出来,我不确定如何构建PemObject,或者是否有更简单的方法来完成这个任务。
当使用Bouncy Castle时,我曾经像这样做:
    StringWriter writer = new StringWriter();
    PEMWriter pemWriter = new PEMWriter(writer);
    pemWriter.writeObject(keyPair.getPublic());
    pemWriter.flush();
    pemWriter.close();
    return writer.toString();

但由于某种原因,在Spongy Castle中不存在PEMWriter类


在使用Base64进行编码后,publicKey.getEncoded的格式是什么?它是PEM格式吗? - Charlesjean
不使用多年未维护的SpongyCastle,是否有可能完成这个任务? - gmk57
2个回答

11

好的,这可能不是最聪明的方法(或者也许是?),但在查看 PEMWriter 的源代码后,该类基本上在后台执行以下操作:

  1. 调用 writeObject 时,它创建一个 MiscPEMGenerator 的实例
  2. MiscPEMGenerator 然后通过检查构造函数参数的类型来创建 PemObject ,以下是 MiscPEMGenerator 源代码的摘录:

    private PemObject createPemObject(Object o){
      ...
      else if (o instanceof PublicKey)
      {
          type = "PUBLIC KEY";
    
          encoding = ((PublicKey)o).getEncoded();
      }
      ...
      return new PemObject(type, encoding);
    }
    

MiscPEMGenerator代码中可以看出,我需要更改的仅仅是类型参数,从"RSA PUBLIC KEY"改为"PUBLIC KEY"。这是最终的代码。

PublicKey publicKey = keyPair.getPublic();
StringWriter writer = new StringWriter();
PemWriter pemWriter = new PemWriter(writer);
pemWriter.writeObject(new PemObject("PUBLIC KEY", publicKey.getEncoded()));
pemWriter.flush();
pemWriter.close();
return writer.toString();

5
你可能遇到问题的原因是 Android 在 JCA 提供程序中内部使用了 Bouncy Castle。但是随着不同 Android 版本的发布,所包含的版本也有所不同。
你可能会对 Spongy Castle 项目感兴趣,该项目“简单地”在不同的包中重新打包了 Bouncy Castle,以便您可以将自己的库与 Android 应用程序一起使用。
使用最新版本(1.51.0.0)的 Spongy Castle,以下内容按照预期工作(在我的工作站上,没有设备可用于测试)。
import java.security.PublicKey;
import org.spongycastle.openssl.jcajce.JcaPEMWriter;

class PEMConverter {

    public static String toPEM(PublicKey pubKey) {
        StringWriter sw = new StringWriter();
        JcaPEMWriter pemWriter = new JcaPEMWriter(sw);
        pemWriter.writeObject(pubKey);
        pemWriter.close();
        return sw.toString();
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接