Bouncy Castle:PEMReader => PEMParser
有像PEM证书一样
-----BEGIN RSA PRIVATE KEY----- Proc-Type: 4,ENCRYPTED DEK-Info: AES-256-CBC,B9846B5D1803E.....
使用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) .....
现在我刚刚安装了BC 1.48,他们告诉我PEMReader已被弃用,必须由PEMParser替换。
我的问题是,AFAIK,PEMParser中没有密码的地方。
有人能举例说明如何将我的代码迁移到PEMParser版本吗?
TIA
我只需要解决同样的问题,但没有找到答案。 所以我花了一些时间研究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); } }
对于bcpkix-jdk15on
的1.55版,解密代码更改为:
kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider);
我没有检查这是否是上述答案中的错误或只是版本之间的API差异。
- 用JavavalidationPKCS#7证书
- 为什么桌面AES文件IO与Android AES文件IO不兼容?
- ECDSA使用BouncyCastle签名并使用Crypto ++进行validation
- validation在Java中的golang中生成的rsa.SignPKCS1v15签名
- 用Bouncy Castle复制Java中的’openssl smime’?
- 使用bouncycastle签署和validation签名的正确方法
- PKCS#7登录并validation标志
- 从ECPrivateKey生成ECPublicKey
- 如何使用海绵城堡为比特币曲线(secp256k1)创建ECDSA密钥对(256位)?