Расшифровка RSA с помощью закрытого ключа с использованием phplib

Я шифрую данные на стороне клиента, используя pidcrypt-rsa с открытым ключом. Я хочу расшифровать его на стороне сервера с помощью php, я использую phpseclib, но я получаю следующую ошибку:

Ошибка дешифрования в C:\xampp*\Crypt\phpseclib0.3.8\Crypt\RSA.php в строке 2503

это мой код:

<?php
include 'Crypt/phpseclib0.3.8/Crypt/RSA.php';
....
$privateKey="-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgQCqGKukO1De7zhZj6+H0qtjTkVxwTCpvKe4eCZ0FPqri0cb2JZfXJ/DgYSF6vUp
wmJG8wVQZKjeGcjDOL5UlsuusFncCzWBQ7RKNUSesmQRMSGkVb1/3j+skZ6UtW+5u09lHNsj6tQ5
1s1SPrCBkedbNf0Tp0GbMJDyR4e9T04ZZwIDAQABAoGAFijko56+qGyN8M0RVyaRAXz++xTqHBLh
3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPEcvYCdm5dYq3XToLkkLv5L2
pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLcs55/mbSYxECQQDeAw6fiIQX
GukBI4eMZZt4nscy2o12KyYner3VpoeE+Np2q+Z3pvAMd/aNzQ/W9WaI+NRfcxUJrmfPwIGm63il
AkEAxCL5HQb2bQr4ByorcMWm/hEP2MZzROV73yF41hPsRC9m66KrheO9HPTJuo3/9s5p+sqGxOlF
L0NDt4SkosjgGwJAFklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5k
X6zk7S0ljKtt2jny2+00VsBerQJBAJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2epl
U9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhMCQBGoiuSoSjafUhV7i1cEGpb88h5NBYZzWXGZ
37sJ5QsW+sJyoNde3xH8vdXhzU7eT82D6X/scw9RZz+/6rCJ4p0=
-----END RSA PRIVATE KEY-----";
$rsa = new Crypt_RSA();
$rsa->loadKey($privateKey); // private key
echo $rsa->decrypt($ciphertext);
?>

EDIT1:

код JavaScript для шифрования:

function Encrypt(value) {
        var public_key  = '-----BEGIN PUBLIC KEY-----\n\
MIGfMA0GCSqGSIb4DQEBAQUAA4GNADCBiQKBgQDVd/gb2ORdLI7nTRHJR8C5EHs4\n\
RkRBcQuQdHkZ6eq0xnV2f0hkWC8h0mYH/bmelb5ribwulMwzFkuktXoufqzoft6Q\n\
6jLQRnkNJGRP6yA4bXqofKYj1yeMusIPyIb3CTJT/gfZ40oli6szwu4DoFs66IZp\n\
JLv4qxU9hqu6NtJ+8QIDAQAB\n\
-----END PUBLIC KEY-----';
        params = certParser(public_key);
        if(params.b64){
        var key = pidCryptUtil.decodeBase64(params.b64);
        //new RSA instance
        var rsa = new pidCrypt.RSA();
        //RSA encryption
        //ASN1 parsing
        var asn = pidCrypt.ASN1.decode(pidCryptUtil.toByteArray(key));
        var tree = asn.toHexTree();
        //setting the public key for encryption
        rsa.setPublicKeyFromASN(tree);
        crypted = rsa.encrypt(value);
        return pidCryptUtil.fragment(pidCryptUtil.encodeBase64(pidCryptUtil.convertFromHex(crypted)),64);
        }
        return 'error';
        }

EDIT2: я редактирую свой код:

$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey($privateKey); // private key
echo $rsa->decrypt(base64_decode($ciphertext));

EDIT3:

Я обновляю свой php-код, я больше не получаю ошибку, но она ничего не возвращает после расшифровки, в чем проблема?

$rsa = new Crypt_RSA();
        $private="<RSAKeyValue>
          <Modulus>AKoYq6Q7UN7vOFmPr4fSq2NORXHBMKm8p7h4JnQU+quLRxvYll9cn8OBhIXq9SnCYkbzBVBkqN4ZyMM4vlSWy66wWdwLNYFDtEo1RJ6yZBExIaRVvX/eP6yRnpS1b7m7T2Uc2yPq1DnWzVI+sIGR51s1/ROnQZswkPJHh71PThln</Modulus>
          <Exponent>AQAB</Exponent>
          <P>AN4DDp+IhBca6QEjh4xlm3iexzLajXYrJid6vdWmh4T42nar5nem8Ax39o3ND9b1Zoj41F9zFQmuZ8/AgabreKU=</P>
          <Q>AMQi+R0G9m0K+AcqK3DFpv4RD9jGc0Tle98heNYT7EQvZuuiq4XjvRz0ybqN//bOafrKhsTpRS9DQ7eEpKLI4Bs=</Q>
          <DP>FklyR1uZ/wPJjj611cdBcztlPdqoxssQGnh85BzCj/u3WqBpE2vjvyyvyI5kX6zk7S0ljKtt2jny2+00VsBerQ==</DP>
          <DQ>AJGC1Mg5Oydo5NwD6BiROrPxGo2bpTbu/fhrT8ebHkTz2eplU9VQQSQzY1oZMVX8i1m5WUTLPz2yLJIBQVdXqhM=</DQ>
          <InverseQ>EaiK5KhKNp9SFXuLVwQalvzyHk0FhnNZcZnfuwnlCxb6wnKg117fEfy91eHNTt5PzYPpf+xzD1FnP7/qsIninQ==</InverseQ>
          <D>Fijko56+qGyN8M0RVyaRAXz++xTqHBLh3tx4VgMtrQ+WEgCjhoTwo23KMBAuJGSYnRmoBZM3lMfTKevIkAidPExvYCdm5dYq3XToLkkLv5L2pIIVOFMDG+KESnAFV7l2c+cnzRMW0+b6f8mR1CJzZuxVLL6Q02fvLi55/mbSYxE=</D>
        </RSAKeyValue>";    // private key paste here

        $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);

        $rsa->loadKey($private, CRYPT_RSA_PRIVATE_FORMAT_XML);

        $de =  $rsa->decrypt(base64_decode($ciphertext));
        echo $de;

Edit4:

Причина для ничего не возвращает после расшифровки: ошибка в выборе jquery, который ничего не выбирает, так что зашифрованный текст был нулевым, что приводит к тому, что дешифрованный текст будет нулевым!

1 ответ

Решение

В phpseclib нужно сделать $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1); а также нужно base64_decode данные, если это еще не так.

В примере на https://www.pidder.de/pidcrypt/?page=demo_rsa-encryption данные закодированы в base64, поэтому я упомянул.

Другие вопросы по тегам