2012-03-27 45 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----- 

任何幫助,將不勝感激!

編輯: 一個工作重點應該是這樣的:

-----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 2012-03-27 00:21:05

+0

嗯..我不確定。我真的不知道他們是否應該在那裏,因爲我坦率地不知道我在做什麼。我正在嘗試使用這個協議:https://github.com/vexsoftware/votifier – fruitcup 2012-03-27 00:23:15

+1

+符號代表的字節與所有其他字符一樣多。 Base64編碼使用'A-Ba-b0-9'和'/'&'+來對字節進行編碼,並可能使用'='字符來填充最後一部分。 – 2012-03-27 00:56:39

回答

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-----" 
相關問題