使用BouncyCastle使用密码加密私钥

时间:2013-01-30 05:33:31

标签: java ssl ssl-certificate bouncycastle private-key

我是BouncyCastle的新手。我有一个使用以下代码生成的私钥。

     final CertAndKeyGen keypair = new CertAndKeyGen("RSA", "SHA1WithRSA", null);
     keypair.generate(1024);
     final PrivateKey privKey = keypair.getPrivateKey();

我会使用AES或使用BouncyCastle的一些openssl支持算法使用密码对其进行加密。有人可以帮助我如何开始,在那里我找不到任何好的教程。请帮帮我。提前谢谢。

2 个答案:

答案 0 :(得分:4)

如果您只想将私钥输出到密码“12345”受保护的PEM格式化并且文件“privatekey.pem”,您可以使用此BC代码:

    JceOpenSSLPKCS8EncryptorBuilder encryptorBuilder = new JceOpenSSLPKCS8EncryptorBuilder(PKCS8Generator.PBE_SHA1_3DES);
    encryptorBuilder.setRandom(EntropySource.getSecureRandom());
    encryptorBuilder.setPasssword("12345".toCharArray());
    OutputEncryptor oe = encryptorBuilder.build();
    JcaPKCS8Generator gen = new JcaPKCS8Generator(privKey,oe);
    PemObject obj = gen.generate();

    PEMWriter pemWrt = new PEMWriter( new FileWriter("privatekey.pem"));
    pemWrt.writeObject(obj);
    pemWrt.close();

然后你可以使用openssl和

获取私钥
$ openssl rsa -in privatekey.pem -check
Enter pass phrase for privatekey.pem:
RSA key ok
writing RSA key
-----BEGIN RSA PRIVATE KEY-----
.....
-----END RSA PRIVATE KEY-----

PEMWriter的“标准”使用不会密码保护您的私钥:(

答案 1 :(得分:0)

如果您希望使用AES-256而不是PKCS8支持的旧DES变体之一来保护私钥,那么它将起作用:

public String toPem(String password) throws IOException {

  StringWriter sw = new StringWriter();

  try (JcaPEMWriter pemWriter = new JcaPEMWriter(sw)) {

    PEMEncryptor encryptor =
        new JcePEMEncryptorBuilder("AES-256-CBC").build(password);

    // privateKey is a java.security.PrivateKey
    JcaMiscPEMGenerator gen = new JcaMiscPEMGenerator(privateKey, encryptor);
    pemWriter.writeObject(gen);
  }

  return sw.toString();
}

您可以使用openssl验证输出。在我的情况下,密钥是EC,因此使用此命令:

$ openssl ec -in key.txt -passin pass:password -text

根据RSA密钥的要求进行调整。

相关问题