php signature output in a copy'able string - php

I need to copy paste the signature of a specific input in PHP, there are no errors but the resulting signature is a bunch of symbols and not alphanumeric characters, I highly assume its because I am missing some encoding somewhere.
This is my code:
<?php
$unformatted_pub= "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAs9D/xyfj7Ocgzaytkqsp
f/ABE5csbukSkmkRi9VzuxZZ9v95WJmxldH1QTIKEjAjeGuFoYY+WhqsTQYG3RuM
cZ3e0Vp26Qkkxyu2MU4fuu/ht1AYiq6SMstnS49l5D8ptjh1ZUyWjFHr+sMyHSi/
jiLUtbIK4lzpZHjMJ4g8JknKLhINLeMscRwXFEvfgSPO9AJ1hAFjuWT3UbCOS9s1
nq6daE6TexCOlXbm4rPeRHxIuZJxawPGkQAx/X9sk5mww2kJk1nbmBSll/B2qp7k
jQmXz3J/g+VwQnCIB5XtZ4bOSEVh7GBwYCkmu8PZthZVMiBlHBICTYzGyyWt2djP
lS+jen0BAIrxV3mshB4ErZsRToNCFRzGlRg1opQCJngw1NProlcGMzh1LC5C7Han
awoFUwWaGypAx2XL04WsMo4MJYgKDVN545f/SaXXVG+fTYjWX4I6GyGlqLRjfijY
SGdupIlFUdHPPKNVr1A2JZNYwBtBepvv5DEmD4+yy3gf6hwL4IYZOfUZrpl4YxoH
uZsD0Ly/2ayQBujWgmTdgoPrYB7GKwjc/jgPKvJTU965FOmKd2ujeTfed8HAky7G
DL1zrr0URMC4IZ6CtLF9BEazwzx5CrnOLZ4b2fcxgeX7C36GvNzKgD2PIhYJid10
rb/7Al/a/mWeyZGUxffhkB0CAwEAAQ==
-----END PUBLIC KEY-----";
$unformatted_priv = "-----BEGIN PRIVATE KEY-----
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
OoyA4sufCzG5Wgy5iBquldUSELkxXEM=
-----END PRIVATE KEY-----";
$data = '1234';
// compute signature
openssl_sign($data, $signature, $unformatted_priv);
echo $signature;
?>
And this is the result:
���3��TQW<�^�T�Kd�i�hF�X�:0��d�GޱE�)�z9H������ө%CO��H�m˻J#���'6�>�Q�vn�r�&��絛k�=�X��_�ꗼ������1oK�3�1���&�EI��=�����}򤡖]Qo��u 4�'�\� �l��u��/������q�%���2�����)��3+����`��q҃|I�Of֯\�|e�h��u�i�"[Mjtc���"�^���j"s8��'���Y���upW9���1�#��CB�͇�f�ߩ�Hn�N�KF�#,e�݇��7�� �� aIB?.v#���Q�j>z4� ���/s����͇����uߌ,�u��!ᄃ���+"� uO �{��O3]���h}�- �|�s����;F;�ɣj�x�O=�aw$�Jz7� (ѬJbN�T�?(<��}X%��������!y\V�5u���_C�K��s��<}�M|#w��?�mey�
Lastly, I tried to verify the signature which returns True, so there are no errors, I just want the signature in a format where I can copy and paste it.
Any and all help is greatly appreciated.

echo base64_encode($signature);

As PHP docs example suggests the best way is to save signature to a file instead of copying it.
//create signature
openssl_sign($data, $signature, $private_key_pem);
//save for later
file_put_contents('private_key.pem', $private_key_pem);
file_put_contents('public_key.pem', $public_key_pem);
file_put_contents('signature.dat', $signature);
//verify signature
$r = openssl_verify($data, $signature, $public_key_pem);
var_dump($r);

Related

How Do I Sign with a PKCS8 Key In PHP?

