2016-03-31 17 views
0

SHA1 şifrelemeli ECDSA kullanıyorum çünkü bir masaüstü uygulaması için lisans etkinleştirme yapmaya çalışıyorum. Bunun için bilgisayar bilgisi verdiğim bir PHP sunucusu kullanıyorum ve sunucu bana genel anahtarı veriyor ve ardından C# içindeki verileri doğrulamak istiyorum. cryptographicexception Parametre hatalı

PHP bu ortak anahtar oluşturulan:

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

: Prosedür nerede olduğunu bu

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

almak için http://securitydriven.net/inferno/ buradan kod kullanılmış

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

Sorun şu ki bu satırda "cryptographicexception parametrenin yanlış" istisnası var:

CngKey dsaKeyPublic2 = thePublicKeyToBytes.ToPublicKeyFromBlob(); 
Ben inferno genel anahtarını gösteremez

ama ben yanlış yapıyorum nerede onların anahtarın uzunluğu 384. Bu Is olduğunu gördü? Oluşturulan ortak anahtarın uzunluğu?

cevap

1

Genel anahtarınız 52 bayt uzunluğundadır - çok kısa. Nasıl üretiyorsun?
ToPublicKeyFromBlob() yöntemi, return CngKey.Import(byteArray, CngKeyBlobFormat.EccPublicBlob) için bir kısayoldur - yalnızca Ecc tabanlı anahtarlarda ve .NET tarafından oluşturulanlarda çalışır. Inferno, P384 eğrisi üzerinden ECC anahtarlarını kullanır; bu, her bir genel anahtarın, toplam 104 bayt için 48 * 2 = 96 bayt artı 8 başlık baytı (here açıklandığı gibi) anlamına gelir.

+0

Anahtar, bir secp112r1 kaldırımına sahip bir PHP algoritması tarafından oluşturuldu. Inferno bu tür anahtarı destekliyor mu? –

0
Andrei, Inferno yalnızca NIST P-384 eğrisini kullanır. Daha da önemlisi, .NET framework tarafından desteklenen tek eğri (kutudan çıktığında) P-256, P-384 ve P-521'dir.