c# - 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 中的未知对象”异常,这很烦人,因为它的当前形式是无用的。
谁能指出我哪里出错了?
解决方案
推荐阅读
- javascript - 在 React 应用程序中使用 Redux 获取文本输入值
- c++ - 缩放对齐框
- java - @Where、@SQLDelete 与不同数据库的兼容性
- c# - 单元测试 asp.net 核心。在解决方案中构建所有项目
- encryption - Wireshark 在连接 wifi 时如何解密数据包?
- c - 解除阻塞信号后代码不执行第二部分
- php - Composer curl 错误 60:SSL 证书问题:证书链中的自签名证书
- php - 我正在尝试使用 Spotify PHP api
- python - 如何拥有仅处理多个应用程序的身份验证的单独 REST API
- javascript - 当我使用 fetch 发送数据时,$_POST 上的空数组