Skip to content

Instantly share code, notes, and snippets.

@airways
Last active September 27, 2022 01:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save airways/ba958bc14174d3f79448a66165dbf04a to your computer and use it in GitHub Desktop.
Save airways/ba958bc14174d3f79448a66165dbf04a to your computer and use it in GitHub Desktop.
I'm Mr. Meeseeks the PHP Encryption Tool, look at me!

I'm Mr. Meeseeks the PHP Encryption Tool, look at me!

Hey buddy, this utility can help you improve your golf swing!

No wait, it can help you encrypt and decrypt files!


This is a probably very insecure encryption/decryption utility written in PHP.

It creates self-extracting executable PHP scripts which contain their own archive data.

You can also use your own copy of meeseeks.php to decrypt any .meeseeks file you recieve. It will detect the special marker comment and get the data after that, ignoring the script before it.

You can verify a .meeseeks file has not been modified by comparing it to the copy in this gist. The only differences should be in the preamble explaining that it is a self extracting script. The remaining difference should be 100% BASE64 encoded data.

$ diff -l meeseeks.php meeseeks.php.meeseeks

(see meeseeks.php.diff-against.meeseeks.php.meeseeks.diff at the end of this gist for what it should look like)

The encryopted copy of meeseeks.php.meeseeks below was encrypted with this key:

14A9357CF652D9839BF266F4209A8E3D

You can decrypt it like this:

php ./meeseeks.php.meeseeks decrypt -k 14A9357CF652D9839BF266F4209A8E3D

(this will replace meeseeks.php if you already download it)

or using meeseeks.php (and avoiding clobbering it):

mkdir ./data
mv ./meeseeks.php.meeseeks ./data/meeseeks.php.meeseeks
php ./meeseeks.php decrypt -f ./data/meeseeks.php.meeseeks -k 14A9357CF652D9839BF266F4209A8E3D

Oh and please let me know how insecure this is!

Thanks!

