PHP openssl_public_encrypt“密钥参数不是有效密钥”

Posted

技术标签:

【中文标题】PHP openssl_public_encrypt“密钥参数不是有效密钥”【英文标题】:PHP openssl_public_encrypt "key parameter is not a valid key" 【发布时间】:2012-04-10 12:30:57 【问题描述】:

我有这个 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-----

【问题讨论】:

密钥中的+ 符号发生了什么变化?它们在格式化的块中消失了。 嗯..我不确定。我真的不知道他们是否应该在那里,因为坦率地说,我不知道我在做什么。我正在尝试使用以下协议:github.com/vexsoftware/votifier + 符号与所有其他字符一样表示字节。 Base64 编码使用A-Ba-b0-9/+ 对字节进行编码,并可能使用= 字符来填充最后一部分。 这可能是wordwrap 函数,它似乎旨在在单词边界上拆分字符串。您最好只计算字符并手动插入换行符(如果我没记错的话,两个)。 我不知道该怎么做。 o3o 【参考方案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-----"

【讨论】:

【参考方案2】:

我突然想到为什么它不起作用,所以我在这里回答我自己的问题。现在我想起来了,它与@sarnold 最初所说的有关:+ 符号消失了(它们被空格取代了)

事实证明,因为我是通过 HTTP POST 获取密钥,所以它格式化了 URL(以及密钥),将所有 + 符号变成了空格。这把钥匙扔掉了,导致了这个难题。

感谢您的帮助。 :)

【讨论】:

【参考方案3】:

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

为我工作!

【讨论】:

【参考方案4】:

如果你正在使用

openssl_public_encrypt()

确保键之间没有空格。不建议添加 '+' 以消除空格,因为它可能会更改键值并导致错误 openssl_public_encrypt(): key parameter is not a valid public key。

我遇到了这个问题,我的问题是我做了一些代码编辑,这反过来又在键中添加了一些空格。经过长时间的尝试和大量的谷歌搜索,我生成了一个新密钥并保持它不变,而不更改或编辑空白区域,它终于奏效了。

希望对您有所帮助。从我读过的几篇文章中,openssl 是如此的挑剔。所以请注意不要更改键中的任何内容,因为这可能是您头痛的根源。

【讨论】:

以上是关于PHP openssl_public_encrypt“密钥参数不是有效密钥”的主要内容,如果未能解决你的问题,请参考以下文章

php send.php php邮件模板#php

IntelliJ IDEA 11编辑php是,支持php文件名为.php5和.php4,如何设置能让其也支持.php呢?

如何从php5升级到php7

请问php中如何调用php文件中的内容?

php [php:PHPMailer示例] php库“PHPMailer”示例。 #PHP

php基础