Мне необходимо отправить запрос в банк, который содержит код подтверждения $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));
$verified возвращает ИСТИНА.
Однако банк отвечает: «Неверная подпись». Есть еще идеи?
Изменить:
Технические характеристики
Расчет управляющего кода 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, н)
Где: || — операция добавления строки x1, x2, …, xn — параметры запроса p — функция длины параметра. Длина — это число в виде трехзначной строки, d — секретный показатель RSA, n — модуль RSA. Подпись рассчитывается в соответствии со стандартом PKCS1 (RFC 2437).
mcrypt
илиopenssl
. - person Marc B   schedule 20.05.2011