<?php
// I'm Mr. Meeseeks the PHP Encryption Tool, look at me!
//
// Cobbled together with great trepidation by Blueapples.
//
// Visit me at Blueapples.org
//
// Version 1.0, 2022-09-26.
define('LF', "\n");
function meeseeks_error(int $code, string|array|object $message = 'Unknown error') {
echo str_repeat('!', 80).LF;
if(is_array($message) || is_object($message)) $message = json_encode($message);
echo 'MEESEEKS ERROR #'.$code.': '.$message.LF.LF;
exit;
}
function meeseeks_sanitize(array &$data) {
foreach($data as $k => $v) {
if(strpos(strtolower($k), 'email') !== FALSE) {
$v = filter_var($v, FILTER_SANITIZE_EMAIL);
}
$v = str_replace(LF, '|EOL|', $v);
$v = strip_tags($v);
$v = filter_var($v, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
$data[$k] = $v;
}
}
function meeseeks_implode($data) {
if(!is_array($data) && !is_object($data)) {
exit(meeseeks_error(600, 'Cannot implode non-array/non-object value:'.$data));
}
$type = is_object($data) ? 'OBJ' : 'ARR';
$data = (array)$data;
ksort($data);
$result = 'MEESEEKS<0>';
$result .= $type.'<0>';
$result .= implode('<1>', array_keys($data)).'<0>';
$result .= implode('<1>', $data).'<0>';
$result .= md5($result).'<0>';
return $result;
}
function meeseeks_explode($str) {
$data = explode('<0>', $str);
$sig = $data[0];
$type = $data[1];
$keys = $data[2];
$vals = $data[3];
$hash = $data[4];
if($sig !== 'MEESEEKS') {
exit(meeseeks_error(700, ['err' => 'Invalid MV signature (should be MEESEEKS)', 'str' => $str]));
}
$keys = explode('<1>', $keys);
$vals = explode('<1>', $vals);
if(count($keys) !== count($vals)) {
exit(meeseeks_error(701, ['err' => 'Parallel arrays differ in length', 'str' => $str]));
}
$result = array_combine($keys, $vals);
switch($type) {
case 'ARR':
break;
case 'OBJ':
$result = (object)$result;
break;
default:
exit(meeseeks_error(702, ['err' => 'Invalid type', 'str' => $str]));
}
return $result;
}
class UnsafeCrypto
{
const METHOD = 'aes-256-ctr';
/**
* Encrypts (but does not authenticate) a message
*
* @param string $message - plaintext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encode - set to TRUE to return a base64-encoded
* @return string (raw binary)
*/
public static function encrypt($message, $key, $encode = false)
{
$nonceSize = openssl_cipher_iv_length(self::METHOD);
$nonce = openssl_random_pseudo_bytes($nonceSize);
$ciphertext = openssl_encrypt(
$message,
self::METHOD,
$key,
OPENSSL_RAW_DATA,
$nonce
);
// Now let's pack the IV and the ciphertext together
// Naively, we can just concatenate
if ($encode) {
return base64_encode($nonce.$ciphertext);
}
return $nonce.$ciphertext;
}
/**
* Decrypts (but does not verify) a message
*
* @param string $message - ciphertext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encoded - are we expecting an encoded string?
* @return string
*/
public static function decrypt($message, $key, $encoded = false)
{
if ($encoded) {
$message = base64_decode($message, true);
if ($message === false) {
throw new Exception('Encryption failure');
}
}
$nonceSize = openssl_cipher_iv_length(self::METHOD);
$nonce = mb_substr($message, 0, $nonceSize, '8bit');
$ciphertext = mb_substr($message, $nonceSize, null, '8bit');
$plaintext = openssl_decrypt(
$ciphertext,
self::METHOD,
$key,
OPENSSL_RAW_DATA,
$nonce
);
return $plaintext;
}
}
class SaferCrypto extends UnsafeCrypto
{
const HASH_ALGO = 'sha256';
/**
* Encrypts then MACs a message
*
* @param string $message - plaintext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encode - set to TRUE to return a base64-encoded string
* @return string (raw binary)
*/
public static function encrypt($message, $key, $encode = false)
{
list($encKey, $authKey) = self::splitKeys($key);
// Pass to UnsafeCrypto::encrypt
$ciphertext = parent::encrypt($message, $encKey);
// Calculate a MAC of the IV and ciphertext
$mac = hash_hmac(self::HASH_ALGO, $ciphertext, $authKey, true);
if ($encode) {
return base64_encode($mac.$ciphertext);
}
// Prepend MAC to the ciphertext and return to caller
return $mac.$ciphertext;
}
/**
* Decrypts a message (after verifying integrity)
*
* @param string $message - ciphertext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encoded - are we expecting an encoded string?
* @return string (raw binary)
*/
public static function decrypt($message, $key, $encoded = false)
{
list($encKey, $authKey) = self::splitKeys($key);
if ($encoded) {
$message = base64_decode($message, true);
if ($message === false) {
throw new Exception('Encryption failure');
}
}
// Hash Size -- in case HASH_ALGO is changed
$hs = mb_strlen(hash(self::HASH_ALGO, '', true), '8bit');
$mac = mb_substr($message, 0, $hs, '8bit');
$ciphertext = mb_substr($message, $hs, null, '8bit');
$calculated = hash_hmac(
self::HASH_ALGO,
$ciphertext,
$authKey,
true
);
if (!self::hashEquals($mac, $calculated)) {
throw new Exception('Encryption failure');
}
// Pass to UnsafeCrypto::decrypt
$plaintext = parent::decrypt($ciphertext, $encKey);
return $plaintext;
}
/**
* Splits a key into two separate keys; one for encryption
* and the other for authenticaiton
*
* @param string $masterKey (raw binary)
* @return array (two raw binary strings)
*/
protected static function splitKeys($masterKey)
{
// You really want to implement HKDF here instead!
return [
hash_hmac(self::HASH_ALGO, 'ENCRYPTION', $masterKey, true),
hash_hmac(self::HASH_ALGO, 'AUTHENTICATION', $masterKey, true)
];
}
/**
* Compare two strings without leaking timing information
*
* @param string $a
* @param string $b
* @ref https://paragonie.com/b/WS1DLx6BnpsdaVQW
* @return boolean
*/
protected static function hashEquals($a, $b)
{
if (function_exists('hash_equals')) {
return hash_equals($a, $b);
}
$nonce = openssl_random_pseudo_bytes(32);
return hash_hmac(self::HASH_ALGO, $a, $nonce) === hash_hmac(self::HASH_ALGO, $b, $nonce);
}
}
function meeseeks_encrypt(string $key, string|array|object $data) {
if(strlen($key) < 32) {
echo$key.LF;
exit(meeseeks_error(604, 'Encrypt key is not long enough: '.strlen($key)));
}
if(is_object($data) || is_array($data)) {
$data = json_encode($data);
}
return chunk_split(base64_encode(SaferCrypto::encrypt($data, $key)), separator: LF);
}
function meeseeks_decrypt(string $key, string $data, string|array|object $default=NULL, bool $throwException=FALSE): string|array|object {
if(strlen($key) < 32) {
exit(meeseeks_error(604, 'Decrypt key is not long enough: '.strlen($key)));
}
try {
$data = SaferCrypto::decrypt(base64_decode($data), $key);
if(substr($data, 0, 1) == '{'
||substr($data, 0, 1) == '[') {
$data = json_decode($data);
}
} catch(Exception $e) {
if($throwException) {
throw $e;
}
return $default;
}
return $data;
}
function meeseeks_signdata(string $sig_key, string|array|object &$data): string|array|object {
if(is_object($data) || is_array($data)) {
// turn array or object into string
$signature = meeseeks_implode($data);
}
// hash the string
$signature = md5($signature);
//echo 'Outgoing hash: '.$signature.LF;
// encrypt the hash
$signature = meeseeks_encrypt($signature, $sig_key);
//echo 'Outgoing encrypted hash: '.$signature.LF;
if(strlen(meeseeks_decrypt($signature, $sig_key)) !== 32) {
exit(meeseeks_error(601, 'Generated signature is invalid length'));
}
// make signature easier to read
$signature = trim(str_replace('=', '', chunk_split($signature, 8, ' ')));
//echo 'Outgoing encrypted hash: '.$signature;
// add signature to incoming data
if(is_object($data)) {
$data->signature = $signature;
} elseif(is_array($data)) {
$data['signature'] = $signature;
} else {
$data .= '<0>'.$signature;
}
return $signature;
}
function meeseeks_signcheck(string $sig_key, string|array|object $data): bool {
// get signature from the data
// we also need to unset it from our
// copy so we can recalculate the correct
// hash
$data = clone $data;
if(is_array($data)) {
$signature = $data['signature'];
unset($data['signature']);
} elseif(is_object($data)) {
$signature = $data->signature;
unset($data->signature);
} else {
$data = explode('<0>', $data);
$signature = array_pop($data);
$data = implode('<0>', $data);
}
// turn array or object into string
if(is_object($data) || is_array($object)) {
$data = meeseeks_implode($data);
}
// hash the string
$check_signature = md5($data);
//echo 'Incoming encrypted hash: '.$signature;
// decrypt the incoming hash
$signature = meeseeks_decrypt($signature, $sig_key);
//echo 'Incoming hash: '.$signature.LF;
//echo 'Check hash : '.$check_signature.LF;
return !is_null($signature)
&& !is_null($check_signature)
&& strlen($signature) > 16
&& strlen($check_signature) > 16
&& $signature === $check_signature;
}
class RegExOpt {
var $pattern;
var $options;
var $regex_delimiter;
function __construct(string $pattern, string $options = '', $regex_delimiter = '/') {
$this->pattern = $pattern;
$this->options = $options;
$this->regex_delimiter = $regex_delimiter;
}
function __toString() {
return $this->regex_delimiter
. str_replace($this->regex_delimiter, '\\'.$this->regex_delimiter, $this->pattern)
. $this->regex_delimiter
. $this->options;
}
}
enum opt_required: int {
case YES = 1;
case NO = 0;
}
function meeseeks_getopt_flag(array $argv, string|array $option, opt_required $required = opt_required::NO): bool {
is_array($option) OR $option = [$option];
foreach($argv as $index => $arg) {
if(in_array($arg, $option)) {
return true;
}
}
if($required == opt_required::YES) {
cmd_help(help_reason::OPTION_ERROR, $option);
}
return false;
}
function meeseeks_getopt_value(array $argv, string|array $option_pattern, opt_required $required = opt_required::NO, $regex_delimiter = '/'): string {
is_array($option_pattern) OR $option_pattern = [$option_pattern];
// In this loop, "arg" means an actual user-provided CLI argument
// from argv, and "option" means the program-requested to opt to
// search for.
// Check each user-provided argument to see if it was the one(s) requested
foreach($argv as $index => $arg) {
// First search to see if it is in the array of options explicitly
if(in_array($arg, $option_pattern)) {
if($index+1 < count($argv)) {
return $argv[$index+1];
} else {
goto not_found;
}
} else {
// Next, check if any of the options are patterns; and if so if
// they match this user-provided argument
foreach($option_pattern as $pattern) {
// RegExOpt instances are the clearest way to provide parameters,
// and the only way if you need to use options. We will also
// handle strings that start and end with the regex delimiter.
if($pattern instanceof RegExOpt || (substr($pattern, 0, 1) == $regex_delimiter && substr($pattern, -1, 1) == $regex_delimiter)) {
// it looks like a regex so let's try to match it
if(preg_match($pattern, $arg, $matches)) {
// No subpatterns?
if(count($matches) == 1) {
// Get next argument or return empty string
if($index+1 < count($argv)) {
return $argv[$index+1];
} else {
goto not_found;
}
} else {
// Return the match
return $matches[1];
}
}
} // if($pattern <is a regex>)
} // foreach($option_pattern as $pattern)
} // else if(in_array($arg, $option_pattern))
} // foreach($argv as $index => $arg)
not_found:
if($required == opt_required::YES) {
meeseeks_error(900, 'Option '.implode(' or ', $option_pattern).(count($option_pattern) > 1 ? ' are' : ' is').' required');
}
return '';
} // function meeseeks_getopt_value()
enum help_reason: int {
case REQUESTED = 0;
case MISSING = 1;
case INVALID = 2;
case OPTION_ERROR = 3;
}
function cmd_help(help_reason $reason = help_reason::REQUESTED, array $missing_options = []) {
echo LF;
$look_at_me = '= "I\'m Mr. Meeseeks the PHP Encryption Tool, look at me!"';
echo str_repeat('=', 80).LF;
echo '||'.$look_at_me.str_repeat(' ', 80-strlen($look_at_me)-4).'||'.LF;
echo str_repeat('=', 80).LF;
if(in_array($reason, [help_reason::INVALID, help_reason::MISSING])) {
echo LF;
echo 'Gosh I\'d love to help with your golf swing, but ';
if($reason === help_reason::INVALID) echo 'I don\'t know that commaaaaaand!'.LF;
if($reason === help_reason::MISSING) echo 'you didn\'t enter a commaaaaaand!'.LF;
}
if($reason === help_reason::OPTION_ERROR) {
echo LF;
echo (count($missing_options) > 1 ? ' Error: One of the options `' : 'The option `')
.implode('` or `', $missing_options).(count($missing_options) > 1 ? '` are' : '` is')
.' required.';
echo LF;
}
if(defined('IS_SELF_EXTRACTING_FILE_ARCHIVE')) {
echo LF;
echo '[Self Extract]'.LF;
echo 'Since this is a self extracting file you can run it by doing this:'.LF;
echo ' php ./file_name.meeseeks decrypt -k $KEY'.LF;
echo LF;
}
echo LF;
echo '[Usage]'.LF;
echo 'Generate a secure random key of 32 HEX bytes. Example, which may or may not be secure on your system:'.LF;
echo LF;
echo ' KEY=`head -c16 </dev/urandom|xxd -p -u`; echo $KEY;'.LF;
echo LF;
echo LF;
echo '[Encrypt a File]'.LF;
echo 'To encrypt a file named file_name with this key and save it to file_name.meeseeks'.LF;
echo '(overwriting that file if it exists), you would then run: '.LF;
echo ' php ./meeseeks.php encrypt $KEY meeseeks'.LF;
echo LF;
echo LF;
echo '[Decrypt a File]'.LF;
echo 'To decrypt a file named file_name.meeseeks with the same key, and save the plaintext file to'.LF;
echo 'file_name (overwriting that file if it exists), you would then run: '.LF;
echo ' php ./meeseeks.php decrypt $KEY file_name.meeseeks'.LF;
exit;
}
function cmd_encrypt(array $argv) {
$p_key = meeseeks_getopt_value($argv, ['-k', '-key'], opt_required::YES);
$p_file_in = meeseeks_getopt_value($argv, ['-f', '-in'], opt_required::YES);
$p_file_out = $p_file_in.'.meeseeks';
if(meeseeks_getopt_flag($argv, '-v')) {
echo '-- encrypt --'.LF;
echo 'Key: '.$p_key.LF;
echo 'Encrypt file: '.$p_file_in.LF;
echo 'Output file: '.$p_file_out.LF;
}
file_put_contents($p_file_out, str_replace("<?php", "<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true); ".LF
."/* Hey there, I am a self extracting archive built with meeseeks.php, look at me!".LF
." Seriously, you can see how this file was built by reading the code".LF
." below. This file requires PHP 8.1 or higher. */".LF,
file_get_contents(__FILE__))
.'#'.md5('start_of_data')
.meeseeks_encrypt($p_key, file_get_contents($p_file_in)));
}
function cmd_decrypt(array $argv) {
$p_key = meeseeks_getopt_value($argv, ['-k', '-key'], opt_required::YES);
if(defined('IS_SELF_EXTRACTING_FILE_ARCHIVE')) {
$p_file_in = __FILE__;
} else {
$p_file_in = meeseeks_getopt_value($argv, ['-f', '-in'], opt_required::YES);
}
$p_file_out = str_replace('.meeseeks', '', $p_file_in);
if(meeseeks_getopt_flag($argv, '-v')) {
echo '-- decrypt --'.LF;
echo 'Key: '.$p_key.LF;
echo 'Decrypt file: '.$p_file_in.LF;
echo 'Output file: '.$p_file_out.LF;
}
$cypher_text = file_get_contents($p_file_in);
$data_start = '#'.md5('start_of_data');
if(($data_pos = strpos($cypher_text, $data_start)) !== false) {
$data_pos += strlen($data_start);
echo 'Extracting data from file at position '.$data_pos.LF;
echo substr($cypher_text, $data_pos, 30).LF.LF;
$cypher_text = substr($cypher_text, $data_pos);
}
file_put_contents($p_file_out, meeseeks_decrypt($p_key, $cypher_text));
}
function main(int $argc, array $argv) {
meeseeks_sanitize($argv);
$p_cmd = meeseeks_getopt_value($argv, ['-c', new RegExOpt(pattern: '.+\.php'), new RegExOpt(pattern: '.+\.meeseeks')]);
if(meeseeks_getopt_flag($argv, ['-h', '-help'])) $p_cmd = 'help';
$commands = ['encrypt', 'decrypt', 'help'];
if(in_array($p_cmd, $commands)) {
$exec = 'cmd_'.$p_cmd;
$exec($argv);
} else {
if(strlen($p_cmd) > 0) {
cmd_help(help_reason::INVALID);
} else {
cmd_help(help_reason::MISSING);
}
}
}
main($argc, $argv);
exit(0);
?>
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 1
1c1,5
< <?php
---
> <?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true);
> /* Hey there, I am a self extracting archive built with meeseeks.php, look at me!
> Seriously, you can see how this file was built by reading the code
> below. This file requires PHP 8.1 or higher. */
>
505c509,517
< file_put_contents($p_file_out, str_replace("<?php", "<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true); ".LF
---
> file_put_contents($p_file_out, str_replace("<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true);
> /* Hey there, I am a self extracting archive built with meeseeks.php, look at me!
> Seriously, you can see how this file was built by reading the code
> below. This file requires PHP 8.1 or higher. */
> ", "<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true);
> /* Hey there, I am a self extracting archive built with meeseeks.php, look at me!
> Seriously, you can see how this file was built by reading the code
> below. This file requires PHP 8.1 or higher. */
> define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true); ".LF
566a579,917
> #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
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 2
> 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
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 3
> 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
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 4
> 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
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 5
> 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
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 6
> +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
2022-09-26 20:30 diff -l meeseeks.php meeseeks.php.meeseeks Page 7
> vD0aTUYZ5EUK3MHOFfc1JmtpkxDBevQwrVRyirEMjE805XzcncASLkypknba3hG1VarZfkZIGDHc
> antKJFtBkr04Y+/56d6is4cWAU5xWEtOwsZZscfoziuy0nnFmf/I3bdlTTxfcpkRA0Kk91iUn/r/
> SPfy2mOXsY/BmMW2OdyVhkh5s/xX//UoNoA1q04rhRtvY9AQwBLR2EP3hc+qHdiio6qyYus4QKUd
> LX60CKxtDbIAq8BQ6ESIepT12lC2Sf3zh7q11ettEgCMnAH66YpQmc/C3dzDBRi9XI924D7Fst0A
> r0XmtoKkc5h/rZmYCWyxwniprjdIj9QK/zv582SBkQC7VYQK/OuYT+V57rQQjuk/U95azCLmvOjv
> r8dqbx6Vhdry99hvowM7mF4UcqJAX0cnnGSHvKQuss4yQUS8wjt9fvhfSTbfg9dai8wq8l0K47tw
> +OZuvmDRWBSUyJ5cNg5tFJALbsqEy0KNL+rxk7AgdJ/gWoOVmr2h2D8ZOe7yZ5rUwgdF/F6LWF5m
> 2j/5IHTqTWGRRc7YhfvZRskqZ2ayZRz3+8vKW7UlxZXavqlVwao82LsNVsUU18aHD0wqSCf1hU1O
> FC39TdfgYp1y/oNEARM799yolBCh3n7XLfdupPliUPHXEuopms6g4dgf3zfHV3KVIO1I2wZuka8E
> P3nvpO7FS0c6zZlL7oDP8AAZzd61tUXL0zY84pKkpUfK+9klB0mVF3nVfdb7lLdmKJ3+PHyvliYe
> a+YaMqBd66Wzqe67jn9Jp+yHdOh2BpKu/hKt+sUI1RLDCFI5ZbsWzQn9j7PsFfR+OHlj9XvHzXr0
> MUAxbWmF/ovwIauD6butjqYo0lrFjHGjQLow+IB/sZk+ui0dgj+ugo0NC1uEhZuzeG46Eoa8kYZf
> nx3blMER7L0HYzBu/pWXEiCtn/tpo0trIXiliW5H/yVx9kaVoKJao1Rdcxz9nT6JZy5rHNYxafM5
> Y1H9PDKk1nxZmo+OW176hYM648KMzrKD9nvsPBxUqaW6djaMiuxerZhRKBENy54gJHVSC+SJMdyT
> bfxRFZwsdY1OS4LWnR/V6wKJdZvmTThTaaHqCTmPdOaAYP4gzBEJbhO81UZiYxTCVwLeZLfr91B/
> YqnnnyDgbcWqnGd5ybjVbSwd9K2q7X6GyiaEmrZRHJtXanKOtHzMbosalfdnBTIe4ga8NU5IFu30
> KZm4EkbbaZYKHhyke+21jNRpkotCBsAxUrD2jVeiakMjkc+wz7yn+AgB8tzVY2QtlRLJhaLq2EGp
> o6HBzng2cH8ohrhtGr1L/VZCWkncNjOFczfXkuDAhCm6AiipdX+x/JRadQW16EtF6XplDkvhdcmD
> 9QGyMAWerMNUKj5rz+HcTiUwIhKcGZSTfyjU5RvDz7eDc15IkbzgrjFPVUVWLNalSVP9bpU+fGwV
> NzekJA1XwqgRNON8PqF9MgZFShhIHB6Ab4GGZ3jiKYly52TqU/kUBmpPWFWu7Akeo9NXR0JMOThp
> Lp0phO7/9/2/jmF96pVQh6wXmU12+SjReRqgvrLJFYD0XcGpEIlcyxinbO7PPp0m3PeClesecbdP
> j1H50qNdbHN6MT/T5AEN4/CMFdeI9GBou1EBkIUPj/6gb+7vy9HD8K5rTU5RB+Dj/f+diJtZ5lFJ
> h3LzEkck5ibvwRn7e0l0MFgYn9JuXELFAg9fv5gAkO1VCOgnOMCdoID3EZKoa5SgOI2zyBvToJHi
> HX0=
<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true);
/* Hey there, I am a self extracting archive built with meeseeks.php, look at me!
Seriously, you can see how this file was built by reading the code
below. This file requires PHP 8.1 or higher. */
// I'm Mr. Meeseeks the PHP Encryption Tool, look at me!
//
// Cobbled together with great trepidation by Blueapples.
//
// Visit me at Blueapples.org
//
// Version 1.0, 2022-09-26.
define('LF', "\n");
function meeseeks_error(int $code, string|array|object $message = 'Unknown error') {
echo str_repeat('!', 80).LF;
if(is_array($message) || is_object($message)) $message = json_encode($message);
echo 'MEESEEKS ERROR #'.$code.': '.$message.LF.LF;
exit;
}
function meeseeks_sanitize(array &$data) {
foreach($data as $k => $v) {
if(strpos(strtolower($k), 'email') !== FALSE) {
$v = filter_var($v, FILTER_SANITIZE_EMAIL);
}
$v = str_replace(LF, '|EOL|', $v);
$v = strip_tags($v);
$v = filter_var($v, FILTER_SANITIZE_SPECIAL_CHARS, FILTER_FLAG_STRIP_LOW|FILTER_FLAG_STRIP_HIGH);
$data[$k] = $v;
}
}
function meeseeks_implode($data) {
if(!is_array($data) && !is_object($data)) {
exit(meeseeks_error(600, 'Cannot implode non-array/non-object value:'.$data));
}
$type = is_object($data) ? 'OBJ' : 'ARR';
$data = (array)$data;
ksort($data);
$result = 'MEESEEKS<0>';
$result .= $type.'<0>';
$result .= implode('<1>', array_keys($data)).'<0>';
$result .= implode('<1>', $data).'<0>';
$result .= md5($result).'<0>';
return $result;
}
function meeseeks_explode($str) {
$data = explode('<0>', $str);
$sig = $data[0];
$type = $data[1];
$keys = $data[2];
$vals = $data[3];
$hash = $data[4];
if($sig !== 'MEESEEKS') {
exit(meeseeks_error(700, ['err' => 'Invalid MV signature (should be MEESEEKS)', 'str' => $str]));
}
$keys = explode('<1>', $keys);
$vals = explode('<1>', $vals);
if(count($keys) !== count($vals)) {
exit(meeseeks_error(701, ['err' => 'Parallel arrays differ in length', 'str' => $str]));
}
$result = array_combine($keys, $vals);
switch($type) {
case 'ARR':
break;
case 'OBJ':
$result = (object)$result;
break;
default:
exit(meeseeks_error(702, ['err' => 'Invalid type', 'str' => $str]));
}
return $result;
}
class UnsafeCrypto
{
const METHOD = 'aes-256-ctr';
/**
* Encrypts (but does not authenticate) a message
*
* @param string $message - plaintext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encode - set to TRUE to return a base64-encoded
* @return string (raw binary)
*/
public static function encrypt($message, $key, $encode = false)
{
$nonceSize = openssl_cipher_iv_length(self::METHOD);
$nonce = openssl_random_pseudo_bytes($nonceSize);
$ciphertext = openssl_encrypt(
$message,
self::METHOD,
$key,
OPENSSL_RAW_DATA,
$nonce
);
// Now let's pack the IV and the ciphertext together
// Naively, we can just concatenate
if ($encode) {
return base64_encode($nonce.$ciphertext);
}
return $nonce.$ciphertext;
}
/**
* Decrypts (but does not verify) a message
*
* @param string $message - ciphertext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encoded - are we expecting an encoded string?
* @return string
*/
public static function decrypt($message, $key, $encoded = false)
{
if ($encoded) {
$message = base64_decode($message, true);
if ($message === false) {
throw new Exception('Encryption failure');
}
}
$nonceSize = openssl_cipher_iv_length(self::METHOD);
$nonce = mb_substr($message, 0, $nonceSize, '8bit');
$ciphertext = mb_substr($message, $nonceSize, null, '8bit');
$plaintext = openssl_decrypt(
$ciphertext,
self::METHOD,
$key,
OPENSSL_RAW_DATA,
$nonce
);
return $plaintext;
}
}
class SaferCrypto extends UnsafeCrypto
{
const HASH_ALGO = 'sha256';
/**
* Encrypts then MACs a message
*
* @param string $message - plaintext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encode - set to TRUE to return a base64-encoded string
* @return string (raw binary)
*/
public static function encrypt($message, $key, $encode = false)
{
list($encKey, $authKey) = self::splitKeys($key);
// Pass to UnsafeCrypto::encrypt
$ciphertext = parent::encrypt($message, $encKey);
// Calculate a MAC of the IV and ciphertext
$mac = hash_hmac(self::HASH_ALGO, $ciphertext, $authKey, true);
if ($encode) {
return base64_encode($mac.$ciphertext);
}
// Prepend MAC to the ciphertext and return to caller
return $mac.$ciphertext;
}
/**
* Decrypts a message (after verifying integrity)
*
* @param string $message - ciphertext message
* @param string $key - encryption key (raw binary expected)
* @param boolean $encoded - are we expecting an encoded string?
* @return string (raw binary)
*/
public static function decrypt($message, $key, $encoded = false)
{
list($encKey, $authKey) = self::splitKeys($key);
if ($encoded) {
$message = base64_decode($message, true);
if ($message === false) {
throw new Exception('Encryption failure');
}
}
// Hash Size -- in case HASH_ALGO is changed
$hs = mb_strlen(hash(self::HASH_ALGO, '', true), '8bit');
$mac = mb_substr($message, 0, $hs, '8bit');
$ciphertext = mb_substr($message, $hs, null, '8bit');
$calculated = hash_hmac(
self::HASH_ALGO,
$ciphertext,
$authKey,
true
);
if (!self::hashEquals($mac, $calculated)) {
throw new Exception('Encryption failure');
}
// Pass to UnsafeCrypto::decrypt
$plaintext = parent::decrypt($ciphertext, $encKey);
return $plaintext;
}
/**
* Splits a key into two separate keys; one for encryption
* and the other for authenticaiton
*
* @param string $masterKey (raw binary)
* @return array (two raw binary strings)
*/
protected static function splitKeys($masterKey)
{
// You really want to implement HKDF here instead!
return [
hash_hmac(self::HASH_ALGO, 'ENCRYPTION', $masterKey, true),
hash_hmac(self::HASH_ALGO, 'AUTHENTICATION', $masterKey, true)
];
}
/**
* Compare two strings without leaking timing information
*
* @param string $a
* @param string $b
* @ref https://paragonie.com/b/WS1DLx6BnpsdaVQW
* @return boolean
*/
protected static function hashEquals($a, $b)
{
if (function_exists('hash_equals')) {
return hash_equals($a, $b);
}
$nonce = openssl_random_pseudo_bytes(32);
return hash_hmac(self::HASH_ALGO, $a, $nonce) === hash_hmac(self::HASH_ALGO, $b, $nonce);
}
}
function meeseeks_encrypt(string $key, string|array|object $data) {
if(strlen($key) < 32) {
echo$key.LF;
exit(meeseeks_error(604, 'Encrypt key is not long enough: '.strlen($key)));
}
if(is_object($data) || is_array($data)) {
$data = json_encode($data);
}
return chunk_split(base64_encode(SaferCrypto::encrypt($data, $key)), separator: LF);
}
function meeseeks_decrypt(string $key, string $data, string|array|object $default=NULL, bool $throwException=FALSE): string|array|object {
if(strlen($key) < 32) {
exit(meeseeks_error(604, 'Decrypt key is not long enough: '.strlen($key)));
}
try {
$data = SaferCrypto::decrypt(base64_decode($data), $key);
if(substr($data, 0, 1) == '{'
||substr($data, 0, 1) == '[') {
$data = json_decode($data);
}
} catch(Exception $e) {
if($throwException) {
throw $e;
}
return $default;
}
return $data;
}
function meeseeks_signdata(string $sig_key, string|array|object &$data): string|array|object {
if(is_object($data) || is_array($data)) {
// turn array or object into string
$signature = meeseeks_implode($data);
}
// hash the string
$signature = md5($signature);
//echo 'Outgoing hash: '.$signature.LF;
// encrypt the hash
$signature = meeseeks_encrypt($signature, $sig_key);
//echo 'Outgoing encrypted hash: '.$signature.LF;
if(strlen(meeseeks_decrypt($signature, $sig_key)) !== 32) {
exit(meeseeks_error(601, 'Generated signature is invalid length'));
}
// make signature easier to read
$signature = trim(str_replace('=', '', chunk_split($signature, 8, ' ')));
//echo 'Outgoing encrypted hash: '.$signature;
// add signature to incoming data
if(is_object($data)) {
$data->signature = $signature;
} elseif(is_array($data)) {
$data['signature'] = $signature;
} else {
$data .= '<0>'.$signature;
}
return $signature;
}
function meeseeks_signcheck(string $sig_key, string|array|object $data): bool {
// get signature from the data
// we also need to unset it from our
// copy so we can recalculate the correct
// hash
$data = clone $data;
if(is_array($data)) {
$signature = $data['signature'];
unset($data['signature']);
} elseif(is_object($data)) {
$signature = $data->signature;
unset($data->signature);
} else {
$data = explode('<0>', $data);
$signature = array_pop($data);
$data = implode('<0>', $data);
}
// turn array or object into string
if(is_object($data) || is_array($object)) {
$data = meeseeks_implode($data);
}
// hash the string
$check_signature = md5($data);
//echo 'Incoming encrypted hash: '.$signature;
// decrypt the incoming hash
$signature = meeseeks_decrypt($signature, $sig_key);
//echo 'Incoming hash: '.$signature.LF;
//echo 'Check hash : '.$check_signature.LF;
return !is_null($signature)
&& !is_null($check_signature)
&& strlen($signature) > 16
&& strlen($check_signature) > 16
&& $signature === $check_signature;
}
class RegExOpt {
var $pattern;
var $options;
var $regex_delimiter;
function __construct(string $pattern, string $options = '', $regex_delimiter = '/') {
$this->pattern = $pattern;
$this->options = $options;
$this->regex_delimiter = $regex_delimiter;
}
function __toString() {
return $this->regex_delimiter
. str_replace($this->regex_delimiter, '\\'.$this->regex_delimiter, $this->pattern)
. $this->regex_delimiter
. $this->options;
}
}
enum opt_required: int {
case YES = 1;
case NO = 0;
}
function meeseeks_getopt_flag(array $argv, string|array $option, opt_required $required = opt_required::NO): bool {
is_array($option) OR $option = [$option];
foreach($argv as $index => $arg) {
if(in_array($arg, $option)) {
return true;
}
}
if($required == opt_required::YES) {
cmd_help(help_reason::OPTION_ERROR, $option);
}
return false;
}
function meeseeks_getopt_value(array $argv, string|array $option_pattern, opt_required $required = opt_required::NO, $regex_delimiter = '/'): string {
is_array($option_pattern) OR $option_pattern = [$option_pattern];
// In this loop, "arg" means an actual user-provided CLI argument
// from argv, and "option" means the program-requested to opt to
// search for.
// Check each user-provided argument to see if it was the one(s) requested
foreach($argv as $index => $arg) {
// First search to see if it is in the array of options explicitly
if(in_array($arg, $option_pattern)) {
if($index+1 < count($argv)) {
return $argv[$index+1];
} else {
goto not_found;
}
} else {
// Next, check if any of the options are patterns; and if so if
// they match this user-provided argument
foreach($option_pattern as $pattern) {
// RegExOpt instances are the clearest way to provide parameters,
// and the only way if you need to use options. We will also
// handle strings that start and end with the regex delimiter.
if($pattern instanceof RegExOpt || (substr($pattern, 0, 1) == $regex_delimiter && substr($pattern, -1, 1) == $regex_delimiter)) {
// it looks like a regex so let's try to match it
if(preg_match($pattern, $arg, $matches)) {
// No subpatterns?
if(count($matches) == 1) {
// Get next argument or return empty string
if($index+1 < count($argv)) {
return $argv[$index+1];
} else {
goto not_found;
}
} else {
// Return the match
return $matches[1];
}
}
} // if($pattern <is a regex>)
} // foreach($option_pattern as $pattern)
} // else if(in_array($arg, $option_pattern))
} // foreach($argv as $index => $arg)
not_found:
if($required == opt_required::YES) {
meeseeks_error(900, 'Option '.implode(' or ', $option_pattern).(count($option_pattern) > 1 ? ' are' : ' is').' required');
}
return '';
} // function meeseeks_getopt_value()
enum help_reason: int {
case REQUESTED = 0;
case MISSING = 1;
case INVALID = 2;
case OPTION_ERROR = 3;
}
function cmd_help(help_reason $reason = help_reason::REQUESTED, array $missing_options = []) {
echo LF;
$look_at_me = '= "I\'m Mr. Meeseeks the PHP Encryption Tool, look at me!"';
echo str_repeat('=', 80).LF;
echo '||'.$look_at_me.str_repeat(' ', 80-strlen($look_at_me)-4).'||'.LF;
echo str_repeat('=', 80).LF;
if(in_array($reason, [help_reason::INVALID, help_reason::MISSING])) {
echo LF;
echo 'Gosh I\'d love to help with your golf swing, but ';
if($reason === help_reason::INVALID) echo 'I don\'t know that commaaaaaand!'.LF;
if($reason === help_reason::MISSING) echo 'you didn\'t enter a commaaaaaand!'.LF;
}
if($reason === help_reason::OPTION_ERROR) {
echo LF;
echo (count($missing_options) > 1 ? ' Error: One of the options `' : 'The option `')
.implode('` or `', $missing_options).(count($missing_options) > 1 ? '` are' : '` is')
.' required.';
echo LF;
}
if(defined('IS_SELF_EXTRACTING_FILE_ARCHIVE')) {
echo LF;
echo '[Self Extract]'.LF;
echo 'Since this is a self extracting file you can run it by doing this:'.LF;
echo ' php ./file_name.meeseeks decrypt -k $KEY'.LF;
echo LF;
}
echo LF;
echo '[Usage]'.LF;
echo 'Generate a secure random key of 32 HEX bytes. Example, which may or may not be secure on your system:'.LF;
echo LF;
echo ' KEY=`head -c16 </dev/urandom|xxd -p -u`; echo $KEY;'.LF;
echo LF;
echo LF;
echo '[Encrypt a File]'.LF;
echo 'To encrypt a file named file_name with this key and save it to file_name.meeseeks'.LF;
echo '(overwriting that file if it exists), you would then run: '.LF;
echo ' php ./meeseeks.php encrypt $KEY meeseeks'.LF;
echo LF;
echo LF;
echo '[Decrypt a File]'.LF;
echo 'To decrypt a file named file_name.meeseeks with the same key, and save the plaintext file to'.LF;
echo 'file_name (overwriting that file if it exists), you would then run: '.LF;
echo ' php ./meeseeks.php decrypt $KEY file_name.meeseeks'.LF;
exit;
}
function cmd_encrypt(array $argv) {
$p_key = meeseeks_getopt_value($argv, ['-k', '-key'], opt_required::YES);
$p_file_in = meeseeks_getopt_value($argv, ['-f', '-in'], opt_required::YES);
$p_file_out = $p_file_in.'.meeseeks';
if(meeseeks_getopt_flag($argv, '-v')) {
echo '-- encrypt --'.LF;
echo 'Key: '.$p_key.LF;
echo 'Encrypt file: '.$p_file_in.LF;
echo 'Output file: '.$p_file_out.LF;
}
file_put_contents($p_file_out, str_replace("<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true);
/* Hey there, I am a self extracting archive built with meeseeks.php, look at me!
Seriously, you can see how this file was built by reading the code
below. This file requires PHP 8.1 or higher. */
", "<?php define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true);
/* Hey there, I am a self extracting archive built with meeseeks.php, look at me!
Seriously, you can see how this file was built by reading the code
below. This file requires PHP 8.1 or higher. */
define('IS_SELF_EXTRACTING_FILE_ARCHIVE', true); ".LF
."/* Hey there, I am a self extracting archive built with meeseeks.php, look at me!".LF
." Seriously, you can see how this file was built by reading the code".LF
." below. This file requires PHP 8.1 or higher. */".LF,
file_get_contents(__FILE__))
.'#'.md5('start_of_data')
.meeseeks_encrypt($p_key, file_get_contents($p_file_in)));
}
function cmd_decrypt(array $argv) {
$p_key = meeseeks_getopt_value($argv, ['-k', '-key'], opt_required::YES);
if(defined('IS_SELF_EXTRACTING_FILE_ARCHIVE')) {
$p_file_in = __FILE__;
} else {
$p_file_in = meeseeks_getopt_value($argv, ['-f', '-in'], opt_required::YES);
}
$p_file_out = str_replace('.meeseeks', '', $p_file_in);
if(meeseeks_getopt_flag($argv, '-v')) {
echo '-- decrypt --'.LF;
echo 'Key: '.$p_key.LF;
echo 'Decrypt file: '.$p_file_in.LF;
echo 'Output file: '.$p_file_out.LF;
}
$cypher_text = file_get_contents($p_file_in);
$data_start = '#'.md5('start_of_data');
if(($data_pos = strpos($cypher_text, $data_start)) !== false) {
$data_pos += strlen($data_start);
echo 'Extracting data from file at position '.$data_pos.LF;
echo substr($cypher_text, $data_pos, 30).LF.LF;
$cypher_text = substr($cypher_text, $data_pos);
}
file_put_contents($p_file_out, meeseeks_decrypt($p_key, $cypher_text));
}
function main(int $argc, array $argv) {
meeseeks_sanitize($argv);
$p_cmd = meeseeks_getopt_value($argv, ['-c', new RegExOpt(pattern: '.+\.php'), new RegExOpt(pattern: '.+\.meeseeks')]);
if(meeseeks_getopt_flag($argv, ['-h', '-help'])) $p_cmd = 'help';
$commands = ['encrypt', 'decrypt', 'help'];
if(in_array($p_cmd, $commands)) {
$exec = 'cmd_'.$p_cmd;
$exec($argv);
} else {
if(strlen($p_cmd) > 0) {
cmd_help(help_reason::INVALID);
} else {
cmd_help(help_reason::MISSING);
}
}
}
main($argc, $argv);
exit(0);
?>
#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
HX0=
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment