Bouncy Castle:PEMReader => PEMParser

sta*_*ist 20 java bouncycastle

有像PEM证书一样

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,B9846B5D1803E.....
Run Code Online (Sandbox Code Playgroud)

使用BC 1.46,我使用以下代码提取密钥对:

int myFunc(String pemString, char [] password) {

    ByteArrayInputStream tube = new ByteArrayInputStream(pemString.getBytes());

    Reader fRd = new BufferedReader(new InputStreamReader(tube));

    PEMReader pr = new PEMReader(fRd, new Password (password), "BC");

     try {
            Object o = pr.readObject();
            if (o instanceof KeyPair)
    .....
Run Code Online (Sandbox Code Playgroud)

现在我刚刚安装了BC 1.48,他们告诉我PEMReader已被弃用,必须由PEMParser替换.

我的问题是,AFAIK,PEMParser中没有密码的地方.

有人能举例说明如何将我的代码迁移到PEMParser版本吗?

小智 36

我只需要解决同样的问题,但没有找到答案.所以我花了一些时间学习BC API,找到了适合我的解决方案.我需要从文件中读取私钥,因此myFunc方法中有privateKeyFileName参数而不是pemString参数.

使用BC 1.48和PEMParser:

int myFunc(String privateKeyFileName, char [] password) {
     File privateKeyFile = new File(privateKeyFileName); // private key file in PEM format
     PEMParser pemParser = new PEMParser(new FileReader(privateKeyFile));
     Object object = pemParser.readObject();
     PEMDecryptorProvider decProv = new JcePEMDecryptorProviderBuilder().build(password);
     JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");
     KeyPair kp;
     if (object instanceof PEMEncryptedKeyPair) {
        System.out.println("Encrypted key - we will use provided password");
        kp = converter.getKeyPair(((PEMEncryptedKeyPair) object).decryptKeyPair(decProv));
    } else {
        System.out.println("Unencrypted key - no password needed");
        kp = converter.getKeyPair((PEMKeyPair) object);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果私钥是PKCS#8格式,则该对象将是PrivateKeyInfo的实例.你必须使用`converter.getPrivateKey((PrivateKeyInfo)object);` (4认同)
  • @xwatch你好,你能提供进口吗?找不到类PEMParser - 我那种新 - 使用Maven的,我有这种依赖性<!​​ - https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on - > <相关性> <的groupId> org.bouncycastle </的groupId> <artifactId的> bcprov-jdk15on </ artifactId的> <版本> 1.56 </版本> </依赖>无法得到它的工作. (2认同)