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

时间:2014-08-05 01:08:12

标签: 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();

现在您可能会告诉我,我不确定如何构建PemObject或者是否有更简单的方法来执行此操作。

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

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

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

2 个答案:

答案 0 :(得分:8)

好的,这可能不是最聪明的方式(或者可能是?),但在查看了PEMWriter的来源之后,这个课程基本上是这样做的:

  1. 在致电writeObject时,会创建MiscPEMGenerator
  2. 的实例
  3. 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);
    }
    
  4. 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();
    

答案 1 :(得分:3)

您可能遇到问题的原因是因为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();
    }
}