所以我使用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类
答案 0 :(得分:8)
好的,这可能不是最聪明的方式(或者可能是?),但在查看了PEMWriter
的来源之后,这个课程基本上是这样做的:
writeObject
时,会创建MiscPEMGenerator
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();
答案 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();
}
}