Как расшифровать данные с помощью класса phpseclib Crypt_RSA, которые были зашифрованы с помощью travist/jsencrypt

я использую сервер linux ubuntu с nginx, mysql, php7.3

  1. Я пытаюсь зашифровать сообщение с помощью открытого ключа rsa, сгенерированного на стороне сервера с помощью phpseclib (http://phpseclib.sourceforge.net/)
<?php
//session_start();
$rsa = new Crypt_RSA(); 
extract($rsa->createKey()); 
$rsa->loadKey($privatekey); 
$_SESSION['pr']=(empty($_SESSION['pr'])) ? $rsa : $_SESSION['pr'];
$rsa->loadKey($publickey);
$_SESSION['pu']=(empty($_SESSION['pu'])) ? $rsa : $_SESSION['pu'];
?>
  1. Затем я пытаюсь использовать сгенерированный ключ для шифрования и расшифровки сообщения с библиотекой JSEncrypt (https://github.com/travist/jsencrypt), пока работает
<br /><input type="button" value="Show Encrypted" onclick="alert(crypted);"/>&nbsp;<input type="button" value="Show Decrypted" onclick="alert(decrypt);"/><br />
<script type="text/javascript">
var crypt = new JSEncrypt();
var public_key = '<?php echo der2pem($_SESSION["pu"], "RSA PUBLIC KEY";?>';
crypt.setPublicKey(public_key);
var input='i\'ve got a power';
var crypted=crypt.encrypt(input);
var decrypt=crypt.decrypt(crypted);
alert(crypted);
alert(decrypt);
</script>
  1. И, наконец, я пытаюсь расшифровать сообщение JSEencrypted с закрытым ключом, используя реализацию phpseclib rsa. Ожидаю получить оригинальное незашифрованное сообщение, но все, что я получил, это Примечание: ошибка дешифрования в enc/RSA.php в строке 2507. Пожалуйста, помогите мне, я пытался поместить декодированную строку b64, шестнадцатеричную строку, пытался удалить косые черты или символы +, и ничего не помогло. . Направьте меня в правильном направлении, пожалуйста, я застрял, как сука. Заранее спасибо!
<?php
// here i put the crypted var showed in alert
$var=base64_decode('##put your variable here');

$rsa->loadKey($_SESSION['pr']);
$dec=$rsa->decrypt($var);
echo '<br />'.$dec;
?>

Эй, Нойберт! Спасибо за ответ, вы действительно помогли мне выяснить точную проблему, которая у меня возникла: когда я использую функцию crypt.encrypt без установки ключа, сначала она сама создает пару ключей, а затем устанавливает ее сама, поэтому я не буду в состоянии расшифровать сообщение, используя ключи, сохраненные в моем сеансе php. Но следующей проблемой был формат pem rsa, который требуется для функции crypt.setKey. Итак, теперь я хотел бы спросить, знаете ли вы, как преобразовать $rsa в кодировке b64 в формат pem, я пытался добавить соответствующие строки с обеих сторон ключа, но это не помогает. Должен ли я взорвать его, чтобы разделить на 64-байтовые строки с «\ n» в конце каждой? Такая функция была найдена здесь


person Olympic Bear    schedule 15.09.2019    source источник


Ответы (3)


Попробуйте добавить это перед выполнением фактической операции расшифровки в phpseclib:

$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

По умолчанию phpseclib использует более безопасное, но менее распространенное заполнение OAEP.

person neubert    schedule 15.09.2019
comment
Разве вы не знаете, можно ли переключить заполнение, используемое по умолчанию в jsencrypt, с PSKC1 на OEAP? - person Olympic Bear; 21.09.2019

как сказал Нойберт, мне пришлось добавить эту строку $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); прежде чем выполнять операции шифрования, а затем преобразовать ключ RSA из формата DER в формат PEM, используя функцию из здесь перед настройкой в ​​crypt.setPublicKey():

<?php
function der2pem($der_data, $type='CERTIFICATE') {
   $pem = chunk_split(base64_encode($der_data), 64, "\n");
   $pem = "-----BEGIN ".$type."-----\n".$pem."-----END ".$type."-----\n";
   return $pem;
}

?>

Спасибо!!!

person Olympic Bear    schedule 21.09.2019

У меня была такая же проблема, и это было из-за проблемы с кодировкой, поэтому убедитесь, что на стороне php

$enc =   base64_decode ($request->encrypted);
person A.AlHessan    schedule 28.06.2020