当我使用 ArmoredOutputStream 时,我在明文后得到“-----BEGIN PGP MESSAGE-----”而不是“-----BEGIN PGP SIGNATURE-----”。我无法弄清楚如何自己使用 ArmoredOutputStream。有时我得到签名标头,但消息中包含非 base64 字符。BC 军团成员一定是虐待狂,他们发布了这么好的库,几乎没有文档说明如何使用它……
这是我的代码:
private void doTestSig(
PublicKeyAlgorithmTag encAlgorithm,
HashAlgorithmTag hashAlgorithm,
PgpPublicKey pubKey,
PgpPrivateKey privKey)
{
MemoryStream testIn = new MemoryStream(TEST_DATA, false);
MemoryStream baseOut = new MemoryStream();
ArmoredOutputStream aOut = new ArmoredOutputStream(baseOut);
aOut.BeginClearText(hashAlgorithm);
aOut.Write(testIn.ToArray(), 0, testIn.ToArray().Length);
aOut.EndClearText();
PgpSignatureGenerator sGen = new PgpSignatureGenerator(encAlgorithm, hashAlgorithm);
sGen.InitSign(PgpSignature.BinaryDocument, privKey);
sGen.GenerateOnePassVersion(false).Encode(aOut);
PgpLiteralDataGenerator lGen = new PgpLiteralDataGenerator();
Stream lOut = lGen.Open(
new FilterStream(aOut),
PgpLiteralData.Binary,
PgpLiteralDataGenerator.Console,
TEST_DATA.Length * 2,
DateTime.UtcNow);
int ch;
while ((ch = testIn.ReadByte()) >= 0)
{
aOut.WriteByte((byte)ch);
sGen.Update((byte)ch);
}
lOut.Write(TEST_DATA, 0, TEST_DATA.Length);
sGen.Update(TEST_DATA);
lGen.Close();
sGen.Generate().Encode(aOut);
aOut.Close();
byte[] outarr = baseOut.ToArray();
string strOut = System.Text.Encoding.UTF8.GetString(outarr, 0, outarr.Length);
// strOut gets this:
// "-----BEGIN PGP SIGNED MESSAGE-----\r\n
// Hash: SHA1\r\n
// \r\n
// hello world!\n
// hello world!\n
//
// -----BEGIN PGP MESSAGE-----\r\n
// Version: BCPG C# v1.7.0.0
// \r\n
// \r\n
// kA0DAAIR4GIXExqVFDEBy0JiCF9DT05TT0xFVBcoRmhlbGxvIHdvcmxkIQpoZWxs\r\n
// byB3b3JsZCEKaGVsbG8gd29ybGQhCmhlbGxvIHdvcmxkIQqIRgQAEQIABgUCVBco\r\n
// RgAKCRDgYhcTGpUUMXglAJwNOiEzA7H9RxaoU/gs9AoxZCOd+ACffl8lJ/6ZNpkB\r\n
// FLBjbd9wlEU3/SY=\r\n=u7Mk\r\n
// -----END PGP MESSAGE-----\r\n"
}