6

因此,我使用 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 类

4

2 回答 2

10

好的,所以这可能不是最聪明的方法(或者可能是?),但是在查看了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();
于 2014-08-05T02:39:59.580 回答
4

您可能遇到问题的原因是 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();
    }
}
于 2014-08-09T12:29:12.560 回答