PGP签名格式阅读器

时间:2015-11-01 16:34:51

标签: java digital-signature gnupg pgp

在我的项目中,我需要使用相应的公钥验证PGP清除签名的签名。虽然我确实设法找到了这样做的代码(例如:https://github.com/cjmalloy/openbitpub/blob/64485d64a699eb6096f01b27d5f7e51dd726602f/src/main/java/com/cjmalloy/obp/server/pgp/PgpUtil.java),但它在低级别上运行并且看起来非常可怕。

我在想,也许存在一些可以使用-----BEGIN PGP PUBLIC KEY BLOCK-----xxx-----END PGP PUBLIC KEY BLOCK----------BEGIN PGP SIGNED MESSAGE-----xxx-----BEGIN PGP SIGNATURE-----xxx-----END PGP SIGNATURE-----块的专用解析器,所以我可以用更具声明性的方式检查签名?

我已经从PEMReader软件包中找到了相关的bouncycastle.openssl类,但到目前为止还没有与PGP相关的内容。

3 个答案:

答案 0 :(得分:2)

  

我在想,也许存在一些可以使用-----BEGIN PGP PUBLIC KEY BLOCK-----xxx-----END PGP PUBLIC KEY BLOCK----------BEGIN PGP SIGNED MESSAGE-----xxx-----BEGIN PGP SIGNATURE-----xxx-----END PGP SIGNATURE-----块的专用解析器,所以我可以用更具声明性的方式检查签名?

解析器根本不够 - 你需要实现许多特定于OpenPGP的函数,例如字符串的对称密钥派生(用于加密密钥),处理不同类型的不对称加密算法,哈希和,不同种类数据包嵌套,... - 至少你不需要实现OpenPGP CBC模式派生,因为你不需要加密(只有签名)。

OpenPGP 很多很复杂,无法编写自己的解析器和加密代码,而是依赖现有的库。最后,通过Java,你有两条可能的道路:

  

我从bouncycastle.openssl包中找到了相关的PEMReader类,但到目前为止还没有与PGP相关的内容。

你可能看错了BouncyCastle包。 OpenPGP不使用PEM格式的密钥(属于X.509标准),因此这个类根本没用。

答案 1 :(得分:0)

我有时也会遇到相同的情况。

此问题通过使用有弹性的城堡依赖性和方法来解决

decryptAndVerify(InputStream in,OutputStream fOut,InputStream publicKeyIn,InputStream keyIn,char [] passwd)

在PGP util类中

答案 2 :(得分:0)

商业广告OpenPGP Library for Java提供了一个方便的API,用于验证明文签名。示例代码为:

import com.didisoft.pgp.*;
 
public class VerifyFile {
    public static void main(String[] args) throws Exception{
        // create an instance of the library
        PGPLib pgp = new PGPLib();
 
        // verify and extract the signed content
        SignatureCheckResult signatureCheck = pgp.verifyAndExtract("signed.pgp", "sender_public_key.asc", "OUTPUT.txt");      
        if (signatureCheck == SignatureCheckResult.SignatureVerified) {
            System.out.println("The signature is valid.");
        } else if (signatureCheck == SignatureCheckResult.SignatureBroken) {
            System.out.println("Message corrupted or signature forged");
        } else if (signatureCheck == SignatureCheckResult.PublicKeyNotMatching) {
            System.out.println("Signature not matching provided public key (the message is from another sender)");
        } else {
              System.out.println("No signature found in message");
        }
    }
}

免责声明:我为DidiSoft工作。