gpt4 book ai didi

rsa - 使用 SHA256 签名

转载 作者:行者123 更新时间:2023-12-02 19:15:31 24 4
gpt4 key购买 nike

我有一张智能卡,我需要用它签署一个文件。正如我在 stackover 中看到的那样,这是一个大问题。

我无法使用 RSACryptoServiceProvider,因为它不支持 RSA-SHA256 算法。

首先我使用了 CAPICOM.dll ,如下面的代码,

SignedData sed = new SignedData();
sed.Content = "a"; // data to sign
Signer ser = new Signer();
ser.Certificate = cc;
string singnn = sed.Sign(ser, false, CAPICOM_ENCODING_TYPE.CAPICOM_ENCODE_BASE64);

但是没有公钥来验证我的签名值,我无法从 capicom.dll 获取验证 key 。

之后,

我使用了 X509Certificate2 和 RSACryptoServiceProvider ,如下面的代码,

        X509Certificate2 certificate = new X509Certificate2();
// Access Personal (MY) certificate store of current user
X509Store my = new X509Store(StoreName.My, StoreLocation.CurrentUser);
my.Open(OpenFlags.ReadOnly);

// Find the certificate we'll use to sign
RSACryptoServiceProvider csp = null;
foreach (X509Certificate2 cert in my.Certificates)
{
if (cert.Subject.Contains(certSubject))
{
// We found it.
// Get its associated CSP and private key
certificate = cert;
csp = (RSACryptoServiceProvider)cert.PrivateKey;
}
}
if (csp == null)
{
throw new Exception("No valid cert was found");
}

// Hash the data
SHA1Managed sha1 = new SHA1Managed();
UnicodeEncoding encoding = new UnicodeEncoding();
byte[] data = encoding.GetBytes(text);
byte[] hash = sha1.ComputeHash(data);

//byte[] data = Encoding.UTF8.GetBytes(text);
//HashAlgorithm sha = new SHA256Managed();
//byte[] hash = sha.TransformFinalBlock(data, 0, data.Length);

string key = csp.ToXmlString(false);
// Sign the hash
csp.PersistKeyInCsp = true;
byte[] response = csp.SignData(data, CryptoConfig.MapNameToOID("SHA1"));
string signbase64 = Convert.ToBase64String(response);

它可以工作,但我需要使用 RSA-SHA256 算法进行签名。当我像这样改变哈希算法时

byte[] response = csp.SignData(data, CryptoConfig.MapNameToOID("SHA256"));

我得到了

error : "unspecified error".

这就是我的问题,解决方案是什么,或者我应该使用哪个库??

感谢您的建议..

最佳答案

RSACryptoServiceProvider 确实可以使用基于 SHA2 的签名,但您必须投入一些精力。

当您使用证书获取 RSACryptoServiceProvider 时,底层 CryptoAPI 提供程序是什么确实很重要。默认情况下,当您使用“makecert”创建证书时,它是“RSA-FULL”,仅支持 SHA1 哈希签名。您需要支持 SHA2 的新“RSA-AES”。

因此,您可以使用附加选项创建证书:-sp“Microsoft 增强型 RSA 和 AES 加密提供程序”(或等效的 -sy 24),然后您的代码将如下所示(在 .NET 4.0 中):

var rsa = signerCertificate.PrivateKey as RSACryptoServiceProvider;
//
byte[] signature = rsa.SignData(data, CryptoConfig.CreateFromName("SHA256"));

如果您无法更改证书的颁发方式,有一个半合法的解决方法,该解决方法基于默认情况下创建的 RSACryptoServiceProvider 支持 SHA2 的事实。因此,下面的代码也可以工作,但它有点难看:(此代码的作用是创建一个新的 RSACryptoServiceProvider 并从我们从证书中获得的 key 导入 key )

var rsa = signerCertificate.PrivateKey as RSACryptoServiceProvider;
// Create a new RSACryptoServiceProvider
RSACryptoServiceProvider rsaClear = new RSACryptoServiceProvider();
// Export RSA parameters from 'rsa' and import them into 'rsaClear'
rsaClear.ImportParameters(rsa.ExportParameters(true));
byte[] signature = rsaClear.SignData(data, CryptoConfig.CreateFromName("SHA256"));

希望您觉得这有帮助。

关于rsa - 使用 SHA256 签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10673146/

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