【问题标题】:Export RSA public key to PEM String using java使用java将RSA公钥导出到PEM字符串
【发布时间】:2014-09-27 14:01:40
【问题描述】:

所以我使用 Spongy Castle (Android) 为将上传到服务器的 RSA 公钥生成 PEM 编码字符串。 这就是我目前正在做的事情:

    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 Case 时,我曾经这样做过

    StringWriter writer = new StringWriter();
    PEMWriter pemWriter = new PEMWriter(writer);
    pemWriter.writeObject(keyPair.getPublic());
    pemWriter.flush();
    pemWriter.close();
    return writer.toString();

但由于某种原因,海绵城堡中不存在 PEMWriter 类

【问题讨论】:

  • 我们使用Base64编码后的publicKey.getEncoded是什么格式?是pem吗?
  • 没有 SpongyCastle(多年未维护)是否可以做到这一点?

标签: java android bouncycastle spongycastle


【解决方案1】:

好的,所以这可能不是最聪明的方法(或者可能是?),但是在查看了 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();

【讨论】:

    【解决方案2】:

    您可能遇到问题的原因是 Android 在内部使用 Bouncy Castle 作为 JCA 提供程序。但包含的版本因各种 Android 版本而异。

    您可能对Spongy Castle 项目感兴趣,该项目“简单地”将 Bouncy Castle 重新打包到不同的包中,以便您可以在 Android 应用程序中包含自己的库。

    使用 Spongy Castle 的最新版本 (1.51.0.0),以下工作按预期工作(在我的工作站上,手头没有设备可以在设备上测试):

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2021-03-30
      • 2014-07-07
      • 2018-05-28
      • 2018-01-13
      • 1970-01-01
      • 2014-10-29
      • 2016-03-16
      • 2018-05-02
      相关资源
      最近更新 更多