gpt4 book ai didi

c# - 将商店中的证书用于 RSACryptoServiceProvider

转载 作者:太空宇宙 更新时间:2023-11-03 23:08:03 25 4
gpt4 key购买 nike

我对商店的证书有疑问。在我的应用程序中,用户可以使用文件中的证书或商店中的证书。加载证书后,我使用证书作为签名数据。

可以使用文件中的证书,但我不能使用商店中的等效证书。

签名代码:

// Sign data
using (RSACryptoServiceProvider csp = new RSACryptoServiceProvider())
{
byte[] dataToSign = Encoding.UTF8.GetBytes(plainText);
csp.ImportParameters(((RSACryptoServiceProvider)_certPopl.PrivateKey).ExportParameters(true));
byte[] signature = csp.SignData(dataToSign, "SHA256");
// Verify signature
if (!csp.VerifyData(dataToSign, "SHA256", signature))
throw new Exception("Nepodařilo se vytvořit platný podpisový kód poplatníka.");
PKP = Convert.ToBase64String(signature);
}

从文件中读取证书代码:

X509Certificate2Collection certStore = new X509Certificate2Collection();
certStore.Import(fileName, password, X509KeyStorageFlags.Exportable);
foreach (X509Certificate2 cert in certStore)
{
// Find the first certificate with a private key
if (cert.HasPrivateKey)
{
_certPopl = cert;
break;
}
}

从商店读取证书的代码。从商店加载证书后,我无法签署数据:

public void LoadCertificate(string certificateName, DateTime notAfter, string password)
{
var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
store.Open(OpenFlags.MaxAllowed);
foreach (var certificate in store.Certificates)
{
if (certificate.FriendlyName.Equals(certificateName) && certificate.NotAfter.Equals(notAfter))
{
//X509Certificate2Collection certStore = new X509Certificate2Collection();
//certStore.Import(certificate.Export(X509ContentType.SerializedCert), password, X509KeyStorageFlags.Exportable);
//_certPopl = certStore[0];

X509Certificate2Collection certStore = new X509Certificate2Collection();
certStore.Import(certificate.GetRawCertData());
foreach (X509Certificate2 cert in certStore)
{
// Find the first certificate with a private key
if (cert.HasPrivateKey)
{
_certPopl = cert;
break;
}
}

break;
}
}
}

我没有使用证书的经验。但我需要等同于从商店获取证书以进行签名。

System.Security.Cryptography.CryptographicException 在 ExportParameters(true) 上抛出。Exception 的附加信息:Key not valid for use in specified state.

谢谢。

最佳答案

如果您可以使用 .NET 4.6,这就简单多了,访问私钥的新方法对于 SHA-2 签名更加可靠:

using (RSA rsa = cert.GetRSAPrivateKey())
{
if (rsa == null)
{
throw new Exception("Wasn't an RSA key, or no private key was present");
}

bool isValid = rsa.VerifyData(
Encoding.UTF8.GetBytes(plainText),
signature,
HashAlgorithmName.SHA256,
RSASignaturePadding.Pkcs1);

if (!isValid)
{
throw new Exception("VerifyData failed");
}
}

关于c# - 将商店中的证书用于 RSACryptoServiceProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40470969/

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