【问题标题】:How to do signature using SHA256withRSA algorithm in C#如何在 C# 中使用 SHA256withRSA 算法进行签名
【发布时间】:2019-09-09 09:52:00
【问题描述】:

我尝试了我的查询的搜索解决方案,我无法找到我正在寻找的匹配,这是非常基本的,但我更好地理解我在查询下面发布。

我想使用“SHA256withRSA”算法对我的字符串进行编码和签名。我可以使用“SHA256withRSA”在 java 中看到很多示例代码,但在 C# 中我可以看到首先我们使用 SHA256 对数据进行哈希处理,然后使用 RSACryptoServiceProvider 进行签名哈希处理。

我的问题是:

  1. 在 C# 中,我们有单独的“SHA256withRSA”算法,如果是,请提供示例代码。

  2. 如果没有,那么在 C# 中实现它的更好方法是什么?

【问题讨论】:

    标签: c# rsa sha256 rsa-sha256


    【解决方案1】:

    请勿使用RSACryptoServiceProvider,除非您正在与 CAPI 进行互操作,例如打开命名密钥。

    使用 SHA-(2-)256 进行 RSA 签名:

    byte[] signature = rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
    

    您可以从证书中获取 RSA 对象:

    using (RSA rsa = cert.GetRSAPrivateKey())
    {
        ...
    }
    

    或者您可以使用现有的 RSA 参数进行组合:

    using (RSA rsa = RSA.Create(rsaParameters))
    {
       ...
    }
    

    或者你可以从无到有组成一个新的密钥:

    using (RSA rsa = RSA.Create(2048))
    {
        // you’ll need to save the parameters somewhere to have a stable key
        rsaParameters = rsa.ExportParameters(true));
        ...
    }
    

    【讨论】:

      【解决方案2】:

      首先,您需要一个密钥对。要生成密钥对,您可以使用 OpenSSL 执行以下操作:

      1. 生成私钥

        openssl genrsa -out my-private-key.pem 2048

      2. 生成公共证书

        openssl req -new -key my-private-key.pem -x509 -days 36500 -out my-public-cert.pem

      3. 生成 p12 文件

        openssl pkcs12 -export -in my-public-cert.pem -inkey my-private-key.pem -out my-key-pairs.p12

      现在您可以在 C#.NET 中使用以下示例代码来创建数字签名并验证数字签名

          public static string SignData(byte[] data, string pkcs12File, string pkcs12Password)
          {
              X509Certificate2 signerCert = new X509Certificate2(pkcs12File, pkcs12Password, X509KeyStorageFlags.Exportable);
              RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
              rsaCSP.FromXmlString(signerCert.PrivateKey.ToXmlString(true));
              var SignedData = rsaCSP.SignData(data, CryptoConfig.MapNameToOID("SHA256"));
              return Convert.ToBase64String(SignedData);
          }
      
          public static bool VerifySignature(byte[] data, string signature, string publicCert)
          {
              X509Certificate2 partnerCert = new X509Certificate2(publicCert);
              RSACryptoServiceProvider rsaCSP = (RSACryptoServiceProvider)partnerCert.PublicKey.Key;
              return rsaCSP.VerifyData(data, CryptoConfig.MapNameToOID("SHA256"), Convert.FromBase64String(signature));
          }
      

      请记住,您的项目需要添加对 System.Security 的引用

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 2018-05-15
        • 2016-01-18
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        • 2018-07-25
        • 2021-12-01
        相关资源
        最近更新 更多