Currently I have a pkcs8 formatted private key and am trying to use openssl to sign data.
My code is as follows:
$data = "Data that I wsant to sign";
$private_key ="
-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIlPwCxnroNJUCAggA
MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDOK7DOSiWN/iSUIK1mfbZHBIIE
0PFuTznnLXVEz+iECw/jq+6VQf/cpGQRVbEFppzoxo6JqTUC/hjZsh8+9bdCNSvf
GsaTMixKvVgzi+9wF3tb0sTS2f8Qsd9acRsQ14e0qg4Efi2gUYcQKk+mZwzgwAFi
wZZdTNa6I/lB5dZoAaShkvyPQWpvG7oPNg0igF+ZJ79czdBEsdk0LfDfn1djBrOR
4+1fpD13ELkehG6VngEI26dkke6FKngVA9qlByNw6qzxh63Y5ftey3Gr4yJSjCm4
WIHOdMO0d/G9DtqdCaJkiu0V+6MhFIkhVI8GWaelsU6L50Z3GQXTkax2rMfMCjAL
gyNqRnMfQF0aGuMDreIsbJJyfPB118kcN4seqZwUFQ8v2XnU2bzZ46v/LIjm0EMT
Oj6MUSTGYz0NEGVCwD914wEQQ+IvpZQUrKLZvus2eas/H9SImmIotaZGaR66cMK3
ARGXLOGkamwmOWXaj5e4/Nqj1YPoyO1gCqLvqaifS3BKfe5emVQiFn37Yj2LUtFE
gaTmW+S7QhGkfNfiT0ihUeVWFKneR5ZVQ4ZWHXamc7QwUbKOZqD6CHKWtwudBJ/A
1BSC3geeKhND1XzAENtjOxwrNMbmtlBGgp/zOnaxNQE2J8x7ZWzGRAz1isXqOoXT
KCatixh918u2U0YfaRBGyOLBK83UjcMsfRSYyowx/AwR4iET4gORG7hai+6Jcujk
Jq2M1oJdlbtBzYoI9NGUsytiHz+BR6o/d3qqGaFobcbDzfQFhWQhprWBdq/Z5nsp
GRyBJJx3LA+bIkXgfQyMvh7BwOZ7p6Irp2+7Oj4Gh6zBFH6312cGesXbzDIu8uTP
m8UeWpNG8Oo3FB3xa/s7lm6+xFc8byXRSGxBx0akFBTI929Cjw4sscheodSYOXYo
rNwfhTBsggSIOwoGdolMgidFDovS64UjoXl1NkSgivdtTfEjLQx6bMohkoBPnHJu
V2yQiWllXKQ6TQyJfKQPILJUSXE4dKos5jLlduxSTy8hYDJ1W8TdB24axQf6RPlq
hkESP9SuKRQojizY7ne/hn56NYkjcjekjS31qfa1JyHzkZTKJB5uqdQdzXi5iyZq
mmjs4j1GOWfe2p8BMyPeE91h7EOGIKpJoCWLqdbU4gUKZb9kVrNenpxtd3lAoGAs
AVujiANdQhndmrb6gDfaRh6rT9Cu2TQsk27YD1Nmb05ihYmWkXJlMe2hN6nhIkEy
MSWCv+ZfuW3NSaBFRw1rCLEB1xfFnkmsBOmxgW6eJ0UxRONU2jQ8Hf233tJc1LaI
JI+F1coi9VGq4dVBZ5nupw0MSVbgOJO7fnH7uP47Va1tq5YM0pB4tMib/KsKDwPk
oDFMp/wfSs/Ctt5GJ7bzlcHUfQIEntzRDurdfPNSlsDk14KUudzQM+XK8HRPTaRA
yICJBmgvNq9IrK0/bNDyZyNNwUw0TDJKuSa0aNTM9s9ksodrgCGGbouCnXipD6GZ
aJtXy4I0rBSxh+EKtzkjHoD/Lik90NFlEPcASsQ9vFMVyOwbgMwZLtZ5nYhF9/bX
dgG8VLoIGJ9sMpbA+OJUOvbW6cgrADWfIZbpjjCgDW4aGJjJIPYmxDwWlfbuWA6j
0LLAp/Eqj68hoMEBGU6bYmIm8eHG+o1O3Df7ZkGudcEK
-----END ENCRYPTED PRIVATE KEY-----";
$binary_signature = "";
$algo = OPENSSL_ALGO_SHA256;
$pkey=openssl_get_privatekey( $private_key, 'password' );
openssl_sign($data, $binary_signature, $pkey, $algo);
$signature = base64_encode($binary_signature);
echo $timestamp = time();
echo "<br>";
print_r($signature);exit;
However, I'm getting openssl_sign(): Supplied key param cannot be coerced into a private key error
I can't seem to find any references that use pkcs8 formatted keys for signing data using PHP. Hoping someone could give me some insight into this.
Thank you
New version of the code (Still having the same error)
$data = "Data that I want to sign";
$private_key ="
MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIlPwCxnroNJUCAggA MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBDOK7DOSiWN/iSUIK1mfbZHBIIE 0PFuTznnLXVEz+iECw/jq+6VQf/cpGQRVbEFppzoxo6JqTUC/hjZsh8+9bdCNSvf GsaTMixKvVgzi+9wF3tb0sTS2f8Qsd9acRsQ14e0qg4Efi2gUYcQKk+mZwzgwAFi wZZdTNa6I/lB5dZoAaShkvyPQWpvG7oPNg0igF+ZJ79czdBEsdk0LfDfn1djBrOR 4+1fpD13ELkehG6VngEI26dkke6FKngVA9qlByNw6qzxh63Y5ftey3Gr4yJSjCm4 WIHOdMO0d/G9DtqdCaJkiu0V+6MhFIkhVI8GWaelsU6L50Z3GQXTkax2rMfMCjAL gyNqRnMfQF0aGuMDreIsbJJyfPB118kcN4seqZwUFQ8v2XnU2bzZ46v/LIjm0EMT Oj6MUSTGYz0NEGVCwD914wEQQ+IvpZQUrKLZvus2eas/H9SImmIotaZGaR66cMK3 ARGXLOGkamwmOWXaj5e4/Nqj1YPoyO1gCqLvqaifS3BKfe5emVQiFn37Yj2LUtFE gaTmW+S7QhGkfNfiT0ihUeVWFKneR5ZVQ4ZWHXamc7QwUbKOZqD6CHKWtwudBJ/A 1BSC3geeKhND1XzAENtjOxwrNMbmtlBGgp/zOnaxNQE2J8x7ZWzGRAz1isXqOoXT KCatixh918u2U0YfaRBGyOLBK83UjcMsfRSYyowx/AwR4iET4gORG7hai+6Jcujk Jq2M1oJdlbtBzYoI9NGUsytiHz+BR6o/d3qqGaFobcbDzfQFhWQhprWBdq/Z5nsp GRyBJJx3LA+bIkXgfQyMvh7BwOZ7p6Irp2+7Oj4Gh6zBFH6312cGesXbzDIu8uTP m8UeWpNG8Oo3FB3xa/s7lm6+xFc8byXRSGxBx0akFBTI929Cjw4sscheodSYOXYo rNwfhTBsggSIOwoGdolMgidFDovS64UjoXl1NkSgivdtTfEjLQx6bMohkoBPnHJu V2yQiWllXKQ6TQyJfKQPILJUSXE4dKos5jLlduxSTy8hYDJ1W8TdB24axQf6RPlq hkESP9SuKRQojizY7ne/hn56NYkjcjekjS31qfa1JyHzkZTKJB5uqdQdzXi5iyZq mmjs4j1GOWfe2p8BMyPeE91h7EOGIKpJoCWLqdbU4gUKZb9kVrNenpxtd3lAoGAs AVujiANdQhndmrb6gDfaRh6rT9Cu2TQsk27YD1Nmb05ihYmWkXJlMe2hN6nhIkEy MSWCv+ZfuW3NSaBFRw1rCLEB1xfFnkmsBOmxgW6eJ0UxRONU2jQ8Hf233tJc1LaI JI+F1coi9VGq4dVBZ5nupw0MSVbgOJO7fnH7uP47Va1tq5YM0pB4tMib/KsKDwPk oDFMp/wfSs/Ctt5GJ7bzlcHUfQIEntzRDurdfPNSlsDk14KUudzQM+XK8HRPTaRA yICJBmgvNq9IrK0/bNDyZyNNwUw0TDJKuSa0aNTM9s9ksodrgCGGbouCnXipD6GZ aJtXy4I0rBSxh+EKtzkjHoD/Lik90NFlEPcASsQ9vFMVyOwbgMwZLtZ5nYhF9/bX dgG8VLoIGJ9sMpbA+OJUOvbW6cgrADWfIZbpjjCgDW4aGJjJIPYmxDwWlfbuWA6j 0LLAp/Eqj68hoMEBGU6bYmIm8eHG+o1O3Df7ZkGudcEK
";
$key = wordwrap($private_key, 64, "\n", true);
$key = <<<EOF
-----BEGIN ENCRYPTED PRIVATE KEY-----
$key
-----END ENCRYPTED PRIVATE KEY-----
EOF;
$private_key = openssl_pkey_get_private($key, 'password');
openssl_private_encrypt($data, $encrypted_data, $private_key);

