当前位置: 首页 > 知识库问答 >
问题:

如何使用BouncyCastle验证打开PGP签名

饶志
2023-03-14
    null
private bool VerifyWithPublicKey(string data, byte[] sig)
    {
        RSACryptoServiceProvider rsa;

        using (var keyreader = new StringReader(publicKey))
        {
                var pemReader = new PemReader(keyreader);
                var y = (RsaKeyParameters)pemReader.ReadObject();
                rsa = (RSACryptoServiceProvider)RSA.Create();
                var rsaParameters = new RSAParameters();

                rsaParameters.Modulus = y.Modulus.ToByteArray();
                rsaParameters.Exponent = y.Exponent.ToByteArray();
                rsa.ImportParameters(rsaParameters);

                // compute sha1 hash of the data
                var sha = new SHA1CryptoServiceProvider();
                byte[] hash = sha.ComputeHash(Encoding.ASCII.GetBytes(data));

                // This always returns false
                return rsa.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), sig);
        }

共有1个答案

寇靖
2023-03-14

使用RSA不是您的情况。你需要

  1. 定义公钥
  2. 将公用ket转换为PGPPublicKey
  3. 获取PgpSignature对象
  4. 验证签名

要验证签名,您将需要已签名的原始数据。

public class iTransactVerifier
{
    private const string PublicKey = @"-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: 4.5

mQCNAjZu
-----END PGP PUBLIC KEY BLOCK-----";

    public static bool Verify(string signature, string data)
    {
        var inputStream = ConvertStringToStream(signature);

        PgpPublicKey publicKey = ReadPublicKeyFromString();
        var stream = PgpUtilities.GetDecoderStream(inputStream);

        PgpObjectFactory pgpFact = new PgpObjectFactory(stream);

        PgpSignatureList sList = pgpFact.NextPgpObject() as PgpSignatureList;
        if (sList == null)
        {
            throw new InvalidOperationException("PgpObjectFactory could not create signature list");
        }
        PgpSignature firstSig = sList[0];

        firstSig.InitVerify(publicKey);
        firstSig.Update(Encoding.UTF8.GetBytes(data));

        var verified = firstSig.Verify();
        return verified;
    }

    ....

    private static PgpPublicKey ReadPublicKeyFromString()
    {
        var varstream = ConvertStringToStream(PublicKey);
        var stream = PgpUtilities.GetDecoderStream(varstream);

        PgpObjectFactory pgpFact = new PgpObjectFactory(stream);
        var keyRing = (PgpPublicKeyRing)pgpFact.NextPgpObject();
        return keyRing.GetPublicKey();
    }
}
 类似资料:
  • 我想使用BouncyCastle解析和验证OpenPGP分离签名。签名如下所示: 下面是我如何尝试在Kotlin中创建CMSSignedData: 我应该如何使用BouncyCastle验证这种签名?

  • 代码在这里,使用BouncyCastle实现: 我希望能够读取此签名并使用公钥验证它。如何将其转换回BouncyCastle对象?

  • 我试图使用java BouncyCastle库解密和验证PGP消息,但遇到了一些问题,抱怨PartialInputStream过早结束。 我知道encrypt工作得很好,因为我可以在命令行上使用gpg解密和验证使用encrypt函数创建的消息。

  • 我应该如何更改A方法?任何想法都是好的。提前谢谢。

  • 下面是Java代码: 然后使用C代码来验证签名 我在想我需要将我的签名编码为hexa,但它并没有解决我的问题。我已经使用crypto编写了一个c版本的符号方法,并且已经验证过了。所以为什么当我使用java代码时,签名没有得到验证。谢谢

  • 现有系统使用Bouncy Castle(.NET)生成签名,我需要使用Microsoft ECDsaCng类验证这些现有签名。 在我尝试用Microsoft类验证签名之前,一切都正常工作,此时它会生成一个异常,说明参数不正确。 有什么想法吗?