首页 > 解决方案 > c#中使用bouncy castle api进行签名验证

问题描述

我正在尝试使用 Bouncy Castle api 来验证明确签名消息的签名。(我已经进行了签名、加密和解密工作,但是我需要验证的一些事情不会被加密,所以我需要能够单独执行这些操作)。

我想验证签名,如果经过验证,则只返回消息文本(不带签名)。我目前的功能如下;

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 会在尝试获取 PgpObject 时出现“流 45 中的未知对象”异常,这很烦人,因为它的当前形式是无用的。

谁能指出我哪里出错了?

标签: c#bouncycastlesign

解决方案


推荐阅读