【问题标题】:C# Verifying data (signed with RSA private key) with public keyC# 使用公钥验证数据(使用 RSA 私钥签名)
【发布时间】:2011-07-17 20:51:54
【问题描述】:

使用 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() 这样的方法,但这会返回一个布尔值并接受我不确定的参数。

我希望实现的是openssl rsautl -verify -inkey public.pem -pubin 的 C# 等价物。即用公钥“解密”以验证所述消息的内容。

我在正确的轨道上吗?

  • 米克

【问题讨论】:

  • 虽然出于我的目的,我可以进行验证,而不需要解密,但我确实将它用于其他目的。比 Bouncycastle 更简单的解决方案是(至少对我而言):OpenSSL.Core.BIO bin = new OpenSSL.Core.BIO(public_key_as_string); OpenSSL.Crypto.RSA rsa = OpenSSL.Crypto.RSA.FromPublicKey(bin, null, null); byte[] message = new byte[1024]; message = rsa.PublicDecrypt(base64string, OpenSSL.Crypto.RSA.Padding.PKCS1); 使用托管的 OpenSSL.NET 包装器。

标签: c# rsa signature public-key


【解决方案1】:

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

我实际上不确定response 在您的程序上下文中是什么;您应该将 RSA 数据传递给它,如果您还向它提供了最初签名的数据,那么您 做错了 - 同样,做检查该函数是否真的接受一个字符串,根据我的经验,BouncyCastle 通常需要一个byte[]

我建议使用 SignerUtilities.GetSigner() - 它需要一个字符串 arg 来告诉它您正在使用哪种签名,我想 "SHA1WithRSA" 适合您。

【讨论】:

    猜你喜欢
    • 2022-01-01
    • 2020-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-03-06
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多