[英]create a file.pem containing the private key when creating a Key Pair using AWS SDK for Java
[英]Importing PEM encrypted key pair in java using bouncycastle
我正在编写一个使用 RSA 执行各种任务的程序。
我知道如何生成密钥对并将其写入文件,但我无法将加密的 (AES-256-CFB) 密钥对加载到 KeyPair 对象。
所以问题是:如何使用 BouncyCastle 库将加密的 PEM 密钥对加载/解密为 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());
您提供的代码创建了两个密钥文件,一个用于私钥,一个用于公钥。 但是,公钥隐含在私钥中,因此我们只需读取私钥文件即可重构密钥对。
然后主要步骤是:
创建一个PEMParser
以从密钥文件中读取。
使用解密密钥所需的密码创建一个JcePEMDecryptorProvider
。
创建JcaPEMKeyConverter
以将解密的密钥转换为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 单元测试( 链接)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.