2012-03-27 1 views
5

У меня есть этот открытый ключ RSA:PHP openssl_public_encrypt «ключевой параметр не является допустимым ключом»

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

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

и эта строка:

$str = "VOTE\n" . 
"server-list\n" . 
"$user\n" . 
"$userip\n" . 
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----- 

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

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

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

Что случилось с символами '+' в вашем ключе? Они ушли в отформатированном блоке. – sarnold

+0

Хм .. Я не уверен. И я действительно не знаю, должны ли они быть там, потому что я совершенно откровенно не знаю, что я делаю. Я пытаюсь работать с протоколом по этому поводу: https://github.com/vexsoftware/votifier – fruitcup

+1

Знаки + представляют байты так же, как и все остальные символы. В кодировке Base64 используются 'A-Ba-b0-9' и'/'&' + 'для кодирования байтов и, возможно, символ' = 'для заполнения последней части. –

ответ

5

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

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

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

1

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

<?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-----" 
Смежные вопросы