2016-03-31 20 views
0

Ich benutze ECDSA mit SHA1-Verschlüsselung, weil ich versuche, eine Lizenzierung für eine Desktop-Anwendung zu aktivieren. Dazu benutze ich einen PHP-Server, dem ich PC-Informationen gebe und der Server gibt mir den Schlüssel und dann möchte ich die Daten in C# validieren.cryptographicexception der Parameter ist falsch

I erzeugt diesen öffentlichen Schlüssel in PHP:

"-----BEGIN PUBLIC KEY----- 
MDIwEAYHKoZIzj0CAQYFK4EEAAYDHgAEKzL3PFVVo3IWftdEYmwiSO/4zULGM/wB 
8BrLjQ== 
-----END PUBLIC KEY-----"; 

ich den Code von hier verwendet http://securitydriven.net/inferno/ dieser

byte[] thePublicKeyToBytes = GetBytesFromPEM(thePublicKey2, "PUBLIC KEY"); 
CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob(); 

byte[] theRestToBytes = GetBytes(theRestInBinary); 
byte[] meinData = GetBytes("Blabla"); 

using (var ecdsa = new ECDsaCng(dsaKeyPublic2) { HashAlgorithm = CngAlgorithm.Sha1 }) // verify DSA signature with public key 
{ 
    if (ecdsa.VerifyData(meinData, theRestToBytes)) MessageBox.Show("Signature verified."); 
    else MessageBox.Show("Signature verification failed."); 
} 

zu erhalten, wo die Prozedur ist:

byte[] GetBytesFromPEM(string pemString, string section) 
{ 
    var header = String.Format("-----BEGIN {0}-----", section); 
    var footer = String.Format("-----END {0}-----", section); 

    var start = pemString.IndexOf(header, StringComparison.Ordinal) + header.Length; 
    var end = pemString.IndexOf(footer, start, StringComparison.Ordinal) - start; 

    if (start < 0 || end < 0) 
    { 
     return null; 
    } 

    return Convert.FromBase64String(pemString.Substring(start, end)); 
} 

Die Problem ist, dass ich diese Ausnahme "cryptographicexception der Parameter ist falsch" in dieser Zeile:

CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob(); 

ich nicht das Inferno des öffentlichen Schlüssel zeigen kann, aber ich sah, dass die Länge ihres Schlüssels ist 384. Ist das, wo ich es falsch mache? Die Länge des generierten öffentlichen Schlüssels?

Antwort

1

Ihr öffentlicher Schlüssel ist 52 Byte lang - er ist zu kurz. Wie erzeugst du es?
Die ToPublicKeyFromBlob()-Methode ist eine Verknüpfung für return CngKey.Import(byteArray, CngKeyBlobFormat.EccPublicBlob) - es funktioniert nur auf ECC-basierte Schlüssel und die von .NET generiert. Inferno verwendet ECC-Schlüssel über P384-Kurve, was bedeutet, dass jeder öffentliche Schlüssel 48 * 2 = 96 Bytes plus 8 Header-Bytes (wie beschrieben here) für insgesamt 104 Bytes hat.

+0

Der Schlüssel wurde von einem PHP-Algorithmus mit einem secp112r1 Bordstein generiert. Unterstützt Inferno diesen Schlüsseltyp? –

0

Andrei, Inferno verwendet nur die NIST P-384-Kurve. Noch wichtiger ist, dass die einzigen von .NET Framework (out-of-the-box) unterstützten Kurven P-256, P-384 und P-521 sind.