PHP openssl public encrypt " параметр ключа не является допустимым ключом"

у меня есть этот открытый ключ RSA:

MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtixUGzGpLXgZ7AV1HfmIHV/FEF+fww77FekRc2oLhUOd4HitwCPo76fjtdsQBEt8w9HZ3CXVphaAU2BA6MEZJ3ShVMsdAXb2ZA1C+lu7k1GV9M/BhucTg35HujSK647Sc5MwVLwFsN80dAnGsZF8gwb2TNUzXHwzbAb30T01zuqf8RCM75OwKZFYqzu7FOVrtk/w9mh92MOXG0l7WSqNIctu8Kxka/tEJJIA5nqMGNMocjwprXy66NS7FFy1GY+NnxfFLtODqq0tllc50UCDsnqSvNmj2wcnAcsCzNOoxPPgp7t8S+sQvOzgc5W3CDjIsYEiGD+vzSVNkGiRou577wIDAQAB

(каждый другой ключ, который я пытаюсь, дает ту же ошибку)

и эту строку:

$str = "VOTEn" .
"server-listn" .
"$usern" .
"$useripn" .
time()."n";

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

$leftover = (256 - strlen($str)) / 2;
while ($leftover > 0) {
    $str .= "x0";
    $leftover--;
}

чтобы отформатировать ключ, я делаю следующее:

    $key = wordwrap($key, 65, "n", true);
    $key = <<<EOF
    -----BEGIN PUBLIC KEY-----
    $key
    -----END PUBLIC KEY-----
EOF;

когда я делаю openssl_public_encrypt($str, $encrypted, $key); Я получаю следующее предупреждение:

Warning: openssl_public_encrypt() function.openssl-public-encrypt: key parameter is not a valid public key in ...

Я не уверен, почему это происходит. Вот как выглядит ключ, когда я повторяю его:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtixUGzGpLXgZ7AV1HfmIH
V/FEF
fww77FekRc2oLhUOd4HitwCPo76fjtdsQBEt8w9HZ3CXVphaAU2BA6MEZJ3ShVMsd
AXb2ZA1C
lu7k1GV9M/BhucTg35HujSK647Sc5MwVLwFsN80dAnGsZF8gwb2TNUzXHwzbAb30T
01zuqf8RCM75OwKZFYqzu7FOVrtk/w9mh92MOXG0l7WSqNIctu8Kxka/tEJJIA5nq
MGNMocjwprXy66NS7FFy1GY
NnxfFLtODqq0tllc50UCDsnqSvNmj2wcnAcsCzNOoxPPgp7t8S
sQvOzgc5W3CDjIsYEiGD vzSVNkGiRou577wIDAQAB
-----END PUBLIC KEY-----

любая помощь будет оценили!

изменить: Рабочий ключ должен выглядеть так:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmHzD76i8DA25nC+Qsswi
OM0lW+gViiQD4tEm7suxBc2BGibtdlrsprVIId92hSjQKx4x8+XVWU6k89T5vy8Y
txpXN759OWdGkDi8uvZuYclMjW9Rao+oqSvbXH37R7oSY287I+6uOHclGhniQN3q
RyoXBkbhDk0/FTI/i549q/gGk1UZYv449KLrDOqmtohRcIyAYVnvvWtD1kIzourq
hMtEIrPqwoBqTaUA9kOIXw1jMovao2TN52j48KgOg9KjqtdwUwD9e6n7hJd/subF
6woc8L7zjJFOHH5gacUC7vtiMpBpnSyLQpjFLepYYwftjsRmg4xLdh+Zvgw3xqi4
lwIDAQAB
-----END PUBLIC KEY-----

2 ответов


мне пришло в голову, почему он не работает, поэтому я здесь, чтобы ответить на свой вопрос. Теперь, когда я думаю об этом, он связывается с тем, что изначально сказал @sarnold: знаки + исчезли (и они были заменены пробелами)

оказывается, поскольку я получал ключ через HTTP POST, он отформатировал URL (и, следовательно, ключ), превратив все знаки + в пробелы. Это сбросило ключ и вызвало эту головоломку.

Спасибо за помощь. :)


во-первых, я бы рекомендовал использовать phpseclib, чистую реализацию RSA PHP. Это тонна более портативная и простая в использовании и все это джаз. Пример:

<?php
$key = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtixUGzGpLXgZ7AV1HfmIHV/FEF+fww77FekRc2oLhUOd4HitwCPo76fjtdsQBEt8w9HZ3CXVphaAU2BA6MEZJ3ShVMsdAXb2ZA1C+lu7k1GV9M/BhucTg35HujSK647Sc5MwVLwFsN80dAnGsZF8gwb2TNUzXHwzbAb30T01zuqf8RCM75OwKZFYqzu7FOVrtk/w9mh92MOXG0l7WSqNIctu8Kxka/tEJJIA5nqMGNMocjwprXy66NS7FFy1GY+NnxfFLtODqq0tllc50UCDsnqSvNmj2wcnAcsCzNOoxPPgp7t8S+sQvOzgc5W3CDjIsYEiGD+vzSVNkGiRou577wIDAQAB';

$rsa = new Crypt_RSA();
$rsa->loadKey($key);
$rsa->setPublicKey($key);

echo $rsa->getPublicKey();

Если вы настаиваете на использовании расширения openssl... попробуйте это:

"-----BEGIN PUBLIC KEY-----\r\n" . chunk_split($whatever) . "\r\n-----END PUBLIC KEY-----"