gpt4 book ai didi

c# - 使用 SHA256withRSA 的带有私钥签名数据的 X509Certificate2

转载 作者:行者123 更新时间:2023-11-30 22:57:38 33 4
gpt4 key购买 nike

这与X509Certificate2 from store with private key的答案有点相关.

似乎当我想使用 SHA256withRSA 时,我无法直接从证书的私钥使用服务提供商 - 我需要创建新的加密服务提供商:

  var bytes = new byte[] { 0, 1, 2, 3 };

//_cert - X509Certificate2 with private key
//csp1 is of type I need, but it won't work
var csp1 = _cert.PrivateKey as RSACryptoServiceProvider;

var cspParameters = new CspParameters
{
KeyContainerName = csp1.CspKeyContainerInfo.KeyContainerName,
KeyNumber = csp1.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2,
};

var csp2 = new RSACryptoServiceProvider(cspParameters);

//I can't use csp1 here - will throw "CryptographicException : Invalid algorithm specified."
//I can use csp1 with "SHA1" though
var signature = csp2.SignData(bytes, CryptoConfig.MapNameToOID("SHA256"));

我在这里找到了一些相关信息:

https://blogs.msdn.microsoft.com/shawnfa/2008/08/25/using-rsacryptoserviceprovider-for-rsa-sha256-signatures/

但是上面的解决方案是从评论部分摘录的,我真的不明白为什么我需要跳过箍才能使用一种常见的算法。所以我想问的是:

  • 为什么 csp1 不完全适用于 SHA256?
  • 像我一样创建 csp2 是否正确?
  • 在 .NET 中有更好/更新的方法吗?

如果需要,可以按如下方式生成带有私钥的证书:

openssl req -x509 -sha256 -newkey rsa:2048 -keyout ./temp/key.key -out ./temp/crt.crt -days 10 –nodes
openssl pkcs12 -export -out .\temp\cert.pfx -inkey .\temp\key.key –in .\temp\crt.crt

最佳答案

这完全取决于您的证书来自何处。就像 MSDN 评论说的那样,如果它来自 Microsoft Base Cryptographic Provider ,那么它将不适用于 SHA256。这个 CSP 于 1996 年推出了第一个版本的 CryptoAPI,并且不理解 SHA256,因为当时没有 SHA256。

优雅地检查和处理这个问题的方法是:

public byte[] SignData(RSACryptoServiceProvider csp, byte[] bytes)
{
byte[] sig = null;
if ((csp.CspKeyContainerInfo.ProviderType == PROV_RSA_FULL || csp.CspKeyContainerInfo.ProviderType == PROV_RSA_SCHANNEL) && !csp.CspKeyContainerInfo.HardwareDevice)
{
var cspParameters = new CspParameters
{
KeyContainerName = csp.CspKeyContainerInfo.KeyContainerName,
KeyNumber = csp.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2,
};
using (var csp2 = new RSACryptoServiceProvider(cspParameters))
{
sig = csp2.SignData(bytes, CryptoConfig.MapNameToOID("SHA256"));
}
}
else {
sig = csp.SignData(bytes, CryptoConfig.MapNameToOID("SHA256"));
}
return sig;
}

仅供引用,CryptoAPI 是 being deprecated赞成Cryptography API: Next Generation .在 C# 中用 CNG 做你想做的事情的一种方法是使用 System.Security.Cryptography.Cng :

...
using (RSA rsa = new RSACng())
{
byte[] signature = rsa.SignData(message, hashAlgorithm, paddingMode);
...
}

关于c# - 使用 SHA256withRSA 的带有私钥签名数据的 X509Certificate2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53449086/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com