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

时间:2011-07-17 20:51:54

标签: c# rsa signature public-key

使用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);

现在,显然Decrypt会失败,因为我正在尝试解密已签名(不是“加密”)的东西,并且肯定不会通过相同的“密钥”解密。我很困惑,因为我认为我应该使用类似VerifyData()的方法,但这会返回一个bool并接受我不确定的参数。

我希望实现的是openssl rsautl -verify -inkey public.pem -pubin的C#等价物。也就是说,用pubkey“解密”来验证所述消息的内容。

我在这里走在正确的轨道上吗?

  • Mik的

1 个答案:

答案 0 :(得分:0)

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

我真的不确定response在你的程序中是什么;你应该只 将RSA数据传递给它,如果你还要提供首先签署的数据做错了 - 同样,做检查该函数是否实际接受字符串,根据我的经验,BouncyCastle通常需要byte[]

我建议使用SignerUtilities.GetSigner() - 它需要一个字符串arg来告诉它你正在使用什么类型的签名,我认为"SHA1WithRSA"适合你。