3v4l.org

run code in 300+ PHP versions simultaneously
<?php /** * A human-usable variant of openssl_seal() * * @param string $plaintext Your message * @param string $publickey_string PEM-encoded RSA public key * @param boolean $encode Hex-encode the output? * * @return string */ function easy_seal($plaintext, $publickey_string, $encode = false) { $pubkey = openssl_get_publickey($publickey_string); if ($pubkey === false) { throw new Exception('Could not load public key'); } $sealed = ''; $ekeys = []; $result = openssl_seal($plaintext, $sealed, $ekeys, [$pubkey]); if ($result === false) { throw new Exception('openssl_seal failed!'); } if ($encode) { $sealed = bin2hex($sealed); foreach ($ekeys as $i => $key) { $ekeys[$i] = bin2hex($key); } } return json_encode([$sealed, $ekeys]); } /** * Inverse operation of easy_seal() * * @param string $ciphertext (the output of easy_seal()) * @param string $privatekey_string PEM-encoded RSA private key * @param boolean $encoded Do we need to decode from hex? * * @return string */ function easy_unseal($ciphertext, $privatekey_string, $encoded = false) { list($sealed, $ekeys) = json_decode($ciphertext, true); if ($encoded) { $sealed = hex2bin($sealed); foreach ($ekeys as $i => $key) { $ekeys[$i] = hex2bin($key); } } $open_data = ''; $privkey = openssl_get_privatekey($privatekey_string); if ($privkey === false) { throw new Exception('Could not load public key'); } $result = openssl_open($sealed, $open_data, $ekeys[0], $privkey); if ($result === false) { throw new Exception('openssl_open failed!'); } return $open_data; } $private_key_pem = "-----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEAtCY43TsWfw+Ep8FiU0Z/DiivoyHAFzckFttOgBh9wZMI+zYy XAmvmbpFh6EsfAn1zcZAJNIjb7jXt9ySD8/gTHSvVRhawysSk+jvG7bVNy+JmEcb B0bIFLUVud1sZWJANv999iub1Rpzb6xIhZ5ZsEDMob4UWxouKPfrRQcYlrI3X7d/ VLfmnU/sSzpS6eHn+f064zXXmf1tVIBwEKkq/eaxgJyW8AM8XL5qL9RueHhihQm/ G71cMVc5XXgoVy8+egx/aQm2u26d9ez1Vu804ptJoLAnjTdx1an5CKFikpvt2OYP ZVFuWV6cqMMCksqzBSZKMu7wtaiEc/UN41UHcQIDAQABAoIBAGxiyregA0rzBTcB DK1ZrrvQEswtVCsji90MmVBMa+z5D+BEnUvur+3nukl92QvP2kmxy4nbvGJNbcw7 Ms28nhCh65NhEcp2sbi33pRoDiQjv78UmNhp55s90BKBe+QLluMAGMLxPdKbFXTM zN1HhmKaugNeH1UojTks4CopuMuA7wr31McD8AjNZWdg2w4zDbnSy0UuLH90Bq6i tpRtVZmeD6Y7KmJOzt7/vNPbp9BabLUQarCy2Pg16Zr3GG0g0Q7AIjoF2yqHfebI nJs6bjEiUPL8MGU41iwbVoFWJm1T9NZcfydd26vkUPOXnuGorLTsyJ7nQCKSKv12 mfenp4ECgYEA5PCiN5T/CC11BTerLiQl1QPopGt1XOvg/5DaFi/B4/QmZ7ZND27r fwiZBCAF0B6N5alJfmZHbraO0LcxM8EWB29f9y+t6rttIaKQlsLBkfe64RpNpRKX viTf5TWuI8HgZBs20IzqPow4DeoaH7a2PxqfMa36IfSasO097pkLIAkCgYEAyXFC Sb48uaHt2LJqmdaxQg1im5WEZkh19a/0l02nVshi+4cOTS3MiRqoSfpM/baaAzfI GOpaCbcXtah3k0m5tXeBvXYxZJxUEVO/PdGQlg1ZO8h1UOfsgyjM3YDUG9mcofFo hOaGM4RHVt7pLAj42B/PAoZVYjNLXX6g1/YzNikCgYEAu8AkKJUGebxdxYOb3OFE LWdhOMXvn97JzI0MbTmJNtqZTGCS3d9HPgzdACcK3VzRXdDxNrnGRyNsB/rUXO8y k7Jg7ySo6mH+46CgFyNs/7o8BjM+DewriYJQI3dccnKjBTXURD/sMpNnvPGJrwx2 dVXtzB4zjfk9i29kZPIZz5ECgYEAwNeXAOeIVKFrA57RpFI+QSB1PMJnDE/j9P6s JUhmoRKWh3pkO4hTnRES+DcRC3WKfPgiq492AITxwqrzReI3UTyFzG1gnZN2e1vz 4WdEhhFjUnL1tC1CYtFlRct1wu+RHgrv5wKUiK7iaIxfJhO0vZm94AnfpXG7fVai /fuoTPkCgYEA0pxWFSyEOeQt1LV3rTZGxK6QAt5h36JYWt8/ck2YrMeZn2wAv+hy ZgtWsdrJLvEVId3wH79vCQtAjZJAyCVxAhXPlAhxmA8F3LOqEgwrnls52SmWw/5T sVlqPCXEO3fNZLOd5sYYmiaQjWbP4dAP5WQU75UhYAnyz6Myz3rbN58= -----END RSA PRIVATE KEY-----"; $public_key_pem = "-----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtCY43TsWfw+Ep8FiU0Z/ DiivoyHAFzckFttOgBh9wZMI+zYyXAmvmbpFh6EsfAn1zcZAJNIjb7jXt9ySD8/g THSvVRhawysSk+jvG7bVNy+JmEcbB0bIFLUVud1sZWJANv999iub1Rpzb6xIhZ5Z sEDMob4UWxouKPfrRQcYlrI3X7d/VLfmnU/sSzpS6eHn+f064zXXmf1tVIBwEKkq /eaxgJyW8AM8XL5qL9RueHhihQm/G71cMVc5XXgoVy8+egx/aQm2u26d9ez1Vu80 4ptJoLAnjTdx1an5CKFikpvt2OYPZVFuWV6cqMMCksqzBSZKMu7wtaiEc/UN41UH cQIDAQAB -----END PUBLIC KEY-----"; $plaintext = 'Something something dark side'; $store_me = easy_seal($plaintext, $public_key_pem, true); var_dump($store_me); $visible = easy_unseal($store_me, $private_key_pem, true); var_dump($visible);
Finding entry points
Branch analysis from position: 0
1 jumps found. (Code = 62) Position 1 = -2
filename:       /in/r7Esp
function name:  (null)
number of ops:  22
compiled vars:  !0 = $private_key_pem, !1 = $public_key_pem, !2 = $plaintext, !3 = $store_me, !4 = $visible
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   63     0  E >   ASSIGN                                                   !0, '-----BEGIN+RSA+PRIVATE+KEY-----%0AMIIEpQIBAAKCAQEAtCY43TsWfw%2BEp8FiU0Z%2FDiivoyHAFzckFttOgBh9wZMI%2BzYy%0AXAmvmbpFh6EsfAn1zcZAJNIjb7jXt9ySD8%2FgTHSvVRhawysSk%2BjvG7bVNy%2BJmEcb%0AB0bIFLUVud1sZWJANv999iub1Rpzb6xIhZ5ZsEDMob4UWxouKPfrRQcYlrI3X7d%2F%0AVLfmnU%2FsSzpS6eHn%2Bf064zXXmf1tVIBwEKkq%2FeaxgJyW8AM8XL5qL9RueHhihQm%2F%0AG71cMVc5XXgoVy8%2Begx%2FaQm2u26d9ez1Vu804ptJoLAnjTdx1an5CKFikpvt2OYP%0AZVFuWV6cqMMCksqzBSZKMu7wtaiEc%2FUN41UHcQIDAQABAoIBAGxiyregA0rzBTcB%0ADK1ZrrvQEswtVCsji90MmVBMa%2Bz5D%2BBEnUvur%2B3nukl92QvP2kmxy4nbvGJNbcw7%0AMs28nhCh65NhEcp2sbi33pRoDiQjv78UmNhp55s90BKBe%2BQLluMAGMLxPdKbFXTM%0AzN1HhmKaugNeH1UojTks4CopuMuA7wr31McD8AjNZWdg2w4zDbnSy0UuLH90Bq6i%0AtpRtVZmeD6Y7KmJOzt7%2FvNPbp9BabLUQarCy2Pg16Zr3GG0g0Q7AIjoF2yqHfebI%0AnJs6bjEiUPL8MGU41iwbVoFWJm1T9NZcfydd26vkUPOXnuGorLTsyJ7nQCKSKv12%0Amfenp4ECgYEA5PCiN5T%2FCC11BTerLiQl1QPopGt1XOvg%2F5DaFi%2FB4%2FQmZ7ZND27r%0AfwiZBCAF0B6N5alJfmZHbraO0LcxM8EWB29f9y%2Bt6rttIaKQlsLBkfe64RpNpRKX%0AviTf5TWuI8HgZBs20IzqPow4DeoaH7a2PxqfMa36IfSasO097pkLIAkCgYEAyXFC%0ASb48uaHt2LJqmdaxQg1im5WEZkh19a%2F0l02nVshi%2B4cOTS3MiRqoSfpM%2FbaaAzfI%0AGOpaCbcXtah3k0m5tXeBvXYxZJxUEVO%2FPdGQlg1ZO8h1UOfsgyjM3YDUG9mcofFo%0AhOaGM4RHVt7pLAj42B%2FPAoZVYjNLXX6g1%2FYzNikCgYEAu8AkKJUGebxdxYOb3OFE%0ALWdhOMXvn97JzI0MbTmJNtqZTGCS3d9HPgzdACcK3VzRXdDxNrnGRyNsB%2FrUXO8y%0Ak7Jg7ySo6mH%2B46CgFyNs%2F7o8BjM%2BDewriYJQI3dccnKjBTXURD%2FsMpNnvPGJrwx2%0AdVXtzB4zjfk9i29kZPIZz5ECgYEAwNeXAOeIVKFrA57RpFI%2BQSB1PMJnDE%2Fj9P6s%0AJUhmoRKWh3pkO4hTnRES%2BDcRC3WKfPgiq492AITxwqrzReI3UTyFzG1gnZN2e1vz%0A4WdEhhFjUnL1tC1CYtFlRct1wu%2BRHgrv5wKUiK7iaIxfJhO0vZm94AnfpXG7fVai%0A%2FfuoTPkCgYEA0pxWFSyEOeQt1LV3rTZGxK6QAt5h36JYWt8%2Fck2YrMeZn2wAv%2Bhy%0AZgtWsdrJLvEVId3wH79vCQtAjZJAyCVxAhXPlAhxmA8F3LOqEgwrnls52SmWw%2F5T%0AsVlqPCXEO3fNZLOd5sYYmiaQjWbP4dAP5WQU75UhYAnyz6Myz3rbN58%3D%0A-----END+RSA+PRIVATE+KEY-----'
   91     1        ASSIGN                                                   !1, '-----BEGIN+PUBLIC+KEY-----%0AMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtCY43TsWfw%2BEp8FiU0Z%2F%0ADiivoyHAFzckFttOgBh9wZMI%2BzYyXAmvmbpFh6EsfAn1zcZAJNIjb7jXt9ySD8%2Fg%0ATHSvVRhawysSk%2BjvG7bVNy%2BJmEcbB0bIFLUVud1sZWJANv999iub1Rpzb6xIhZ5Z%0AsEDMob4UWxouKPfrRQcYlrI3X7d%2FVLfmnU%2FsSzpS6eHn%2Bf064zXXmf1tVIBwEKkq%0A%2FeaxgJyW8AM8XL5qL9RueHhihQm%2FG71cMVc5XXgoVy8%2Begx%2FaQm2u26d9ez1Vu80%0A4ptJoLAnjTdx1an5CKFikpvt2OYPZVFuWV6cqMMCksqzBSZKMu7wtaiEc%2FUN41UH%0AcQIDAQAB%0A-----END+PUBLIC+KEY-----'
  102     2        ASSIGN                                                   !2, 'Something+something+dark+side'
  103     3        INIT_FCALL                                               'easy_seal'
          4        SEND_VAR                                                 !2
          5        SEND_VAR                                                 !1
          6        SEND_VAL                                                 <true>
          7        DO_FCALL                                      0  $8      
          8        ASSIGN                                                   !3, $8
  105     9        INIT_FCALL                                               'var_dump'
         10        SEND_VAR                                                 !3
         11        DO_ICALL                                                 
  107    12        INIT_FCALL                                               'easy_unseal'
         13        SEND_VAR                                                 !3
         14        SEND_VAR                                                 !0
         15        SEND_VAL                                                 <true>
         16        DO_FCALL                                      0  $11     
         17        ASSIGN                                                   !4, $11
  108    18        INIT_FCALL                                               'var_dump'
         19        SEND_VAR                                                 !4
         20        DO_ICALL                                                 
         21      > RETURN                                                   1

