使用java将RSA公钥导出到PEM String

fer*_*hur 5 java android bouncycastle spongycastle

因此,我使用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();
Run Code Online (Sandbox Code Playgroud)

现在,你可能会告诉我,我不知道如何构建PemObject或如果有更简单的方法来做到这一点.

当使用Bouncy Case时,我曾经这样做过

    StringWriter writer = new StringWriter();
    PEMWriter pemWriter = new PEMWriter(writer);
    pemWriter.writeObject(keyPair.getPublic());
    pemWriter.flush();
    pemWriter.close();
    return writer.toString();
Run Code Online (Sandbox Code Playgroud)

但由于某些原因,PongWriter类在Spongy Castle中不存在

fer*_*hur 9

好的,这可能不是最聪明的方式(或者可能是?),但是在检查完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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)


Mar*_* C. 5

您可能遇到问题的原因是 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();
    }
}
Run Code Online (Sandbox Code Playgroud)