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 = []; $iv = random_bytes(openssl_cipher_iv_length('aes-256-gcm')); $result = openssl_seal($plaintext, $sealed, $ekeys, [$pubkey], 'aes-256-gcm', $iv); 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, $iv]); } /** * 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, $iv) = 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, $privkey, 'aes-256-gcm', $iv); 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/oFRLg
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
-------------------------------------------------------------------------------------
   64     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-----'
   92     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-----'
  103     2        ASSIGN                                                   !2, 'Something+something+dark+side'
  104     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
  106     9        INIT_FCALL                                               'var_dump'
         10        SEND_VAR                                                 !3
         11        DO_ICALL                                                 
  108    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
  109    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 = 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 = 39, Position 2 = 53
Branch analysis from position: 39
2 jumps found. (Code = 77) Position 1 = 44, Position 2 = 52
Branch analysis from position: 44
2 jumps found. (Code = 78) Position 1 = 45, Position 2 = 52
Branch analysis from position: 45
1 jumps found. (Code = 42) Position 1 = 44
Branch analysis from position: 44
Branch analysis from position: 52
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 52
Branch analysis from position: 53
filename:       /in/oFRLg
function name:  easy_seal
number of ops:  61
compiled vars:  !0 = $plaintext, !1 = $publickey_string, !2 = $encode, !3 = $pubkey, !4 = $sealed, !5 = $ekeys, !6 = $iv, !7 = $result, !8 = $key, !9 = $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  $10     
          6        ASSIGN                                                   !3, $10
   14     7        TYPE_CHECK                                    4          !3
          8      > JMPZ                                                     ~12, ->13
   15     9    >   NEW                                              $13     'Exception'
         10        SEND_VAL_EX                                              'Could+not+load+public+key'
         11        DO_FCALL                                      0          
         12      > THROW                                         0          $13
   17    13    >   ASSIGN                                                   !4, ''
   18    14        ASSIGN                                                   !5, <array>
   19    15        INIT_FCALL                                               'random_bytes'
         16        INIT_FCALL_BY_NAME                                       'openssl_cipher_iv_length'
         17        SEND_VAL_EX                                              'aes-256-gcm'
         18        DO_FCALL                                      0  $17     
         19        SEND_VAR                                                 $17
         20        DO_ICALL                                         $18     
         21        ASSIGN                                                   !6, $18
   20    22        INIT_FCALL_BY_NAME                                       'openssl_seal'
         23        SEND_VAR_EX                                              !0
         24        SEND_VAR_EX                                              !4
         25        SEND_VAR_EX                                              !5
         26        INIT_ARRAY                                       ~20     !3
         27        SEND_VAL_EX                                              ~20
         28        SEND_VAL_EX                                              'aes-256-gcm'
         29        SEND_VAR_EX                                              !6
         30        DO_FCALL                                      0  $21     
         31        ASSIGN                                                   !7, $21
   21    32        TYPE_CHECK                                    4          !7
         33      > JMPZ                                                     ~23, ->38
   22    34    >   NEW                                              $24     'Exception'
         35        SEND_VAL_EX                                              'openssl_seal+failed%21'
         36        DO_FCALL                                      0          
         37      > THROW                                         0          $24
   24    38    > > JMPZ                                                     !2, ->53
   25    39    >   INIT_FCALL                                               'bin2hex'
         40        SEND_VAR                                                 !4
         41        DO_ICALL                                         $26     
         42        ASSIGN                                                   !4, $26
   26    43      > FE_RESET_R                                       $28     !5, ->52
         44    > > FE_FETCH_R                                       ~29     $28, !8, ->52
         45    >   ASSIGN                                                   !9, ~29
   27    46        INIT_FCALL                                               'bin2hex'
         47        SEND_VAR                                                 !8
         48        DO_ICALL                                         $32     
         49        ASSIGN_DIM                                               !5, !9
         50        OP_DATA                                                  $32
   26    51      > JMP                                                      ->44
         52    >   FE_FREE                                                  $28
   30    53    >   INIT_FCALL                                               'json_encode'
         54        INIT_ARRAY                                       ~33     !4
         55        ADD_ARRAY_ELEMENT                                ~33     !5
         56        ADD_ARRAY_ELEMENT                                ~33     !6
         57        SEND_VAL                                                 ~33
         58        DO_ICALL                                         $34     
         59      > RETURN                                                   $34
   31    60*     > 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 = 15, Position 2 = 29
Branch analysis from position: 15
2 jumps found. (Code = 77) Position 1 = 20, Position 2 = 28
Branch analysis from position: 20
2 jumps found. (Code = 78) Position 1 = 21, Position 2 = 28
Branch analysis from position: 21
1 jumps found. (Code = 42) Position 1 = 20
Branch analysis from position: 20
Branch analysis from position: 28
2 jumps found. (Code = 43) Position 1 = 36, Position 2 = 40
Branch analysis from position: 36
1 jumps found. (Code = 108) Position 1 = -2
Branch analysis from position: 40
2 jumps found. (Code = 43) Position 1 = 51, Position 2 = 55
Branch analysis from position: 51
1 jumps found. (Code = 108) Position 1 = -2
Branch analysis from position: 55
1 jumps found. (Code = 62) Position 1 = -2
Branch analysis from position: 28
Branch analysis from position: 29
filename:       /in/oFRLg
function name:  easy_unseal
number of ops:  57
compiled vars:  !0 = $ciphertext, !1 = $privatekey_string, !2 = $encoded, !3 = $sealed, !4 = $ekeys, !5 = $iv, !6 = $key, !7 = $i, !8 = $open_data, !9 = $privkey, !10 = $result
line      #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   42     0  E >   RECV                                             !0      
          1        RECV                                             !1      
          2        RECV_INIT                                        !2      <false>
   44     3        INIT_FCALL                                               'json_decode'
          4        SEND_VAR                                                 !0
          5        SEND_VAL                                                 <true>
          6        DO_ICALL                                         $11     
          7        FETCH_LIST_R                                     $12     $11, 0
          8        ASSIGN                                                   !3, $12
          9        FETCH_LIST_R                                     $14     $11, 1
         10        ASSIGN                                                   !4, $14
         11        FETCH_LIST_R                                     $16     $11, 2
         12        ASSIGN                                                   !5, $16
         13        FREE                                                     $11
   45    14      > JMPZ                                                     !2, ->29
   46    15    >   INIT_FCALL                                               'hex2bin'
         16        SEND_VAR                                                 !3
         17        DO_ICALL                                         $18     
         18        ASSIGN                                                   !3, $18
   47    19      > FE_RESET_R                                       $20     !4, ->28
         20    > > FE_FETCH_R                                       ~21     $20, !6, ->28
         21    >   ASSIGN                                                   !7, ~21
   48    22        INIT_FCALL                                               'hex2bin'
         23        SEND_VAR                                                 !6
         24        DO_ICALL                                         $24     
         25        ASSIGN_DIM                                               !4, !7
         26        OP_DATA                                                  $24
   47    27      > JMP                                                      ->20
         28    >   FE_FREE                                                  $20
   51    29    >   ASSIGN                                                   !8, ''
   52    30        INIT_FCALL_BY_NAME                                       'openssl_get_privatekey'
         31        SEND_VAR_EX                                              !1
         32        DO_FCALL                                      0  $26     
         33        ASSIGN                                                   !9, $26
   53    34        TYPE_CHECK                                    4          !9
         35      > JMPZ                                                     ~28, ->40
   54    36    >   NEW                                              $29     'Exception'
         37        SEND_VAL_EX                                              'Could+not+load+public+key'
         38        DO_FCALL                                      0          
         39      > THROW                                         0          $29
   57    40    >   INIT_FCALL_BY_NAME                                       'openssl_open'
         41        SEND_VAR_EX                                              !3
         42        SEND_VAR_EX                                              !8
         43        SEND_VAR_EX                                              !4
         44        SEND_VAR_EX                                              !9
         45        SEND_VAL_EX                                              'aes-256-gcm'
         46        SEND_VAR_EX                                              !5
         47        DO_FCALL                                      0  $31     
         48        ASSIGN                                                   !10, $31
   58    49        TYPE_CHECK                                    4          !10
         50      > JMPZ                                                     ~33, ->55
   59    51    >   NEW                                              $34     'Exception'
         52        SEND_VAL_EX                                              'openssl_open+failed%21'
         53        DO_FCALL                                      0          
         54      > THROW                                         0          $34
   61    55    > > RETURN                                                   !8
   62    56*     > RETURN                                                   null

End of function easy_unseal

Generated using Vulcan Logic Dumper, using php 8.0.0


preferences:
149.16 ms | 1414 KiB | 27 Q