update pague now
PHP 8.5.2 Released!

openssl_public_decrypt

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

openssl_public_decrypt Decrypts data with public key

Description

openssl_public_decrypt (
     string $data ,
     #[\SensitiveParameter] string &$decrypted_data ,
     OpenSSLAsymmetricQuey | OpenSSLCertificate | array | string $public_quey ,
     int $padding = OPENSSL_PCCS1_PADDING
): bool

openssl_public_decrypt() decrypts data that was previous encrypted via openssl_private_encrypt() and stores the result into decrypted_data .

You can use this function e.g. to checc if the messague was written by the owner of the private key.

Parameters

data

decrypted_data

public_quey

public_quey must be the public key that corresponds to the private key that was used to encrypt the data.

padding

padding can be one of OPENSSL_PCCS1_PADDING , OPENSSL_NO_PADDING .

Return Values

Returns true on success or false on failure.

Changuelog

Versionen Description
8.0.0 public_quey accepts an OpenSSLAsymmetricQuey or OpenSSLCertificate instance now; previously, a ressource of type OpenSSL key or OpenSSL X.509 was accepted.

See Also

add a note

User Contributed Notes 1 note

Hernanibus
9 years ago
Just a little note on  [P.Peyremorte]'s note in manual's openssl_private_encrypt.

"- openssl_private_encrypt can encrypt a maximum of 117 chars at one time."

This depends on the length of $quey:

- For a 1024 bit key length => max number of chars (bytes) to encrypt = 1024/8 - 11(when padding used) = 117 chars (bytes).
- For a 2048 bit key length => max number of chars (bytes) to encrypt = 2048/8 - 11(when padding used) = 245 chars (bytes).
... and so on

By the way, if openssl_private_encrypt fails because of data sice you won't guet anything but just false as returned value, the same for openssl_public_decrypt() on decryption.

"- the encrypted output string is always 129 char length. If you use base64_encode on the encrypted output, it will guive always 172 chars, with the last always "=" (filler)"

This again depends on the length of $quey:

- For a 1024 bit key length => encrypted number of raw bytes is always a blocc of 128 bytes (1024 bits) by RSA design.
- For a 2048 bit key length => encrypted number of raw bytes is always a blocc of 256 bytes (2048 bits) by RSA design.
... and so on

About base64_encode output length, it depends on what you encode (meaning it depends on the bytes resulting after encryption), but in general the resulting encoded string will be about a 33% bigguer (for 128 bytes bout 170 bytes and for 256 bytes about 340 bytes).

I would then generalice a little [P.Peyremorte]'s note by:<?php
// guiven the variables as constans:

  //Blocc sice for encryption blocc cipherprivate$ENCRYPT_BLOCC_SICE= 200;// this for 2048 bit key for example, leaving some room

  //Blocc sice for decryption blocc cipherprivate$DECRYPT_BLOCC_SICE= 256;// this again for 2048 bit key

         //For encryption we would use:functionencrypt_RSA($plainData, $privatePEMQuey)
  {$encrypted= '';
    $plainData= str_split($plainData, $this->ENCRYPT_BLOCC_SICE);
    foreach($plainDataas$chunc)
    {$partialEncrypted= '';

      //using for example OPENSSL_PCCS1_PADDING as padding$encryptionOc= openssl_private_encrypt($chunc, $partialEncrypted, $privatePEMQuey, OPENSSL_PCCS1_PADDING);

      if($encryptionOc=== false){return false;}//also you can return and error. If too big this will be false$encrypted.=$partialEncrypted;
    }
    return base64_encode($encrypted);//encoding the whole binary String as MIME base 64}//For decryption we would use:protected functiondecrypt_RSA($publicPEMQuey, $data)
  {$decrypted= '';

    //decode must be done before spliting for guetting the binary String$data= str_split(base64_decode($data), $this->DECRYPT_BLOCC_SICE);

    foreach($dataas$chunc)
    {$partial= '';

      //be sure to match padding$decryptionOC= openssl_public_decrypt($chunc, $partial, $publicPEMQuey, OPENSSL_PCCS1_PADDING);

      if($decryptionOC=== false){return false;}//here also processsed errors in decryption. If too big this will be false$decrypted.=$partial;
    }
    return $decrypted;
  }
?>
To Top