Как декодировать в PHP RSA OAEP, закодированный в Javascript - PullRequest
0 голосов
/ 14 июня 2019

Итак, у меня есть некоторые проблемы с шифрованием / дешифрованием ...

Я шифрую данные в javascript благодаря node-forge и пытаюсь расшифровать их в PHP благодаря openssl_private_decrypt.

На стороне PHP я использую заполнение «OPENSSL_PKCS1_OAEP_PADDING». Итак, на стороне JavaScript я попытался настроить forge для шифрования данных с помощью RSA-OAEP.

И когда я пытаюсь расшифровать сообщение на стороне PHP, у меня появляются следующие ошибки:

ошибка: 04099079: подпрограммы rsa: RSA_padding_check_PKCS1_OAEP_mgf1: ошибка декодирования oaep ошибка: 04065072: подпрограммы rsa: rsa_ossl_private_decrypt: проверка заполнения не выполнена

Я пытался настроить шифрование с помощью дайджеста сообщения sha1 и параметра sha1 для mgf1. Я также пытался без какой-либо опции (если я помню, кузница использует SHA256 по умолчанию). Но делать нечего, у меня всегда одна и та же ошибка…

Javascript

const pubkey = `-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
`;
const privkey = `-----BEGIN PRIVATE KEY-----
...
-----END PRIVATE KEY-----
`;
let publicKey = forge.pki.publicKeyFromPem(pubkey);
let key = forge.random.getBytesSync(32);
let encKey = publicKey.encrypt(key, 'RSA-OAEP', {
        md: forge.md.sha1.create(),
        mgf1: {
          md: forge.md.sha1.create()
        }
      });
let b64Key = encodeURIComponent(btoa(enckey));

Затем я отправляю ключ в URL с параметром "xcem", благодаря HttpClient. И я получаю это на PHP.

PHP

$privKey = "";
$b64Key = urldecode($_GET['xcem']);
$encKey = base64_decode($b64Key);
$key = null;
if (!openssl_private_decrypt($encKey, $key, file_get_contents('/keys/openssl_private.key'), OPENSSL_PKCS1_OAEP_PADDING)) 
{
    $errorssl = [];
    while ($error = openssl_error_string()) {
        $errorssl[] = $error;
    }
    throw new Exception("Erreur lors du décryptage du message ! " . json_encode($errorssl));
}

Когда я отправляю данные между двумя PHP-серверами, проблем не возникает ...
Но я не могу заставить его работать между JS и PHP ... Мне нужна помощь ^^

1 Ответ

0 голосов
/ 14 июня 2019

ооочень…
После некоторых тестов и головных болей я обнаружил проблему ... В своем исходном коде (здесь не тот) я отправил ключ, вектор инициализации, подпись и зашифрованные данные ...
Но в моем PHP я попытался расшифровать подпись ... Я не отправил данные в правильном порядке ...
Мой плохой ...

...