Function easy_seal:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 9, Position 2 = 13
Branch analysis from position: 9
1 jumps found. (Code = 108) Position 1 = -2
Branch analysis from position: 13
2 jumps found. (Code = 43) Position 1 = 25, Position 2 = 29
Branch analysis from position: 25
1 jumps found. (Code = 108) Position 1 = -2
Branch analysis from position: 29
2 jumps found. (Code = 43) Position 1 = 30, Position 2 = 44
Branch analysis from position: 30
2 jumps found. (Code = 77) Position 1 = 35, Position 2 = 43
Branch analysis from position: 35
2 jumps found. (Code = 78) Position 1 = 36, Position 2 = 43
Branch analysis from position: 36
1 jumps found. (Code = 42) Position 1 = 35
Branch analysis from position: 35
Branch analysis from position: 43
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 43
Branch analysis from position: 44
filename:       /in/r7Esp
function name:  easy_seal
number of ops:  51
compiled vars:  !0 = $plaintext, !1 = $publickey_string, !2 = $encode, !3 = $pubkey, !4 = $sealed, !5 = $ekeys, !6 = $result, !7 = $key, !8 = $i
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   11     0  E >   RECV                                             !0      
          1        RECV                                             !1      
          2        RECV_INIT                                        !2      <false>
   13     3        INIT_FCALL_BY_NAME                                       'openssl_get_publickey'
          4        SEND_VAR_EX                                              !1
          5        DO_FCALL                                      0  $9      
          6        ASSIGN                                                   !3, $9
   14     7        TYPE_CHECK                                    4          !3
          8      > JMPZ                                                     ~11, ->13
   15     9    >   NEW                                              $12     'Exception'
         10        SEND_VAL_EX                                              'Could+not+load+public+key'
         11        DO_FCALL                                      0          
         12      > THROW                                         0          $12
   17    13    >   ASSIGN                                                   !4, ''
   18    14        ASSIGN                                                   !5, <array>
   19    15        INIT_FCALL_BY_NAME                                       'openssl_seal'
         16        SEND_VAR_EX                                              !0
         17        SEND_VAR_EX                                              !4
         18        SEND_VAR_EX                                              !5
         19        INIT_ARRAY                                       ~16     !3
         20        SEND_VAL_EX                                              ~16
         21        DO_FCALL                                      0  $17     
         22        ASSIGN                                                   !6, $17
   20    23        TYPE_CHECK                                    4          !6
         24      > JMPZ                                                     ~19, ->29
   21    25    >   NEW                                              $20     'Exception'
         26        SEND_VAL_EX                                              'openssl_seal+failed%21'
         27        DO_FCALL                                      0          
         28      > THROW                                         0          $20
   23    29    > > JMPZ                                                     !2, ->44
   24    30    >   INIT_FCALL                                               'bin2hex'
         31        SEND_VAR                                                 !4
         32        DO_ICALL                                         $22     
         33        ASSIGN                                                   !4, $22
   25    34      > FE_RESET_R                                       $24     !5, ->43
         35    > > FE_FETCH_R                                       ~25     $24, !7, ->43
         36    >   ASSIGN                                                   !8, ~25
   26    37        INIT_FCALL                                               'bin2hex'
         38        SEND_VAR                                                 !7
         39        DO_ICALL                                         $28     
         40        ASSIGN_DIM                                               !5, !8
         41        OP_DATA                                                  $28
   25    42      > JMP                                                      ->35
         43    >   FE_FREE                                                  $24
   29    44    >   INIT_FCALL                                               'json_encode'
         45        INIT_ARRAY                                       ~29     !4
         46        ADD_ARRAY_ELEMENT                                ~29     !5
         47        SEND_VAL                                                 ~29
         48        DO_ICALL                                         $30     
         49      > RETURN                                                   $30
   30    50*     > RETURN                                                   null

