从保存的私钥中生成公钥 PHP

回答 2 浏览 6256 2015-03-26

我已将私钥以这种格式保存在数据库中,例如:。

-----BEGIN PRIVATE KEY-----
 MIICdgIBADA................CHGIdCtZEmTD7sbLUcFCYDbohnqaWf2d+2I
 EyC/Hg/tS4d+BQ==
 -----END PRIVATE KEY-----

我需要从中提取公钥。openssl_pkey_get_details需要资源,但我怎样才能从字符串中创建资源?

我试着这样做

$public_key = openssl_pkey_get_details(openssl_pkey_get_public($private));  

错误是openssl_pkey_get_details()期望参数1是资源,给出的是布尔值。

编辑部1。

我正在尝试@kbarborak提出的解决方案,但$pk_get是假的。

$pk_string = "-----BEGIN PRIVATE KEY-----\n".chunk_split($data[4], 64, "\n")."-----END PRIVATE KEY-----\n";
$pk_get = openssl_pkey_get_private($pk_string);

die(var_dump($pk_string));

var_dump的输出结果是。

string(944) "-----BEGIN PRIVATE KEY-----
MIICjAIBAAINBgkqhkiG9w0BAQEFAAIJKoZIhvcNAQEBAgACggJhMIICXQIBAAKB
gQCvUSrEHS1T5g5z/Yv5ETeXA6CLsdo15Dqk0LevSAXGgbFarSRLfTYtN1/zwqgs
+YWnU/0lZKmzJpmDFRmH/wDeu8o7ptEOrNLgbs6TM85cS4ZmRhJnrOG3G6oBMq5m
UCPw+r06HIuxwyS54/2vY/GGjXpxV59yNUhKh9H9V216YwIDAQABAoGARZAbO/2n
wqaCDZwJMiaWvCEATu2e+8s3SbZXbAFT6VQEn0ocIKfqGz7hn8MZH99SHPbCd1fd
zev+9XglzURtf0sHneq8zT8qT4KYYriRj6dwlyJ6xpf1lLrBqi+eifvZR3+i60Ql
YuBNEXhq/OuSAwV+qTCLYrchUE0jTtX3HWECQQDerLyy1hs2SxlXgLbf80BdIuxB
gqj7QGirYBY/tnPvyLBJWF8RLGjEdPUEaN2hUgkhq2+IQ6lRADKJBQX+1u33AkEA
yY4Hz0rFgjDXx1PLOlX3z6vAFNhtWagcsz+DNp0fwaD1jLVvWnAcAgjJWQ9GBRrC
OGctw6hN92tX19vuKIbr9QJBAIFR1oESIVmlwcD0ysBDOFUezBC7vkG0xVUKB8HW
x3wxlFf0T7ncjbfSqN13vYdL6mu4cZy0lueo8rBqz3GSBz8CQQCTibEzzzL20xQQ
p8jbAfTtgnaPi8G34HRpzbMZ9jg5v74e6u0BEZGe95mT5LdHo0fKi9SXJYs08tGR
hD84UVNFAkAgR+Z0ox6HbNMj5bBIvqEC25mAMnayFyezPZ+/B/IyHDYmQSO9FGsG
/YVA8prMnAZ/YEiCC/2kYA2Ds7GjdJipAgACAAIAAgA=
-----END PRIVATE KEY-----
"
Pavel 提问于2015-03-26
2 个回答
#1楼 已采纳
得票数 5

提取公钥

// Private key as string
$pem_private_key = file_get_contents('mykey.pem');

$private_key = openssl_pkey_get_private($pem_private_key);

// Public key as PEM string
$pem_public_key = openssl_pkey_get_details($private_key)['key'];
// As PHP resource
$public_key = openssl_pkey_get_public($pem_public_key);

echo $pem_public_key;
echo $public_key;

准备私钥字符串

$pk_string = "-----BEGIN RSA PRIVATE KEY-----\n".chunk_split($data[4], 64, "\n")."-----END RSA PRIVATE KEY-----\n";
$pk_get = openssl_pkey_get_private($pk_string);

die(var_dump($pk_string));

使用BEGIN RSA PRIVATE KEY,而不是直接使用BEGIN PRIVATE KEY(END也是如此)。

希望这对你有帮助。

kba 提问于2015-03-26
kba 修改于2015-03-26
我试了一下,但是$pk_string = "-----BEGIN PRIVATE KEY-----".$data[4]."-----END PRIVATE KEY-----"; $pk_get = openssl_pkey_get_private($pk_string); ... 当调用,所以$pk_get是假的Pavel 2015-03-26
$data[4]中到底是什么?你给出的是错误的字符串作为私钥。我只是猜测data[4]中是私人密钥的base64编码的二进制表示。如果是这样,请尝试$pk_string = "-----BEGIN PRIVATE KEY-----\n" . chunk_split($data[4], 64, "\n") . "-----END PRIVATE KEY-----\n"kba 2015-03-26
谢谢你:)我在你的评论前几分钟搜索了它。有一次,它是好的。但第二次调用又是错误的。请看我现在帖子中的编辑1。Pavel 2015-03-26
好的,我知道了。你必须告诉你的密钥是RSA类型http://stackoverflow.com/a/20065522/4632537kba 2015-03-26
没错!这是个好主意。谢谢。那么我的下一个问题是--有没有办法在PHP中直接通过openssl生成RSA密钥,或者我必须使用其他东西?Pavel 2015-03-26
#2楼
得票数 0

如果有错误,openssl_pkey_get_public()会返回false。所以这是最有可能发生的,并且是将false传递给openssl_pkey_get_details()。调试你的$private变量。

patman 提问于2015-03-26
标签