gpt4 book ai didi

java - 以编程方式将 PEM 文件转换为 PKCS8

转载 作者:行者123 更新时间:2023-11-30 10:11:30 25 4
gpt4 key购买 nike

我想将 pem 文件转换为 pk8。我可以在终端上使用 openssl 来做到这一点;

openssl pkcs8 -topk8 -inform PEM -outform DER -in client-key.pem -out client-key.pk8 -nocrypt

但我需要在 java 上以编程方式执行此操作。看起来有一个密码学包,其中包含 openssl 实现 Bounty Castle但我不知道如何进行这个转换过程。有办法吗?

最佳答案

Bouncy CaSTLe 的测试代码在函数ParserTest.doOpenSslRsaTest 中包含一个如何读取RSA 私钥的示例。 .这是对该示例的轻微修改,它可以处理加密和非加密 key 作为输入(在后一种情况下,将不使用密码):

private static KeyPair pemRSAP1ReadKeyPair(String pemfilename, String passphrase)
throws FileNotFoundException, IOException
{
KeyPair result = null;

FileReader reader = new FileReader(pemfilename);
PEMParser parser = new PEMParser(reader);
Object pemobj = parser.readObject();
parser.close();
reader.close();

if (pemobj == null ||
!((pemobj instanceof PEMKeyPair) || (pemobj instanceof PEMEncryptedKeyPair))) {
System.out.println("Unable to read key pair");
} else {
PEMKeyPair pemkp;
if (pemobj instanceof PEMEncryptedKeyPair) {
PEMEncryptedKeyPair kp = (PEMEncryptedKeyPair)pemobj;
PEMDecryptorProvider decprov = new BcPEMDecryptorProvider(passphrase.toCharArray());
pemkp = kp.decryptKeyPair(decprov);
} else {
pemkp = (PEMKeyPair)pemobj;
}
result = new JcaPEMKeyConverter().setProvider("BC").getKeyPair(pemkp);
}
return result;
}

可以在 AllTests.encryptedTestNew 中找到作者端的示例,大致如下所示:

private static void pemRSAP8WritePrivateKey(PrivateKey key, String pemfilename, String passphrase)
throws IOException, OperatorCreationException
{
FileWriter writer = new FileWriter(pemfilename);
JcaPEMWriter pemwriter = new JcaPEMWriter(writer);

JceOpenSSLPKCS8EncryptorBuilder encryptorbuilder =
new JceOpenSSLPKCS8EncryptorBuilder(PKCS8Generator.AES_128_CBC).
setProvider("BC").
setPasssword(passphrase.toCharArray());

OutputEncryptor encryptor = encryptorbuilder.build();
PKCS8Generator pkcs8 = new JcaPKCS8Generator(key, encryptor);
pemwriter.writeObject(pkcs8);

pemwriter.close();
writer.close();
}

将它们放在一起进行转换:

Security.addProvider(new BouncyCastleProvider());

try {
KeyPair kp = pemRSAP1ReadKeyPair("rsakey_enc.pem", "changeit");
PrivateKey privkey = kp.getPrivate();
if (!(privkey instanceof RSAPrivateKey)) {
System.out.println("PEM input file does not contain an RSA private key");
} else {
pemRSAP8WritePrivateKey(privkey, "rsakey.p8", "abracadabra");
}
} catch (Exception e) {
System.out.println("Caught exception: " + e.getMessage());
}

关于java - 以编程方式将 PEM 文件转换为 PKCS8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52402352/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com