我的目标是在不使用Spongy / Bouncycastle的情况下在Android上阅读私钥。 Android支持开箱即用的PKCS#8(但不支持PKCS#1)。
我的服务器端代码(使用Bouncycastle)生成密钥。
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
kpg.initialize(2048, new SecureRandom());
KeyPair pair = kpg.generateKeyPair();
KeyFactory factory = KeyFactory.getInstance("RSA", "BC");
PrivateKey privateKey = factory.generatePrivate(new PKCS8EncodedKeySpec(pair.getPrivate().getEncoded()));
ASN1InputStream asn1input = new ASN1InputStream(privateKey.getEncoded());
PrivateKeyInfo info = PrivateKeyInfo.getInstance(asn1input.readObject());
// write out PEM using Bouncycastle's PEMWriter
这会生成PKCS#1,无法在Android中读取。但是,我可以拿那个键然后运行
openssl pkcs -topk8 -in file.pem -out newfile.pem -nocrypt
我可以从Android中读取生成的文件。
我希望能够以编程方式执行此操作,而不是使用" openssl"。 Bouncycastle的示例和文档很少。
我的理解键始于----- BEGIN RSA私钥-----是PKCS#1和----- BEGIN私钥-----是PKCS#8
答案 0 :(得分:0)
这似乎有效 - 如果你有更好的方法,我很乐意知道。
public static String generateKeyPair() {
try {
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "BC");
kpg.initialize(2048, new SecureRandom());
KeyPair pair = kpg.generateKeyPair();
PKCS8EncodedKeySpec keyspec = new PKCS8EncodedKeySpec(pair.getPrivate().getEncoded());
StringBuilder sb = new StringBuilder();
sb.append("-----BEGIN PRIVATE KEY-----");
sb.append(new String(Base64.encode(keyspec.getEncoded())));
sb.append("-----END PRIVATE KEY-----");
return new String(Base64.encode(sb.toString().getBytes()));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
return null;
}