如何使用 Bouncy Castle 在 PGP 中解密后验证 Ascii-Armored 数据?

问题描述 投票:0回答:1

我对 PGP 和充气城堡还比较陌生。签署消息后,获取返回的 ascii 装甲数据。我们假设这个 ascii 装甲数据已被加密和解密并等待签名验证。以下是我的疑问:

  1. 我收到的 Ascii 防护数据是否包含准备加密的签名数据或仅包含签名摘要? (根据提供的签名代码)

  2. 如果包含完整的签名数据,如何从Ascii装甲数据中提取数据并签名并使用它们进行验证?

  3. 如果不是,我是否应该手动将符号附加到原始数据以及如何操作?

参考代码

    private ByteArrayOutputStream signData(byte[] data, PGPPrivateKey privateKey, int hashAlgo) throws PGPException, IOException {
        JcaPGPContentSignerBuilder contentSignerBuilder = new JcaPGPContentSignerBuilder(PGPPublicKey.RSA_GENERAL, hashAlgo)
                .setProvider(BouncyCastleProvider.PROVIDER_NAME);
        PGPSignatureGenerator signatureGenerator = new PGPSignatureGenerator(
                contentSignerBuilder
        );
        signatureGenerator.init(PGPSignature.BINARY_DOCUMENT, privateKey);
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ArmoredOutputStream armoredOut = new ArmoredOutputStream(byteOut);
        BCPGOutputStream bOut = new BCPGOutputStream(armoredOut);

        signatureGenerator.generateOnePassVersion(false).encode(bOut);
        signatureGenerator.update(data);
        signatureGenerator.generate().encode(bOut);

       armoredOut.close();
        return byteOut;
    }

Ascii 装甲数据示例:

-----BEGIN PGP MESSAGE-----
Version: BCPG v1.77.00

kA0DAAgBASaMeyE5SE4BiJwEAAEIAAYFAmZdbXMACgkQASaMeyE5SE4nMQP/Rc0C
3U2wD4htYYwln7yOTScpVY0p6gWeIx/u5ai/kOAE1fdHN8HAAA+X3LoeSMzqv76C
F+yGcWmKH363xM5pcuvk3kGZ8F0gDlfuAJMlfvUjRdDC4FrvB5uoScBYQPz2w3Wr
wGCZl40tEXo7tvUja9SLKmhHviXS5FpPaXGJ2Xc=
=ozi9
-----END PGP MESSAGE-----

请告诉我是否有任何其他理想的方法可以在没有 ASCII 装甲数据的情况下进行签名和验证。

另外,我不明白很多 OnePassSignatureList 验证,请给我提供一个代码示例并解释它是如何工作的。

java encryption digital-signature bouncycastle pgp
1个回答
0
投票

“让我们假设这个 ascii 装甲数据已被加密和解密并等待签名验证。”

为什么要假设加密/解密? ASCII 盔甲是关于编码/解码的。

我收到的 Ascii 装甲数据是否包含准备加密的签名数据或仅包含签名摘要? (根据提供的签名代码)

已签名的数据不包含在容器中。如果应该是,那么它应该包含在包含文字数据的数据包中。

“准备加密”是什么意思?签名生成不是加密,任何数据都可以加密。

如果包含完整的签名数据,如何从 Ascii 装甲数据中提取数据并签名并使用它们进行验证?

“签名”->“签名”,这种乱七八糟的写法会引起误解。您可以使用

PGPSignatureVerifier
PGPSignatureVerifierBuilder

如果不是,我是否应该手动将符号附加到原始数据以及如何操作?

update
之前执行以下操作:

PGPLiteralDataGenerator literalDataGenerator = new PGPLiteralDataGenerator();
try (OutputStream literalOut = literalDataGenerator.open(bOut, PGPLiteralData.BINARY, PGPLiteralData.CONSOLE, data.length, new Date())) {
    literalOut.write(data);
}

请告诉我是否有任何其他理想的方法可以在没有 ASCII 装甲数据的情况下进行签名和验证。

认真的吗?删除

ArmoredOutputStream
...

另外,我不明白很多 OnePassSignatureList 验证,请给我提供一个代码示例并解释它是如何工作的。

不。如果你那么懒,可以使用人工智能之类的东西。

© www.soinside.com 2019 - 2024. All rights reserved.