从保存的私钥中生成公钥 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-----
"
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也是如此)。
希望这对你有帮助。
我试了一下,但是$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
没错!这是个好主意。谢谢。那么我的下一个问题是--有没有办法在PHP中直接通过openssl生成RSA密钥,或者我必须使用其他东西?
- Pavel 2015-03-26
#2楼
得票数 0
如果有错误,openssl_pkey_get_public()
会返回false。所以这是最有可能发生的,并且是将false
传递给openssl_pkey_get_details()
。调试你的$private
变量。