How to get R and S values from ECDSA signature using PHP

I am working on Signature of data using ECDSA from Starkbank library and I can get the base64 format of the signature value MEUCIALlD6Xsd0Xdj7XTrD2gP4Q3PlssTxLOCUi6R8FbXMlbAiEAmW8HLiBnhaBBPzIL64FGzFYzUwF1HfX+a8ep5/NpI0k= and the Der value is 0E ���wEݏ�Ӭ=�?�7>[,O� H�G�[\�[!�o. g��A?2�F�V3Su��kǩ��i#I
but I want to know the R and S values with the length as well, how can I achieve it?
my PHP code is:
<?php
require_once "src/ellipticcurve.php";
#privateKey from PEM string
$privateKey = EllipticCurve\PrivateKey::fromPem("
-----BEGIN EC PRIVATE KEY-----
MIGEAgEAMBAGByqGSM49AgEGBSuBBAAKBG0wawIBAQQgPUAdAJuELXoxEumrKUPd
yHLP9bITTV+yOSw5q1H8W/2hRANCAASW6MSUA/wJRcj0AljN0tnpMBp5ISqTp8j/
rY7C2BXCXyy03V/lP7jn0LSgJvykVyNRPXfA4zjpFRaOUNWUBNuU
-----END EC PRIVATE KEY-----
");
$message = "j4+wDOaRLRQn7oweoCbob1WDaqPRCTHzonn08b+dJr0";
$signature = EllipticCurve\Ecdsa::sign($message, $privateKey);
# Generate Signature in base64. This result can be sent to Stark Bank in header as Digital-Signature parameter
$base64 = $signature->toBase64();
$der = $signature->toDer();
echo "\n" . $der;
echo "\n" . $base64;
$publicKeyPem = EllipticCurve\Utils\File::read("publicKey.pem");
$publicKey = EllipticCurve\PublicKey::fromPem($publicKeyPem);
# To double check if message matches the signature
//$publicKey = $privateKey->publicKey();
echo "\n" . EllipticCurve\Ecdsa::verify($message, $signature, $publicKey);
?>
the ECDSA config which I am working on:
digest_alg = "sha256",
private_key_bits = 2048,
private_key_type = OPENSSL_KEYTYPE_EC,
curve_name = secp256k1,
You Can Use SOP/ASN1 To get the Sequence from DER.
Try https://lapo.it/asn1js to find the Positions from R and S. Use bin2hex($signature->toDer()) to get Hex-Encoded ASN.1
It depends on the Type of your $signature->toDer().
Maybe your Hexstring is already Sequence, then following two ANS.1-Integers (R/S).
Then use for e.g.
$seq = \Sop\ASN1\Type\UnspecifiedType::fromDER($signature->toDer())->asSequence();
$seq->at(0)->asInteger()...
$seq->at(1)->asInteger()...

phpseclib 2.0 generates different signature than any other library with same parameters

Introduction
Hello, when signing a simple string Hello World! I get a signature that is different from any other library I'm using. I already double checked padding, algorithm, key pair, hash and input text.
Code
<?php
/*
$config = array(
"digest_alg" => "sha256",
"private_key_bits" => 4096,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$resource = openssl_pkey_new ($config);
// Extract the private key from $res to $privKey
openssl_pkey_export($resource, $privKey);
// Extract the public key from $res to $pubKey
$pubKey = openssl_pkey_get_details($resource);
$pubKey = $pubKey["key"];
echo var_dump($privKey) . "\n" . $pubKey;
*/
//require __DIR__ . '/../vendor/autoload.php';
require __DIR__ . '/../vendor/autoload.php';
use phpseclib\Crypt\RSA;
$privatekey = "-----BEGIN RSA PRIVATE KEY-----
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
-----END RSA PRIVATE KEY-----
";
$publicKey = "-----BEGIN PUBLIC KEY-----
MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAn4CD0nFHCeM3DQkCWfXu
qRVlX4rbqEk43lMgEns4DnTldrSl1oaD9YOnwGktk7MaCf80AAZv2O4a9LIfvMxB
f+LshgqTOAgvr1qy9bIkn0o/BBNYbwOTCEnbvSha6uHlexpr31aRvzj8km4uzeBu
sUyJaXgF8ZMcp0UmThhdYlHhWP1EuajkbXS8/zlD2F4TVaiPgvupIoWC62PMe5Qv
NWjrxOYSNwiV29QVxnHt8xm5Vx1JET1A4uUCVnOUQ5L+zBv+BYhCHr03j6aq+Z1a
KHpEsYtCQPRCJJ/+r24+yd8tMJ2u63feVCcSOfuZTYG8Qlr5wZICuGimneeKWpau
OCqmb7osVDZfY7e2xSxnbjabtVqni43NWB0CcXwQ4fIbHX0/JdWmLbupIhTBJDzO
6CCpyE506UZJGZOu7t16FBwGVLh3jE1nLxwIbswv7oiN9fFBP+2eebvyuEvkSwYe
vGc16Mh4qfnHARwhiG0aflrUbf8hls2NrvCRTm7mRIjCBZe8rM7VWyZbUaA8DI8N
E3/PnwjvRWLdmEqM2ShVBuDnDpeDx46x58B1HZqeGx7HwfL/x/fSRG3uvBAG/lqK
mq3o1E1gmauHm6jcnHOUftlt6nv0xfqboScJYVgPkNT0l3rzKUtNwI3Bh0X/Yhy4
ikEl9DTSFOhWa9ReUwYOqVMCAwEAAQ==
-----END PUBLIC KEY-----
";
$rsa = new RSA();
$rsa->loadKey($privatekey);
$rsa->loadKey($publicKey);
$rsa->setHash('sha256');
$rsa->setMGFHash('sha256'); // Added to see if it made a difference. It made no difference
//$rsa->setSaltLength($sLen)
$rsa->setEncryptionMode(RSA::ENCRYPTION_PKCS1); // Added to see if it made a difference. It made no difference
$rsa->setSignatureMode(RSA::SIGNATURE_PKCS1);
$plaintext = 'Hello World!';
$signature = $rsa->sign($plaintext);
$rsa->verify($plaintext, $signature);
echo base64_encode($signature);
?>
Output vs expected output
Output: Zhy04W5K+Xjhd3isDi3rlqpUgGAmcTKpW7HEPQiG8eIaxqPVqOilw60zOcS1GDuPn2b5Z1UWyvBNbw3r5fK9JSxAXCGFtbe/Fd8nGtAsCe9RW9oQ14OCwpuqWFJwADdax0GAh0KC/2JpmHYu+GG8IfESgG4NPxwe36r861jdIW9icsmcRUQOpfCkIsKClbwBhS74oIQAmbxMl23hNqzue6I7+onlZxNqnVH1XLPsMZghx1CkkpVGnSm6bHmiz01AFTF9U5oHto5MLLy1UMIhFDOFOxNHwC4ISK8kC8vnfUkm3nM3GQMD+yvDYPKLse0dYBPUcmFwiErSOkG8guA5IG4nWCkM2V5GpBHPwsGFpckjKOUvsuq+8g3ILqkW5IZSBUDaTSsHUd0CxD05DzZOGOBQ5Lhm3vMm2kbO5uwlTYbZX5deLJLOJivCip56CGX4GpAfT/VRctLyl5NL2CwVE3zUKMTnOj/NLoU7Liqw4WaYKekB2vTCUWcse8mdX1ZiUNxW3EHiXiEGB1yzVxPE0QaLdcfK3pyVVpkd5cxHOdXI5Zg/5RkADYiueyO/1oIObzHPEcAvdoj5fxW5XKnFPux6KzjWdqnqVyZXKNSZquJodn0408n2NGLrEukOVlMaixnNgvj7lmHtz/UlN0FNRzCHwVDl4q3uOiVPfRmj+28=
Expected output: J8iGPq9MWUHnzHYJqNE3y/o41uZXTdr+JGOl7YN06qIv+vbylgL367Y8B0jA/LYPcPIJDpUs991DdHEgFAE/+JkVYcrKZpmGXSFvR3RWaTe3DQZMoeD07iaOElJXVn6XBWbU77hCDUMkWXwWHbH9Ybs9BDyq8VHCrhHXgo4zyRNHB+Hb4LLVPyFCv+nQ8d6wCbY14ecyMiL5xS27g78aAg+87uTaq/naLPiSUftKiq0/ih9/Jk6IxrSLsfF4XRD2uAe5jruUMe+wZmzzYeS1syl1nto2FX/28k/z2c8Bt1Rr7nl4E6uiEKO2jYknBkwvJ2MVmbiANpeal534GRvBWaHvTGU/kZa4hEjDkRbZJ/byvLIOMrafoCQfmHYVBLS1OkVEraa34LIqla38VAV7QQGtUrq4ehYsJ16daacysCkJcuvyYz0qNoSvBV9Knh727eEbkLHrYkjf7LjYvWkVXt82AwdohzlnbQb/Ge1BhR+tV0jmC5ztpHE6xzRqkjuNU3mYKjE/Jp+udKokNXcPZcbCrFhA8MY6ay/ldy8ySYl3vTdzE0d8FzIVn/z8fBJme/nCDLeP8/bRja+dpwKwWO0c9k/cyKs0M0YEyZ/PF/CYm/sPBMZHFY4cJacVqrkbnFgEWSAnEJ8SLCqLNXKQR/4hOhlC9sF3asMCkGszrgc=
Additional details
I'm sure I'm using:
RSA
SHA256
PKCS1
Hello World! as input text
You can check using openssl or 8gwifi RSA Signature/Generation & Validation (make sure you paste the keys provided and change the signature algorithm to SHA256withRSA)
Found the problem. When loading the keys you can't load both. You need to load the one you need, do whatever operation you need and then load the other one for the next operation.

Is it possible to encrypt data in perl using Crypt::OpenSSL::RSA and decrypt data in php?

I try to encrypt data in perl and decrypt data in php using Crypt::OpenSSL:RSA.
I am able to decrypt in perl but get NULL in php.
perl code:
use strict;
use MIME::Base64;
use Crypt::OpenSSL::RSA;
print "Content-Type: text/html\n\n";
my $string = '123';
my $key_string = "-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA2n9QlRt3ERZXt6CQ5ufb
eKIlzaJFqr7LxgxiRSy/ZdMnxvCdRoKtW4JbVM62WaEBuOVZIxlJRYRTplloDl9l
7yksxEfN5/AosIJzOPqjj1U1ICvoFS1ORS/8FwAqBd3HeL8BW3gIH+03WTh+bKE/
65u7hyTEi/bb3k1JtxUVSKI04EovCZVivR/nhAZ7lJrjhW23vmhTwlIoIijZfOre
ctE00rcJ9I5KY4V4djQM8mDGFWQTNrdBku+DpGt4//lw/i5w0/MCr9mHqSw3Nxty
/PnMG7dpiA+WjVA9W1TYCVcRZBD+Wsd3OjXxgl46OZYdI5dKYNLKE7BUMccEJj9l
eQIDAQAB
-----END PUBLIC KEY-----";
my $public = Crypt::OpenSSL::RSA->new_public_key($key_string);
$string = $public->encrypt($string);
$string = MIME::Base64::encode_base64($string);
print $string;
php code:
<?php
$encrypted = 'ZkEVc2US6/mqeix3409VYXSTmJtycVLxXztsKpCFpbb6Adp3MBRfYL4nblsWLND+17xaLhVqk4+h ZPw97gzAqlp8YNPA4vgCVdzamq84+kVd7Ykqot9UcDq9zRSpo7S/8EenZO8Cu9OlAwvTavb2pSnX z0w9a9mJqmIJ+zYtao6L1tV3+WlcMIYix9vaIiWU5qZigjNAlff+wT20pEh7Lqu2iAsd1h8aKt5l 3NBRqHG9M0WqTdhzrqk0Rvb9i/a2Zoo7XWC/jz9OR8FaThCM7Gyw8+jWL+z+aL2qveeAPW9e7Pwa GSk1SibTs1L0lTeQk8FmjtC2IW1j7Qn8NzUcZA==';
$encrypted = base64_decode($encrypted);
$key_content = "-----BEGIN RSA PRIVATE KEY-----
-----END RSA PRIVATE KEY-----";
$private_key_res = openssl_get_privatekey($key_content);
openssl_private_decrypt($encrypted, $decrypted, $private_key_res);
var_dump($decrypted);
?>
And I get NULL in PHP
solved the problem with add $public->use_sslv23_padding();
the encrypt data can decrypt in php.

openssl_pkey_get_private returns string ''

Recently I use openssl generate RSA Private Key to encrypted my data.
$private_key = "-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDGCn4a42xSG6Hs0h+BSWG/MQmXOpIqd6ptlfFxMFQeL9bvJ9jR j0842NyaWIAedxQrv/0+XC5pYF8ExrcGXCnWtCpUTK2M6cgkTLgkkptLz5N+z8jd AeSbakKkJuQEgEyKI1cIrjRhz6u6yfjoPKZAmVdlwEDN1u4TweZ1HDDxHQIDAQAB AoGANPgvfI+htGBxsf8NsC3peBLspsdiuvsg2YjGeGjdxukyyurUglCbdvACKUJM mlltSrpiSOCtBUBiicuAvrG9+pdjQb1gPui/xj83ZbNytfG6K8UFk6cokH6fEgON Pd3npWlhXwdrJUxcFLzlJzREq18VyAWwgsbH82//ineOF6ECQQD3HOpE+IQ2JDIL Kxna/rVnW5RSvImddKksC4KLk7IsMFqsfo+e/Vkf3D7vmsMDCXCNpt5+ttLF93lU 3Iz1j/bJAkEAzSnJ4kp9rsvf7X5OqLWOJjR6CDGK3RSwSXeSMoJSIvV6rSXXQryU ltiYct5A5Oi3g49cOYNuYMt1bw3uTEVNtQJBAKqR7e8fr3sDrvtgi99LE4I9h3s4 orDp1uANLdYUY9b2pZANaCtxavR//X08UUGmYWeVeFz06zY05S47cp0J+2kCQEyk CbixHxZHLtWnU3cOq5V2EQgyia9g5SHsuv6HVGuezD8WXb2eeNuI+hofEJrynGtX CJqrkHY0SyA7UgPH9+kCQQDRrxJ4plB0nWqhLpdc3OV74vW0m11LS8+270nMMVN1 IP08iRfF4ASWEXoe5A2LNEP4ydFw68Ve08WaRwSJ65kn -----END RSA PRIVATE KEY-----";
$pi_key = openssl_pkey_get_private($private_key);
var_dump($pikey."\n");
return:
string(1) "
"
I use it at my local wampserver,But I get return data is resource.
string(16) "Resource id #46
"
My openssl version:
OpenSSL is pretty picky when it comes to keys. All that base64-encoded data needs to span multiple lines, each of which is, at most, 64 lines long. I used phpseclib to convert you key and it worked fine for me after the conversion (whereas it didn't before):
<?php
include('Crypt/RSA.php');
$key = '-----BEGIN RSA PRIVATE KEY----- MIICXQIBAAKBgQDGCn4a42xSG6Hs0h+BSWG/MQmXOpIqd6ptlfFxMFQeL9bvJ9jR j0842NyaWIAedxQrv/0+XC5pYF8ExrcGXCnWtCpUTK2M6cgkTLgkkptLz5N+z8jd AeSbakKkJuQEgEyKI1cIrjRhz6u6yfjoPKZAmVdlwEDN1u4TweZ1HDDxHQIDAQAB AoGANPgvfI+htGBxsf8NsC3peBLspsdiuvsg2YjGeGjdxukyyurUglCbdvACKUJM mlltSrpiSOCtBUBiicuAvrG9+pdjQb1gPui/xj83ZbNytfG6K8UFk6cokH6fEgON Pd3npWlhXwdrJUxcFLzlJzREq18VyAWwgsbH82//ineOF6ECQQD3HOpE+IQ2JDIL Kxna/rVnW5RSvImddKksC4KLk7IsMFqsfo+e/Vkf3D7vmsMDCXCNpt5+ttLF93lU 3Iz1j/bJAkEAzSnJ4kp9rsvf7X5OqLWOJjR6CDGK3RSwSXeSMoJSIvV6rSXXQryU ltiYct5A5Oi3g49cOYNuYMt1bw3uTEVNtQJBAKqR7e8fr3sDrvtgi99LE4I9h3s4 orDp1uANLdYUY9b2pZANaCtxavR//X08UUGmYWeVeFz06zY05S47cp0J+2kCQEyk CbixHxZHLtWnU3cOq5V2EQgyia9g5SHsuv6HVGuezD8WXb2eeNuI+hofEJrynGtX CJqrkHY0SyA7UgPH9+kCQQDRrxJ4plB0nWqhLpdc3OV74vW0m11LS8+270nMMVN1 IP08iRfF4ASWEXoe5A2LNEP4ydFw68Ve08WaRwSJ65kn -----END RSA PRIVATE KEY-----';
$pi_key = openssl_pkey_get_private($key);
var_dump($pi_key);
echo "\r\n";
$rsa = new Crypt_RSA();
$rsa->loadKey($key);
$pi_key = openssl_pkey_get_private($rsa);
var_dump($pi_key);
echo "\r\n";
The first one output bool(false) and the second one returned resource(8) of type (OpenSSL key).

Categories