3

I have saved Private Key in DB in this format e.g.

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

I need extract Public Key from it. openssl_pkey_get_details need resource, but how can I create resource from string?

I tried this

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

Error is openssl_pkey_get_details() expects parameter 1 to be resource, boolean given

EDIT 1:

I'm trying solution from @kbarborak bellow, but $pk_get is false:

$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));

Output of var_dump is:

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
  • 250
  • 3
  • 11

2 Answers2

7

Extracting public key

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

Preparing private key string

$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));

Use BEGIN RSA PRIVATE KEY instead just BEGIN PRIVATE KEY (same for END).

Hope that's help.

kba
  • 4,190
  • 2
  • 15
  • 24
  • I tried this, but $pk_string = "-----BEGIN PRIVATE KEY-----".$data[4]."-----END PRIVATE KEY-----"; $pk_get = openssl_pkey_get_private($pk_string); ... when call, so $pk_get is false – Pavel Mar 26 '15 at 11:42
  • What is exactly in $data[4]? You are giving malformed string as private key. I just guess in data[4] is base64 encoded binary representation of private key. If so, try `$pk_string = "-----BEGIN PRIVATE KEY-----\n" . chunk_split($data[4], 64, "\n") . "-----END PRIVATE KEY-----\n"`. – kba Mar 26 '15 at 12:00
  • Thank you:) I search it minutes before your comment. For one time it was ok it. But second call is false again. Please see EDIT 1 in my post now. – Pavel Mar 26 '15 at 12:21
  • Ok, I got it. You have to tell that your key is RSA type [http://stackoverflow.com/a/20065522/4632537](http://stackoverflow.com/a/20065522/4632537). – kba Mar 26 '15 at 12:30
  • Right! Thanks. So my next question is - is here way to generate RSA key in PHP directly via openssl or I must use something else? – Pavel Mar 26 '15 at 12:57
  • It is another question - but shortly yes - openssl_pkey_new(). If my answer helped you, please flag it as solution. Thank you. – kba Mar 26 '15 at 13:04
0

openssl_pkey_get_public() returns false if there's an error. So this is was most likely happens and is passing false to openssl_pkey_get_details(). Debug you $private variable.

patman
  • 2,780
  • 4
  • 30
  • 54