Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用bouncycastle在java中导入PEM加密密钥对_Java_Import_Rsa_Bouncycastle_Pem - Fatal编程技术网

使用bouncycastle在java中导入PEM加密密钥对

使用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

我正在编写一个使用RSA执行各种任务的程序。
我知道如何生成密钥对并将其写入文件,但我无法将加密(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私钥以将其存储在文件中。