Мне необходимо отправить запрос в банк, который содержит проверочный код $ vk_mac в указанном формате строки.Код должен быть хэшем SHA1 и RSA, зашифрованным моим открытым ключом и представленным в формате base64.К сожалению, до сих пор я потерпел неудачу - банк выдает мне «Неправильную подпись» и эту всю информацию я получаю.
Вот что у меня есть:
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents("private_key.pem"));
$rsa->loadKey($rsa->getPublicKey());
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$encrypted = $rsa->encrypt(sha1($vk_mac));
$vk_mac = base64_encode($encrypted);
private_key.pem Вот мой личный ключ в виде простого текста.Я попытался установить режим шифрования CRYPT_RSA_ENCRYPTION_OAEP без удачи.Я на 99,9% уверен, что начальная строка $ vk_mac отформатирована правильно и содержит все необходимые данные.
Кто-нибудь знает, что я могу делать неправильно?Спасибо.
Редактировать:
Я изменил код на это (где vk_mac - это начальная отформатированная строка, которую нужно подписать, и private_key.pem - мой расшифрованный закрытый ключ):
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents("private_key.pem"));
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$hashed = $rsa->hash->hash($vk_mac);
$encrypted = $rsa->sign($hashed);
$signature = base64_encode($encrypted);
Я могу сказать, что сгенерированная подпись верна, поскольку, когда я делаю это:
$rsa->loadKey($rsa->getPublicKey());
$verified = $rsa->verify($hashed, base64_decode($signature));
$ с подтверждением возвращает TRUE.
Банк, однако, отвечает "Неверная подпись".Есть еще идеи?
Редактировать:
Спецификация
Расчет кода управления VK_MAC
VK_MAC, для электронной подписи, используемой в запросе, для проверки и подтверждения используемой версии алгоритма, указанной в параметре VK_VERSION.В это время используется версия 008.VK_MAC представлен как параметр запроса в кодировке BASE64.
Версия 008
Значение функции MAC008 рассчитывается с использованием алгоритма открытого ключа RSA.Также учитываются значения пустых полей - «000».
MAC008 (x1, x2,…, xn): = RSA (SHA-1 (p (x1) || x1 || p (x2) || x2 ||… || p (xn) || xn), d, n)
Где: ||является операцией добавления строки x1, x2,…, xn, параметры запроса p являются функцией длины параметра.Длина представляет собой число в виде трехзначной строки d - секретный показатель RSA n - модуль RSA Сигнатура рассчитывается в соответствии со стандартом PKCS1 (RFC 2437).