gpt4 book ai didi

java - 使用 bouncycaSTLe 在 java 中导入 PEM 加密 key 对

转载 作者:行者123 更新时间:2023-12-05 06:46:24 27 4
gpt4 key购买 nike

我正在编写一个使用 RSA 执行各种任务的程序。
我知道如何生成 key 对并将其写入文件,但我无法将加密的 (AES-256-CFB) key 对加载到 KeyPair 对象。

所以问题是:如何使用 BouncyCaSTLe 库将加密的 PEM key 对作为 java.security.KeyPair 对象加载/解密?

谢谢。

生成/导出代码:

public void generateKeyPair(int keysize, File publicKeyFile, File privateKeyFile, String passphrase) throws FileNotFoundException, IOException, NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
SecureRandom random = new SecureRandom();
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA", "BC");

generator.initialize(keysize, random);

KeyPair pair = generator.generateKeyPair();
Key pubKey = pair.getPublic();

PEMWriter pubWriter = new PEMWriter(new FileWriter(publicKeyFile));
pubWriter.writeObject(pubKey);
pubWriter.close();
PEMWriter privWriter = new PEMWriter(new FileWriter(privateKeyFile));
if (passphrase == null) {
privWriter.writeObject(pair);
} else {
PEMEncryptor penc = (new JcePEMEncryptorBuilder("AES-256-CFB"))
.build(passphrase.toCharArray());

privWriter.writeObject(pair, penc);
}
privWriter.close();
}

最佳答案

我假设您已将 BouncyCaSTLe 设置为安全提供程序,例如:

Security.addProvider(new BouncyCastleProvider());

您提供的代码创建了两个 key 文件,一个用于私钥,一个用于公钥。然而,公钥隐式包含在私钥中,因此我们只需读取私钥文件即可重构 key 对。

接下来的主要步骤是:

  • 创建一个 PEMParser 以从 key 文件中读取。

  • 使用解密 key 所需的密码创建一个 JcePEMDecryptorProvider

  • 创建一个 JcaPEMKeyConverter 以将解密的 key 转换为 KeyPair

KeyPair loadEncryptedKeyPair(File privateKeyFile, String passphrase)
throws FileNotFoundException, IOException {
FileReader reader = new FileReader(privateKeyFile);
PEMParser parser = new PEMParser(reader);
Object o = parser.readObject();

if (o == null) {
throw new IllegalArgumentException(
"Failed to read PEM object from file!");
}

JcaPEMKeyConverter converter = new JcaPEMKeyConverter();

if (o instanceof PEMKeyPair) {
PEMKeyPair keyPair = (PEMKeyPair)o;
return converter.getKeyPair(keyPair);
}

if (o instanceof PEMEncryptedKeyPair) {
PEMEncryptedKeyPair encryptedKeyPair = (PEMEncryptedKeyPair)o;

PEMDecryptorProvider decryptor =
new JcePEMDecryptorProviderBuilder().build(passphrase.toCharArray());

return converter.getKeyPair(encryptedKeyPair.decryptKeyPair(decryptor));
}

throw new IllegalArgumentException("Invalid object type: " + o.getClass());
}

示例用法:

File privKeyFile = new File("priv.pem");
String passphrase = "abc";

try {
KeyPair keyPair = loadEncryptedKeyPair(privKeyFile, passphrase);
} catch (IOException ex) {
System.err.println(ex);
}

引用:用于键解析的 BouncyCaSTLe 单元测试 (link)。

关于java - 使用 bouncycaSTLe 在 java 中导入 PEM 加密 key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15646582/

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