2012-05-20 76 views
4

我有一个智能卡,我需要用这个签名文件。 这是一个很大的问题,因为我在stackover看到。使用SHA256签名

我不能使用RSACryptoServiceProvider,bkz它不支持RSA-SHA256 alogrithm。

起初,我用的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一个验证关键。

,后,

我用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算法签署。 当我changw哈希算法这样

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

我米得到一个

错误: “未指定的错误”。

那是我的问题, 什么是溶剂,或者我应该使用哪个库?

感谢您的任何建议..

回答

12

的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,并从我们从证书得到了一个导入键)

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")); 

希望你找到这个有帮助。

+0

对于第二个解决方法(从证书中将证书导入到新的csp中),这对硬件密钥的工作方式如何?这些密钥可导出吗? – ezile

相关问题