指定された文字列形式の確認コード$vk_macを含むクエリを銀行に送信する必要があります。コードは、公開鍵で暗号化され、base64形式で表示されるSHA1ハッシュとRSAである必要があります。残念ながら、これまでのところ、私は失敗しています-銀行は私に「間違った署名」を与え、私が得ているすべての情報を教えてくれます。
私が持っているのはこれです:
$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に設定してみましたが運が悪かったです。開始$vk_mac文字列が正しくフォーマットされ、必要なすべての詳細が含まれていることを99.9%確信しています。
誰かが私が間違っていることを知っていますか?ありがとうございました。
編集:
コードを次のように変更しました(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は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はパラメータの長さの関数です。長さは3桁の文字列形式の数値です。dはRSAシークレット指数です。nはRSAモジュラスです。署名はPKCS1標準(RFC 2437)に従って計算されます。