2015-05-07 8 views
14

Ich weiß wenig über Kryptographie Ich habe große Probleme mit scheinbar einfachen Aufgaben.Wie verifiziert man Daten gegen die Signatur mit einem öffentlichen Schlüssel, der sha1ecdsa verwendet?

Ich habe .pem-Zertifikat, Datenbytes und Signatur dieser Daten. Ich möchte überprüfen, ob jemand die Daten geändert hat, indem er sie mit der Unterschrift abgeglichen hat.

Mein Versuch:

private bool VerifySignature(byte[] data, byte[] signature) 
{ 
    try 
    { 
    X509Certificate certificate = new X509Certificate("cert_filename.pem"); 
    if (certificate == null) 
     return false; 

    DSACryptoServiceProvider dsa = (DSACryptoServiceProvider)certificate.PublicKey.Key; 

    return dsa.VerifyData(data, signatureData); 
    } 
    catch 
    { 
    return false; 
    } 
} 

Aber es gibt mir einen Fehler

'Algorithmus von Zertifikaten Schlüssel wird nicht unterstützt' (System.NotSupportedException).

Wenn Sie ein geladenes Zertifikat anzeigen, heißt es, dass der Signaturalgorithmus 'sha1ecdsa' lautet.

Ich versuche nur Daten gegen Unterschrift zu verifizieren. Was fehlt mir hier? Ich würde es gerne ohne externe Lösungen machen, da es eine wirklich triviale Aufgabe zu sein scheint.

Update: Ich gleiche Funktionalität wie in unten Java-Code zu erreichen versuche:

private boolean verify(byte[] data, byte[] signature) 
{ 
    boolean isLicenseCorrect = false; 

    Signature sig = Signature.getInstance("SHA1WithECDSA"); 
    sig.initVerify(certificate.getPublicKey()); 
    sig.update(data); 

    return sig.verify(signature); 
} 
+0

nach Ihrem Update, wenn Sie den Java-Code in C# konvertieren möchten [Link] (http://dotnetslacker.com/articles/security/Hashing_MACs_and_Digital_Signatures_in_NET.aspx) könnte dies helfen, einen Blick –

Antwort

6

Obwohl DSA und ECDSA verwandt sind, sind sie nicht gleich. Warum nicht versuchen ECDsaCryptoServiceProvider? Beachten Sie, dass die ECDSA-Unterstützung für elliptische Kurven nur NIST-benannte Kurven enthält.

+0

Leider kann ich nicht auf diese Klasse zugreifen in meinem Windows Forms-Code. Ich habe nur ECDsa und ECDsaCng, von denen ich keine verwenden kann. – kasper

+0

OK, also * warum * kannst du diese Klassen nicht benutzen? Sie sollten ein besseres Ziel bereitstellen, da 'DSACryptoServiceProvider' einfach nicht funktioniert. Beachten Sie, dass ich Ihr Setup nicht habe (ich verwende nicht Windows Forms selbst, ich weiß nur Dinge über Krypto und was ich hier auf SO vorbeiziehen sehe). –

+0

Wie ich bereits erwähnt habe, weiß ich nicht viel über Krypto und kann nicht selbst herausfinden, wie ich meine Aufgabe lösen soll. Es gibt viele Artikel im Netz, die RSACryptoServiceProvider oder DSACryptoServiceProvider verwenden, aber ich konnte es nicht mit ihnen arbeiten lassen. – kasper

0

.NET 4.6.1 hinzugefügt verbesserte Unterstützung für ECDSA. Während ich kein Fan von Ihrem Catch-alles-und-Return-falsch bin, werde ich es zum Vergleich hier halten:

private bool VerifySignature(byte[] data, byte[] signature) 
{ 
    try 
    { 
     // new cannot return null, so no point in a null check. It would have thrown. 

     using (X509Certificate certificate = new X509Certificate("cert_filename.pem")) 
     using (ECDsa ecdsa = certificate.GetECDsaPublicKey()) 
     using (RSA rsa = certificate.GetRSAPublicKey()) 
     // Improved DSA is 4.6.2 
     { 
      // You said the cert was ECDSA-SHA1, but that doesn't mean the original data was. 
      // I assumed it was. 
      if (ecdsa != null) 
       return ecdsa.VerifyData(data, signature, HashAlgorithmName.SHA1); 

      if (rsa != null) 
       return rsa.VerifyData(data, signature, HashAlgorithmName.SHA1, RSASignaturePadding.Pkcs1); 

      return false; 
     } 
    } 
    catch 
    { 
     return false; 
    } 
} 

Beachten Sie, dass .NET 4.6 der RSA-Basisklasse in hat die Zeichen/Stellen Sie sicher, Methoden definiert, und in 4.6.1 wurde die ECDsa-Basisklasse ähnlich behandelt. Neuer Code sollte nicht über die * CryptoServiceProvider-Typen sprechen, es sei denn, vordefinierte benannte Schlüssel werden geladen.

Es ist auch erwähnenswert, dass die Get [Algorithm] PublicKey-Methoden null zurückgeben, wenn der öffentliche Schlüssel nicht von diesem Algorithmus-Typ ist, so dass eine Null-Überprüfung gewährleistet ist.