Unterschrift mit SHA256
Ich habe eine smartcard und ich muss signieren eine Datei mit diesem.
Das ist ein großes problem, da sehe ich in stackover.
Konnte ich nicht verwenden RSACryptoServiceProvider, bkz es keine Unterstützung für RSA-SHA256 alogrithm.
Zuerst habe ich verwendet CAPICOM.dll wie code ist unten,
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);
Aber es gibt nicht einen öffentlichen Schlüssel zu validieren meiner Signatur Wert, ich couldnt get eine Validierung der wichtigsten aus capicom.dll.
Und nach ,
Ich verwendet, X509Certificate2-und RSACryptoServiceProvider wie code unten
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);
Funktioniert es , aber ich muss signieren mit RSA-SHA256-Algorithmus.
Wenn ich changw hash-Algorithmus wie diese
byte[] response = csp.SignData(data, CryptoConfig.MapNameToOID("SHA256"));
Ich bin immer ein
Fehler : "unbekannter Fehler".
Das ist mein problem,
Was ist die Lösung eignet sich auch , oder welche Bibliothek soll ich benutzen ??
Vielen Dank für jeden Rat..
InformationsquelleAutor Turgay Gençer | 2012-05-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
RSACryptoServiceProvider funktioniert mit SHA2-basierte Signaturen, aber Sie haben, um zu investieren einige Mühe in Sie.
Wenn Sie ein Zertifikat verwenden, um Ihre RSACryptoServiceProvider es wirklich ankommt, was die zugrunde liegenden CryptoAPI-Anbieter. Standardmäßig, wenn Sie ein Zertifikat erstellen, mit "makecert", es ist "RSA-FULL", die nur SHA1 unterstützt hashes für die Signatur. Sie müssen das neue "RSA-AES" ein, unterstützt die SHA2.
So, können Sie Ihr Zertifikat mit einer zusätzlichen option: -sp "Microsoft Enhanced RSA und AES Cryptographic Provider" (oder ein äquivalent -sy-24) und dann dein code Aussehen würde (in .NET 4.0):
Wenn Sie nicht die Weise ändern, die Ihr Zertifikat ausgestellt wurde, es ist ein semi-ligitimate umgehen, basiert auf der Tatsache, dass standardmäßig RSACryptoServiceProvider erstellt mit Unterstützung für den SHA2. So, der folgende code würde auch funktionieren, aber es ist ein bisschen hässlicher:
(was dieser code macht es erstellt eine neue RSACryptoServiceProvider und importiert den Schlüssel von dem einen bekamen wir von dem Zertifikat)
Hoffe, Sie finden diese hilfreich.
InformationsquelleAutor Kastorskij