如何在C#中使用SHA256withRSA算法进行签名
How to do signature using SHA256withRSA algorithm in C#
我尝试了针对我的查询的搜索解决方案,但找不到我正在寻找的匹配项,这是非常基本的,但为了让我更好地理解,我将在查询下方发布。
我想使用 "SHA256withRSA" 算法对我的字符串进行编码和签名。我可以使用 "SHA256withRSA" 在 java 中看到很多示例代码,但在 C# 中我可以看到首先我们使用 SHA256 对数据进行哈希处理,然后我们使用 RSACryptoServiceProvider 对哈希进行签名。
我的问题是:
在C#中我们有"SHA256withRSA"的单独算法,如果是,请帮助提供示例代码。
如果不是,那么在 C# 中实现它的更好方法是什么?
请勿使用 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));
...
}
首先,您需要一对密钥。要生成密钥对,您可以执行以下操作并使用 OpenSSL:
生成私钥
openssl genrsa -out my-private-key.pem 2048
生成 public 证书
openssl req -new -key my-private-key.pem -x509 -days 36500 -out my-public-cert.pem
生成 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
的引用
我尝试了针对我的查询的搜索解决方案,但找不到我正在寻找的匹配项,这是非常基本的,但为了让我更好地理解,我将在查询下方发布。
我想使用 "SHA256withRSA" 算法对我的字符串进行编码和签名。我可以使用 "SHA256withRSA" 在 java 中看到很多示例代码,但在 C# 中我可以看到首先我们使用 SHA256 对数据进行哈希处理,然后我们使用 RSACryptoServiceProvider 对哈希进行签名。
我的问题是:
在C#中我们有"SHA256withRSA"的单独算法,如果是,请帮助提供示例代码。
如果不是,那么在 C# 中实现它的更好方法是什么?
请勿使用 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));
...
}
首先,您需要一对密钥。要生成密钥对,您可以执行以下操作并使用 OpenSSL:
生成私钥
openssl genrsa -out my-private-key.pem 2048
生成 public 证书
openssl req -new -key my-private-key.pem -x509 -days 36500 -out my-public-cert.pem
生成 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
的引用