簡體   English   中英

PHP openssl_public_encrypt“密鑰參數不是有效密鑰”

[英]PHP openssl_public_encrypt "key parameter is not a valid key"

我有這個 RSA 公鑰:

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-----

我突然想到為什么它不起作用,所以我在這里回答我自己的問題。 現在我想起來了,它與@sarnold 最初所說的有關:+ 符號消失了(它們被空格代替)

事實證明,因為我是通過 HTTP POST 獲取密鑰的,所以它格式化了 URL(以及密鑰),將所有的 + 符號變成了空格。 這導致了這個難題。

謝謝您的幫助。 :)

只需使用str_replace(' ', '+', $string)

為我工作!

首先,我建議使用 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-----"

如果您正在使用

openssl_public_encrypt()

確保鍵之間沒有空格。 不建議添加“+”來消除空格,因為它可能會更改鍵值並導致錯誤 openssl_public_encrypt(): key parameter is not a valid public key。

我遇到了這個問題,我的問題是我做了一些代碼編輯,結果在鍵中添加了一些空格。 經過長時間的嘗試和大量的谷歌搜索,我生成了一個新密鑰並保持不變,而無需更改或編輯空白區域,它終於奏效了。

希望能幫助到你。 從我讀過的幾篇文章中,openssl 非常挑剔。 所以請小心不要更改密鑰中的任何內容,因為它可能是您頭痛的根源。

function encrypt($data, $pubkey)
{
    $pubkey = openssl_get_publickey($pubkey);

    if (openssl_public_encrypt($data, $encrypted, $pubkey))
    {
        $data = base64_encode($encrypted);
    }
    else
        throw new Exception('Unable to encrypt data. Perhaps it is bigger than the key size?');

    return $data;
}

公鑰格式如下:

$PUBLIC_KEY  = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqG....LosgV4t08P0wIDAQAB
-----END PUBLIC KEY-----";
$token = encrypt($words, ($PUBLIC_KEY))

;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM