【问题标题】:How do I create an ascii-armored signed OpenPGP message using ArmoredOutputStream of the BouncyCastle crypto library (C# version)如何使用 BouncyCastle 加密库(C# 版本)的 ArmoredOutputStream 创建 ascii-armored 签名的 OpenPGP 消息
【发布时间】:2014-09-15 18:18:26
【问题描述】:

当我使用 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"

    }

【问题讨论】:

    标签: c# .net cryptography bouncycastle openpgp


    【解决方案1】:

    最后我找到了一个source code,它演示了 ArmoredOutputStream 的使用:

            // Setup signature stuff
            var signatureData = new PgpSignatureGenerator(encAlgorithm, hashAlgorithm);
            signatureData.InitSign(PgpSignature.CanonicalTextDocument, privKey);
    
            foreach (string userId in pubKey.GetUserIds())
            {
                var subPacketGenerator = new PgpSignatureSubpacketGenerator();
    
                subPacketGenerator.SetSignerUserId(false, userId);
                signatureData.SetHashedSubpackets(subPacketGenerator.Generate());
    
                // Just the first one!
                break;
            }
    
            using (var sout = new MemoryStream())
            {
                using (var armoredOut = new ArmoredOutputStream(sout))
                {
                    armoredOut.BeginClearText(hashAlgorithm);
    
                    using (MemoryStream testIn = new MemoryStream(TEST_DATA, false))
                    {
                        int ch;
                        while ((ch = testIn.ReadByte()) >= 0)
                        {
                            armoredOut.WriteByte((byte)ch);
                            signatureData.Update((byte)ch);
                        }     
                    }
    
                    armoredOut.EndClearText();
    
                    using (var outputStream = new BcpgOutputStream(armoredOut))
                    {
    
                        signatureData.Generate().Encode(outputStream);
                    }
    
                    byte[] outarr = sout.ToArray();
                    string strOut = System.Text.Encoding.UTF8.GetString(outarr, 0, outarr.Length);
    

    请注意,此代码不包含对库中“-----BEGIN PGP SIGNATURE-----”错误之前缺少换行符的修复。您必须自己在输出中添加它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-22
      • 1970-01-01
      • 2016-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2015-04-11
      相关资源
      最近更新 更多