使用bouncy castle api进行c#签名验证

时间:2018-06-15 10:34:45

标签: c# bouncycastle sign

我试图利用Bouncy Castle apis验证明确签名消息的签名。 (我已经签名,加密和解密工作,但我需要验证的一些内容已经加密,所以我需要能够单独完成这些工作。)

我想验证签名,如果验证了签名,则只返回消息文本(没有签名)。 我目前的职能如下:

public string GetVerifiedMessage(string signedCleartext, PgpPublicKey publicKey)
    {
        var inputStream = PgpUtilities.GetDecoderStream(ReadAsStream(signedCleartext));
        var outStr = new MemoryStream();

        inputStream.CopyTo(outStr);
        outStr.Close();

        var objectFactory = new PgpObjectFactory(inputStream);
        var signatureList = (PgpSignatureList) objectFactory.NextPgpObject();
        var signature = signatureList[0];

        var literalData = (PgpLiteralData) objectFactory.NextPgpObject();
        var data = literalData.GetInputStream();

        signature.InitVerify(publicKey);

        var memoryStream = new MemoryStream();

        int ch;
        while ((ch = data.ReadByte()) >= 0)
        {
            signature.Update((byte) ch);
            memoryStream.WriteByte((byte) ch);
        }

        if (!signature.Verify())
        {
            throw new Exception("Signature was not verified");
        }

        return Encoding.UTF8.GetString(memoryStream.ToArray());
    }

这是基于充气城堡代码库和其他地方的例子,虽然我不得不改变它们在内存中执行此操作而不是写入文件。

运行时,我收到错误,因为objectFactory不包含任何pgp对象。我已经验证第三方工具可以验证我使用的示例消息上的签名。

我尝试了一些变化 - 不是复制到outStr会在流45和#34中给出一个"未知对象。尝试获取PgpObject时出现异常,这很烦人,因为它的当前形式是无用的。

有谁可以指出我哪里出错了?

0 个答案:

没有答案