использование Cryp_RSA в phpseclib для шифрования кода подтверждения банка - PullRequest
2 голосов
/ 20 мая 2011

Мне необходимо отправить запрос в банк, который содержит проверочный код $ 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).

Ответы [ 3 ]

3 голосов
/ 21 мая 2011

Что если вы попробуете $ rsa-> sign ()? PKCS # 1 не подписывает, просто шифруя хеш, и если ваш банк использует совместимое решение RSA, они, вероятно, тоже этого не делают.

2 голосов
/ 23 мая 2011

Код был почти правильным - мне не нужно было его снова хэшировать (спасибо @Accipitridae).

Решение состояло в том, что идентификатор продавца должен быть прописным, а не прописным, как указано.Он не говорит нигде в спецификации, что он также должен быть в верхнем регистре.Ницца.

0 голосов
/ 21 мая 2011

Как уже упоминалось выше, вы можете легко это сделать с помощью openssl. Вот как я это сделал.

$hashed = sha1($vk_mac);
openssl_public_encrypt($vk_mac, $encrypted, ($pubkey));
$vk_mac = base6$_encode($encrypted);

Подробнее читайте в документации по openssl_public_encrypt .

...