我对 PGP 和充气城堡还比较陌生。签署消息后,获取返回的 ascii 装甲数据。我们假设这个 ascii 装甲数据已被加密和解密并等待签名验证。以下是我的疑问:
我收到的 Ascii 防护数据是否包含准备加密的签名数据或仅包含签名摘要? (根据提供的签名代码)
如果包含完整的签名数据,如何从Ascii装甲数据中提取数据并签名并使用它们进行验证?
如果不是,我是否应该手动将符号附加到原始数据以及如何操作?
参考代码
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 验证,请给我提供一个代码示例并解释它是如何工作的。
“让我们假设这个 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 验证,请给我提供一个代码示例并解释它是如何工作的。
不。如果你那么懒,可以使用人工智能之类的东西。