Проверка подписи RSA в php не работает при подписи из c# кода - PullRequest
0 голосов
/ 06 января 2020

Я подписываю данные от клиента в c# и затем передаю данные на веб-сервер php, который должен вернуть Verified, если данные не были подделаны, но всегда возвращают Unverified. Я использую http://phpseclib.sourceforge.net/rsa/intro.html для проверки данных RSA. Это функция c#, которая подписывает данные:

public string SignRSA(string privateKey, string rawData)
{
    ASCIIEncoding ByteConverter = new ASCIIEncoding();
    byte[] originalData = ByteConverter.GetBytes(rawData);
    RSACryptoServiceProvider RSAalg = new RSACryptoServiceProvider();
    RSAalg.FromXmlString(privateKey);
    return Convert.ToBase64String(RSAalg.SignData(originalData, new SHA256Managed()));
}

Вот код php, который проверяет данные:

$key = str_replace("%3c", "<", $_POST['PublicKey']);
$key = str_replace("%3e", ">", $key);
$key = str_replace("%3d", "=", $key);
$key = str_replace("%2f", "/", $key);
$key = str_replace("%2b", "+", $key);
$sig = str_replace("%2f", "/", $_POST['Signature']);
$sig = str_replace("%2b", "+", $sig);
$rsa = new Crypt_RSA();
$rsa->loadKey($key);
$rsa->setPublicKey();
$rsa->setHash(sha256);
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
//$publickey = $rsa->getPublicKey();
echo $rsa->verify(unpack("C*", $_POST["Text"]), base64_decode($sig)) ? 'verified' : 'unverified';

Все функции str_replace используется, потому что / заменяются на% 2f, = заменяются на% 3d, и т. д. c.

...