如何在C#中使用SHA256withRSA算法进行签名

时间:2019-09-09 09:52:00

标签: c# rsa sha256 rsa-sha256

我尝试了针对查询的搜索解决方案,找不到我要查找的匹配项,这是非常基本的操作,但是为了更好地理解,我将查询发布在了查询下方。

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

我的问题是:

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

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

2 个答案:

答案 0 :(得分:0)

除非正在与CAPI互操作,例如打开命名密钥,否则请不要使用RSACryptoServiceProvider

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

答案 1 :(得分:0)

首先,您需要一个密钥对。要生成密钥对,您可以执行以下操作并使用 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 的引用