Я подписываю данные от клиента в 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.