如何为PKCS#8标准生成PEM

时间:2015-01-26 20:50:11

标签: android openssl bouncycastle

我的目标是在不使用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

1 个答案:

答案 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;
    }