2017-02-10 40 views
0
PGP签名的验证

我产生了PGP签名:使用BouncyCastle的

-----BEGIN PGP SIGNATURE----- 
Version: GnuPG v2 

iQEcBBABCAAGBQJYnkPxAAoJEBFjzYGyXBOsXRoH/3O4bwKK45aUN+m0N4jsZ+n5 
W8R/aGti/llvJ62tHBCO5BIp/pp+b1Gdv99xtnJXHu/f0TqPYj+fwq4vfaorNTtA 
Vtq8MaMesw1OWZEfu/lyjNOwdg81FUlYkw0Bjo3H/MxWjWYUiHmJo+OGriyf5dv/ 
433ZqitZMxLHCfZsuoU5teZ0BPUSoNjF6hOFK3ZI7QXsgYUyohzW2goy9bDVCKRq 
e73CHpnMKCrnDc+/4+sK349bD/cZp6/c0T8b7cBCeBGGilPD6ovJUQE5vhGTKnJM 
lgyxhA87tw9wqFwpZXDr0nzOP+MFfE9WRGecVYZ9G+LP/biefSe5iWRaPIcZIi0= 
=qUHb 
-----END PGP SIGNATURE----- 

code在这里,与BouncyCastle的实现:

(sign "project.clj" 
     "project.clj.asc" 
     <FILENAME> 
     "98B9A74D") 

我希望能够读取该签名和使用公钥验证它。这将如何变回BouncyCastle org.bouncycastle.openpgp.PGPSignature对象?

回答

0

这将如何转回BouncyCastle ... PGPSignature对象?

提取从bcpg罐子提供org.bouncycastle.openpgp.examples.DetachedSignatureProcessor相关的代码,并专门到你的情况(装甲,未压缩):

InputStream in = new org.bouncycastle.bcpg.ArmoredInputStream (new FileInputStream (filename)); 
// or substitute other InputStream depending on where this data is available 
org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory pgpFact = new org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory(in); 
org.bouncycastle.openpgp.PGPSignatureList p3 = (org.bouncycastle.openpgp.PGPSignatureList)pgpFact.nextObject(); 
org.bouncycastle.openpgp.PGPSignature sig = p3.get(0); 
in.close(); // not in example but needed in quality code 

我希望能够读取该签名和验证使用公钥。

该示例的其余部分展示了一种验证给定publickey(在发布文件的示例中)和相关数据(在该示例中也是文件)的这种PGPS签名的方法。

+0

质量代码也会在发生异常时关闭文件。这最好通过使用“try with resources”来完成:'try(InputStream in = new org.bouncycastle.bcpg.ArmoredInputStream(new FileInputStream(filename))){'。这样java将自动关闭文件给你,不需要明确的关闭。 –

+0

@KlasLindbäck:很好,尽管我看过的BC例子并不使用try-resources,大概是因为BC把它们的代码宣告为可移植到1.5。他们同样使用明确的强制转换,而不是像'List '这样的表格,我觉得这更令人讨厌。 –