2017-02-03 2 views
0

Мне нужно пройти аутентификацию через скрипт PHP на удаленном веб-сайте, а на веб-сайте используется шифрование RSA на основе JS для паролей. Вот код с сайта:JavaScript RSA-шифрование для PHP

function rsa_encrypt(strPlainText) { 
    var strModulus = "some_random_string"; 
    var strExponent = "10001"; 
    var rsa = new RSAKey(); 
    rsa.setPublic(strModulus, strExponent); 
    var res = rsa.encrypt(strPlainText); 
    if (res) { 
     return res; 
    } 
    return false; 
} 

просмотрел много тем на этом сайте, и обнаружил, что рекомендуемый способ заключается в использовании phpseclib (если есть еще один, дайте мне знать). Однако, используя базовый пример от http://phpseclib.sourceforge.net/rsa/examples.html#encrypt,enc2, я получаю только пустую страницу. Я ввел some_random_string в $rsa->loadKey('...'); - не уверен, что я сделал это правильно? Однако в этом примере я не вижу места для ввода strExponent (что равно 10001).

Так что я попробовал другое решение - Encrypt and Decrypt text with RSA in PHP и изменил мой код, чтобы посмотреть следующее:

include('Crypt/RSA.php'); 

$privatekey = "some_random_string"; 

$rsa = new Crypt_RSA(); 
$rsa->loadKey($privatekey); 

$plaintext = new Math_BigInteger('10001'); 
echo $rsa->_exponentiate($plaintext)->toBytes(); 

Однако, я получаю эту ошибку:

Fatal error: Call to a member function abs() on null in Math\BigInteger.php on line 1675 

Раствор отправил некоторое время назад, так Я предполагаю, что в это время что-то изменилось в библиотеке phpseclib, и я просто не уверен, как изменить код.

ответ

0

Популярные форматы для ключей RSA обычно содержат как экспоненту, так и модуль внутри них. См., Например, мой ответ на I understand the mathematics of RSA encryption: How are the files in ~/.ssh related to the theory? для более подробного обсуждения одного конкретного типа ключевого формата.

Если у вас есть показатель степени и по модулю, как различные значения пытаются это сделать:

$rsa->loadKey([ 
    'e' => new Math_BigInteger('10001', 16), 
    'n' => new Math_BigInteger('some_random_string', 16); 
]); 

Обратите внимание на , 16 бит. 65537 (10001 в шестнадцатеричном виде) является общим показателем RSA. Math_BigInteger предполагает, по умолчанию, что переданное ему число находится в базе-10, если вы специально не указали это иначе. Одним из требований RSA является то, что e может быть взаимно прост в любом phi (n) или lcm (n). 65537 тривиально взаимно, потому что он является премьер. 10001 не является простым. Его можно разделить на 73 * 137.

Смежные вопросы