用公钥验证数据(用RSA私钥签名)

本文关键字:私钥 公钥 验证 数据 RSA | 更新日期: 2023-09-27 18:02:16

使用BouncyCastle,在stackoverflow问题的帮助下,我得到了这个:

        using System.Net.Sockets;
        using System.Security.Cryptography;
        using Org.BouncyCastle.Crypto.Parameters;
        using Org.BouncyCastle.OpenSsl;

        TcpClient client = new TcpClient("127.0.0.1", 1337);
        NetworkStream stream = client.GetStream();
        StreamWriter writer= new StreamWriter(stream);
        StreamReader reader = new StreamReader(stream);
        writer.WriteLine("hello");
        writer.AutoFlush = true;
        string response = Convert.FromBase64String(reader.ReadToEnd()).ToString();
        RSACryptoServiceProvider RCP;
        var x = new PemReader(File.OpenText(pubkey));
        var y = (RsaKeyParameters)x.ReadObject();
        RCP = (RSACryptoServiceProvider)RSACryptoServiceProvider.Create();
        var pa = new RSAParameters();
        pa.Modulus = y.Modulus.ToByteArray();
        pa.Exponent = y.Exponent.ToByteArray();
        RCP.ImportParameters(pa);
        byte[] test = RCP.Decrypt(response, true);

现在,显然解密将失败,因为我试图解密一些已签名(不是"加密")的东西,并且绝对不是由相同的"密钥"。我很困惑,因为我认为我应该使用像VerifyData()这样的方法,但这返回一个bool并接受参数,我不确定我有。

我想要完成的是相当于openssl rsautl -verify -inkey public.pem -pubin的c#。也就是说,用公开密钥"解密"以验证所述消息的内容。

我讲对了吗?

  • 麦克指标

用公钥验证数据(用RSA私钥签名)

实际上,除非指定了错误的编码参数,否则签名的解密永远不会失败——签名只是数据的私钥加密散列(通常是SHA1);使用验证例程的唯一好处是它可以解密块并为您进行哈希比较,如果您想要更加小心,您可以使用您的公钥进行解密操作并自己比较哈希字节。

我实际上不确定response在你的程序上下文中是什么;你应该只有传递RSA数据给它,如果你也给它的数据是在第一个地方你是做错了 -类似地,做检查如果该函数实际上接受字符串,在我的经验BouncyCastle通常期望一个byte[]

我建议使用SignerUtilities.GetSigner() -它需要一个字符串参数来告诉它你使用的是哪种签名,我认为"SHA1WithRSA"适合你。