2017-12-03 4 views
0

Ein PHP-Code haben die Nachricht (mit phpseclib 2.0) zu unterschreiben:Zeichen mit PHP, überprüfen mit C#

function sign($plaintext, $key, $password) { 
    $rsa = new RSA(); 

    $rsa->setPassword($password); 
    $rsa->loadKey(file_get_contents($key)); 

    $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); 
    $signature = $rsa->sign(hash('sha256', $plaintext)); 

    return base64_encode($signature); 
} 

öffentlichen und privaten Schlüsseln Format PEM. Ich muss diese Signatur mit C# überprüfen. Ich versuche, diesen Code, aber es gibt false zurück:

public static bool VerifyData(string originalMessage, string signedMessage, RSAParameters publicKey) 
{ 
    bool success = false; 
    using (var rsa = new RSACryptoServiceProvider()) 
    { 
    var encoder = new UTF8Encoding(); 
    byte[] bytesToVerify = encoder.GetBytes(originalMessage); 
    byte[] signedBytes = Convert.FromBase64String(signedMessage); 
    try 
    { 
     rsa.ImportParameters(publicKey); 

     SHA256Managed Hash = new SHA256Managed(); 

     byte[] hashedData = Hash.ComputeHash(bytesToVerify); 
     success = rsa.VerifyData(hashedData, CryptoConfig.MapNameToOID("SHA256"), signedBytes); 
    } 
    catch (CryptographicException e) 
    { 
     Console.WriteLine(e.Message); 
    } 
    finally 
    { 
     rsa.PersistKeyInCsp = false; 
    } 
    } 
    return success; 
} 

Verbrauch:

RSACryptoServiceProvider rsa = PemKeyUtils.PemKeyUtils.GetRSAProviderFromPemFile("public.key"); 
MessageBox.Show(VerifyData("my message", @"ZpQMPYlMIgME/H0sRYBnyEf/yJ/eBc5bznYZ2nMFn/I6Ts3u8P3x0QgzbUxPnhUgfKhcrEC2UgffyzWzCfwT3Bs+lm6Q89N5bkWK08WKnWaFxr2GQ6+gNyPyUKUgfy851xIHU7EMR6bZt/IndPC+lAAXSxxddPwLelrI8ktgyMVvMUzfCh3AeNCBuY5sSRwkAKH2myPBThJKNjKSZVEb4tO4oiPPWlBuifqmWvbQeMFuKANY0dZNCUFVjlnkaHnwVNzVs1BhNTEML2MKmWvKofafbtcG8J1F+7PapppZwT7OFqhosCSrrzRX49cR4y/7b0syJozmJSebKDpy6FPefA==", rsa.ExportParameters(false)).ToString()); 

PemKeyUtils Klasse von this answer.

Was ist los? Wie kann ich die Signatur mit C# überprüfen?

Antwort

1

VerifyData() berechnet den Hash selbst, sodass Sie die Daten zweimal in Ihrem C# -Code hashed haben. Stellen Sie einfach die Daten direkt an VerifyData(), ohne es selbst zu hashen.

EDIT: Ok, jetzt sehe ich, dass Sie es auch zweimal auf der PHP-Seite, das erste Mal mit SHA1 und das zweite Mal mit SHA256. Hash es einfach einmal, mit SHA256, einfach wie zeigt in the examples.

function sign($plaintext, $key, $password) { 
    $rsa = new RSA(); 

    $rsa->setPassword($password); 
    $rsa->loadKey(file_get_contents($key)); 

    $rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1); 
    $rsa->setHash('sha256') 
    $signature = $rsa->sign($plaintext); 

    return base64_encode($signature); 
} 
+0

Nun änderte ich 'rsa.VerifyData (hashedData, CryptoConfig.MapNameToOID ("SHA256"), signedBytes);' auf 'rsa.VerifyData (bytesToVerify, CryptoConfig.MapNameToOID ("SHA256"), signedBytes); ', aber es gibt immer noch falsch zurück – Ranx

Verwandte Themen