2015-01-10 179 views
1

我正在開發一個簡單的Java代碼,使用BouncyCastle v1.51打開PGP公鑰並驗證其中包含的簽名。 目前,我可以加載公鑰並遍歷所有簽名。但是,即使我使用與生成簽名的私鑰相對應的公鑰來檢驗簽名,驗證總是返回「false」。PGP,驗證證書上的簽名

這是我的代碼:

try { 
     PGPPublicKey pkey = PGPEncryptionUtils.readPublicKey(new FileInputStream(new File(HOME_DIR + "to_verify"))); 
     Iterator it = pkey.getSignatures(); 

     PGPPublicKey signing_key = PGPEncryptionUtils.readPublicKey(
       new FileInputStream(new File(HOME_DIR + "my_public_key"))); 

     while (it.hasNext()) { 
      PGPSignature sig = (PGPSignature) it.next(); 
      sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signing_key); 
      // Here I'd expect to see at least a "true". 
      println(sig.verify()); 
     } 

    } catch (FileNotFoundException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (PGPException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

readPublicKey的代碼是從這裏取:https://github.com/damico/OpenPgp-BounceCastle-Example/blob/master/src/org/jdamico/bc/openpgp/utils/PgpHelper.java

我在做什麼錯? 謝謝!

+0

你正試圖驗證一種特殊的簽名,認證。 BouncyCastla有一個[專用於驗證認證的功能](https://www.bouncycastle.org/docs/pgdocs1.5on/org/bouncycastle/openpgp/PGPSignature.html#verifyCertification(org.bouncycastle.openpgp.PGPPublicKey)),但我沒有任何使用它的經驗。你可能想看看這個。 –

回答

0

我沒有與PGPSignatures經驗然而,以驗證公共密鑰加密的簽名,你需要三樣東西:

  1. 簽名。
  2. publicKey。
  3. 應該簽名的原始消息。

在您的示例original message丟失,您需要提供其雖然PGPSignature.update(byte[])法簽署了original message,所以你的代碼必須看起來像:

while (it.hasNext()) { 
     PGPSignature sig = (PGPSignature) it.next(); 
     sig.init(new >JcaPGPContentVerifierBuilderProvider().setProvider("BC"), signing_key); 

     // here you need the original message 
     sig.update("signature original message".getBytes()); 

     // now you can try to verify! 
     println(sig.verify()); 
} 

希望這有助於