2013-02-17 109 views
15

有了這樣使用BC 1.46充氣城堡:PEMReader => PEMParser

-----BEGIN RSA PRIVATE KEY----- 
Proc-Type: 4,ENCRYPTED 
DEK-Info: AES-256-CBC,B9846B5D1803E..... 

一個PEM證書,我提取用下面的代碼密鑰對:

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

回答

29

我只是需要解決同樣的問題,沒有找到答案。 所以我花了一些時間研究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); 
    } 
} 
+3

如果私鑰是PKCS#8格式,則該對象將是PrivateKeyInfo的一個實例。你必須使用converter.getPrivateKey((PrivateKeyInfo)對象);' – gtrig 2013-11-20 03:18:53

+1

Brilliant,這幫助我使用不推薦使用的BC 1.46 org.bouncycastle.openssl.PEMReader類到更新的PEMParser技術。非常感謝! – Jeffro 2014-11-19 01:50:56

+1

@xwatch您好,請問您能提供進口嗎?找不到類PEMParser - 我是一種新的MAVEN,我有這種依賴關係 <! - https://mvnrepository.com/artifact/org.bouncycastle/bcprov-jdk15on - > org.bouncycastle bcprov-jdk15on 1.56 不能得到它的工作。 – 2017-04-24 23:44:38

1

對於1.55版本的bcpkix-jdk15on解密代碼更改爲:

kp = ((PEMEncryptedKeyPair) object).decryptKeyPair(decryptorProvider); 

我沒有檢查,如果這是在上面的回答有誤或者只是版本之間的差異。