2017-12-03 1 views
0

A를 확인합니다. 이 서명을 C#으로 확인해야합니다. 이 코드를 시도하고 있지만, false를 돌려 :로그인 메시지 (phpseclib 2.0을 사용)에 서명하는 PHP 코드가 C#을

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

사용법 : this answer에서

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 클래스를.

무엇이 잘못 되었나요? C#으로 서명을 확인하려면 어떻게해야합니까?

답변

1

VerifyData()은 해시 자체를 계산하므로 C# 코드에서 데이터가 두 번 해시됩니다. 자신을 해싱하지 않고 VerifyData()에 직접 데이터를 제공하면됩니다.

EDIT : 좋아, 이제는 SHA1을 처음으로 두 번, SHA256을 사용하여 PHP 쪽에서 두 번 해시하는 것을 볼 수 있습니다. SHA256을 사용하여 한 번만 해시합니다 (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

글쎄, 나는'변경 rsa.VerifyData (hashedData, CryptoConfig.MapNameToOID ("SHA256"), signedBytes) rsa.VerifyData (bytesToVerify, CryptoConfig.MapNameToOID ("SHA256"), signedBytes)'에'; '하지만 여전히 false를 반환합니다. – Ranx