使用bouncycastle在java中导入PEM加密密钥对
我正在编写一个使用RSA执行各种任务的程序。使用bouncycastle在java中导入PEM加密密钥对,java,import,rsa,bouncycastle,pem,Java,Import,Rsa,Bouncycastle,Pem,我正在编写一个使用RSA执行各种任务的程序。 我知道如何生成密钥对并将其写入文件,但我无法将加密(AES-256-CFB)密钥对加载到密钥对对象 因此,问题是:如何使用BouncyCastle库将加密的PEM密钥对作为java.security.KeyPair对象加载/解密? 谢谢 生成/导出代码: public void generateKeyPair(int keysize, File publicKeyFile, File privateKeyFile, String passphrase
我知道如何生成密钥对并将其写入文件,但我无法将加密(AES-256-CFB)密钥对加载到密钥对对象 因此,问题是:如何使用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(新的BouncyCastleProvider());
您提供的代码创建了两个密钥文件,一个用于私钥,另一个用于公钥。但是,公钥隐式地包含在私钥中,因此我们只需读取私钥文件即可重构密钥对
然后,主要步骤是:
- 创建
以读取密钥文件PEMParser
- 使用解密密钥所需的密码短语创建一个
JcePEMDecryptorProvider
- 创建
将解密密钥转换为JcaPEMKeyConverter
密钥对
密钥对加载加密密钥对(文件privateKeyFile,字符串密码)
抛出FileNotFoundException,IOException{
FileReader=新的FileReader(privateKeyFile);
PEMParser parser=新的PEMParser(读取器);
Object o=parser.readObject();
如果(o==null){
抛出新的IllegalArgumentException(
“无法从文件中读取PEM对象!”);
}
JcaPEMKeyConverter=新的JcaPEMKeyConverter();
if(PEMKeyPair的o实例){
PEMKeyPair keyPair=(PEMKeyPair)o;
返回转换器。getKeyPair(keyPair);
}
if(PEMEncryptedKeyPair的o实例){
PEMEncryptedKeyPair encryptedKeyPair=(PEMEncryptedKeyPair)o;
质子交换膜解密器=
新的JcePEMDecryptorProviderBuilder().build(passphrase.toCharArray());
返回converter.getKeyPair(encryptedKeyPair.decryptKeyPair(decryptor));
}
抛出新的IllegalArgumentException(“无效对象类型:+o.getClass());
}
用法示例:
File privKeyFile=新文件(“priv.pem”);
字符串密码短语=“abc”;
试一试{
KeyPair KeyPair=loadEncryptedKeyPair(privKeyFile,密码短语);
}捕获(IOEX异常){
系统错误打印项次(ex);
}
参考:用于密钥解析的BouncyCastle单元测试()。为什么您有用于RSA任务的AES密钥?@MarquesFlorne他想加密RSA私钥以将其存储在文件中。