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最初所说的联系在一起:+符号不见了(它们被空格取代了)

事实证明,因为我是通过HTTPPOST获得密钥的,所以它格式化了URL(从而格式化了密钥),将所有的+符号都变成了空格。这就解开了钥匙,造成了这个难题。

谢谢你的帮助。:)

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

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

为我工作!

如果您正在使用

openssl_public_encrypt()

确保钥匙之间没有空格。不建议添加'+'以消除空白,因为这可能会更改键值并导致错误openssl_public_encrypt():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))