C# 如何使用BouncyCastle验证open PGP的签名

C# 如何使用BouncyCastle验证open PGP的签名,c#,bouncycastle,C#,Bouncycastle,如何使用BouncyCastle验证open PGP的签名 我用的是C# 我有钥匙 我正在使用BouncyCastle作为开放pgp库 我有在查询字符串中接收的签名 根据指令(第145页),算法是RSA 我检查了很多资源,但没有成功。据我所知,我需要将公钥和签名传递给某个验证方法 还不清楚是否必须将字符串格式的给定公钥转换为某个适当的公钥对象。如果必须,什么是类型?我已尝试将其转换为RsaKeyParameters,但收到关于公钥上不适当的块的错误消息 目前我有以下代码 private bool

如何使用BouncyCastle验证open PGP的签名

  • 我用的是C#
  • 我有钥匙
  • 我正在使用BouncyCastle作为开放pgp库
  • 我有在查询字符串中接收的签名
  • 根据指令(第145页),算法是RSA
  • 我检查了很多资源,但没有成功。据我所知,我需要将公钥和签名传递给某个验证方法

    还不清楚是否必须将字符串格式的给定公钥转换为某个适当的公钥对象。如果必须,什么是
    类型
    ?我已尝试将其转换为
    RsaKeyParameters
    ,但收到关于公钥上不适当的块的错误消息

    目前我有以下代码

    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);
            }
    

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

  • 定义公钥
  • 将公共ket转换为PgPPublicKey
  • 获取PgpSignature对象
  • 验证签名
  • 要验证签名,您需要签名的原始数据

    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();
        }
    }