End of function easy_seal

Function easy_unseal:
Finding entry points
Branch analysis from position: 0
2 jumps found. (Code = 43) Position 1 = 13, Position 2 = 27
Branch analysis from position: 13
2 jumps found. (Code = 77) Position 1 = 18, Position 2 = 26
Branch analysis from position: 18
2 jumps found. (Code = 78) Position 1 = 19, Position 2 = 26
Branch analysis from position: 19
1 jumps found. (Code = 42) Position 1 = 18
Branch analysis from position: 18
Branch analysis from position: 26
2 jumps found. (Code = 43) Position 1 = 34, Position 2 = 38
Branch analysis from position: 34
1 jumps found. (Code = 108) Position 1 = -2
Branch analysis from position: 38
2 jumps found. (Code = 43) Position 1 = 49, Position 2 = 53
Branch analysis from position: 49
1 jumps found. (Code = 108) Position 1 = -2
Branch analysis from position: 53
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 26
Branch analysis from position: 27
filename:       /in/r7Esp
function name:  easy_unseal
number of ops:  55
compiled vars:  !0 = $ciphertext, !1 = $privatekey_string, !2 = $encoded, !3 = $sealed, !4 = $ekeys, !5 = $key, !6 = $i, !7 = $open_data, !8 = $privkey, !9 = $result
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   41     0  E >   RECV                                             !0      
          1        RECV                                             !1      
          2        RECV_INIT                                        !2      <false>
   43     3        INIT_FCALL                                               'json_decode'
          4        SEND_VAR                                                 !0
          5        SEND_VAL                                                 <true>
          6        DO_ICALL                                         $10     
          7        FETCH_LIST_R                                     $11     $10, 0
          8        ASSIGN                                                   !3, $11
          9        FETCH_LIST_R                                     $13     $10, 1
         10        ASSIGN                                                   !4, $13
         11        FREE                                                     $10
   44    12      > JMPZ                                                     !2, ->27
   45    13    >   INIT_FCALL                                               'hex2bin'
         14        SEND_VAR                                                 !3
         15        DO_ICALL                                         $15     
         16        ASSIGN                                                   !3, $15
   46    17      > FE_RESET_R                                       $17     !4, ->26
         18    > > FE_FETCH_R                                       ~18     $17, !5, ->26
         19    >   ASSIGN                                                   !6, ~18
   47    20        INIT_FCALL                                               'hex2bin'
         21        SEND_VAR                                                 !5
         22        DO_ICALL                                         $21     
         23        ASSIGN_DIM                                               !4, !6
         24        OP_DATA                                                  $21
   46    25      > JMP                                                      ->18
         26    >   FE_FREE                                                  $17
   50    27    >   ASSIGN                                                   !7, ''
   51    28        INIT_FCALL_BY_NAME                                       'openssl_get_privatekey'
         29        SEND_VAR_EX                                              !1
         30        DO_FCALL                                      0  $23     
         31        ASSIGN                                                   !8, $23
   52    32        TYPE_CHECK                                    4          !8
         33      > JMPZ                                                     ~25, ->38
   53    34    >   NEW                                              $26     'Exception'
         35        SEND_VAL_EX                                              'Could+not+load+public+key'
         36        DO_FCALL                                      0          
         37      > THROW                                         0          $26
   56    38    >   INIT_FCALL_BY_NAME                                       'openssl_open'
         39        SEND_VAR_EX                                              !3
         40        SEND_VAR_EX                                              !7
         41        CHECK_FUNC_ARG                                           
         42        FETCH_DIM_FUNC_ARG                               $28     !4, 0
         43        SEND_FUNC_ARG                                            $28
         44        SEND_VAR_EX                                              !8
         45        DO_FCALL                                      0  $29     
         46        ASSIGN                                                   !9, $29
   57    47        TYPE_CHECK                                    4          !9
         48      > JMPZ                                                     ~31, ->53
   58    49    >   NEW                                              $32     'Exception'
         50        SEND_VAL_EX                                              'openssl_open+failed%21'
         51        DO_FCALL                                      0          
         52      > THROW                                         0          $32
   60    53    > > RETURN                                                   !7
   61    54*     > RETURN                                                   null

End of function easy_unseal

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
173.04 ms | 1411 KiB | 25 Q