release encoder and decoder
This commit is contained in:
parent
d213f8346b
commit
16eb41e6c3
3 changed files with 251 additions and 0 deletions
|
@ -1,2 +1,9 @@
|
||||||
# jjcrypto
|
# jjcrypto
|
||||||
jjcrypto for php
|
jjcrypto for php
|
||||||
|
|
||||||
|
## HOW USE
|
||||||
|
### encoding
|
||||||
|
```php encode.php /path/to/file.js```
|
||||||
|
|
||||||
|
### decoding
|
||||||
|
```php decode.php /path/to/encoded/file.js.jj```
|
79
decode.php
Normal file
79
decode.php
Normal file
|
@ -0,0 +1,79 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
// Decoder wrapper
|
||||||
|
$start = '$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+';
|
||||||
|
$end = '+"\"")())();';
|
||||||
|
|
||||||
|
|
||||||
|
if (!isset($argv[1])) {
|
||||||
|
die("Decoder required encoded file");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read file
|
||||||
|
$r = file_get_contents($argv[1]);
|
||||||
|
|
||||||
|
// Replace decoder wrapper
|
||||||
|
$r = str_replace($start, "", $r);
|
||||||
|
$r = str_replace($end, "", $r);
|
||||||
|
|
||||||
|
// Template decoder
|
||||||
|
// from largest char length to smallest
|
||||||
|
$subst = array(
|
||||||
|
array('$.$___','8'),
|
||||||
|
array('$.$__$','9'),
|
||||||
|
array('$.$_$_','a'),
|
||||||
|
array('$.$_$$','b'),
|
||||||
|
array('$.$$__','c'),
|
||||||
|
array('$.$$_$','d'),
|
||||||
|
array('$.$$$$','f'),
|
||||||
|
array('$.$$$_','e'),
|
||||||
|
array('$.___','0'),
|
||||||
|
array('$.__$','1'),
|
||||||
|
array('$._$_','2'),
|
||||||
|
array('$._$$','3'),
|
||||||
|
array('$.$__','4'),
|
||||||
|
array('$.$_$','5'),
|
||||||
|
array('$.$$_','6'),
|
||||||
|
array('$.$$$','7'),
|
||||||
|
array('$.$_', 'c'),
|
||||||
|
array('$._$', 'o'),
|
||||||
|
array('$.$$', 'n'),
|
||||||
|
array('$.__', 't'),
|
||||||
|
array('$.$', 'r'),
|
||||||
|
array('$._', 'u'),
|
||||||
|
array('"\\\\"' , '\\'),
|
||||||
|
array('"+"', '%%%%'), // tmp
|
||||||
|
array('+', ""),
|
||||||
|
array('%%%%', "+")
|
||||||
|
);
|
||||||
|
|
||||||
|
// replace by template
|
||||||
|
foreach ($subst as $s) {
|
||||||
|
$r = str_replace($s[0], $s[1], $r);
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "$r\n";
|
||||||
|
|
||||||
|
// replace my quotes
|
||||||
|
$r = preg_replace('/([^\\\\])"([^"]+)"/', '${1}${2}', $r);
|
||||||
|
|
||||||
|
// ASCII decode
|
||||||
|
preg_match_all('/\\\\(\d{3})/', $r, $matches);
|
||||||
|
for ($i = 0; $i < count($matches[1]); $i++) {
|
||||||
|
// convert octal to decimal
|
||||||
|
$octal = base_convert($matches[1][$i], 8, 10);
|
||||||
|
// get character and replace
|
||||||
|
$r = str_replace($matches[0][$i], chr($octal), $r);
|
||||||
|
}
|
||||||
|
|
||||||
|
// UTF-8 decode
|
||||||
|
preg_match_all('/(\\\\u\w{4})/', $r, $matches);
|
||||||
|
for ($i = 0; $i < count($matches[1]); $i++) {
|
||||||
|
// get character and replace
|
||||||
|
$r = str_replace($matches[0][$i], json_decode('"'.$matches[1][$i].'"'), $r);
|
||||||
|
}
|
||||||
|
|
||||||
|
// show decoded code
|
||||||
|
echo $r;
|
||||||
|
// if need save file
|
||||||
|
// file_put_contents(substr($argv[1], 0, -3), $r);
|
165
encode.php
Normal file
165
encode.php
Normal file
|
@ -0,0 +1,165 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
if (!isset($argv[1])) {
|
||||||
|
die("Script required url to file");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// support method for generate template
|
||||||
|
function getCharKey($i, $maxPow) {
|
||||||
|
$resultKey = "";
|
||||||
|
for ($j = $maxPow; $j >= 0; $j--) {
|
||||||
|
// i love bitmasks
|
||||||
|
$resultKey .= $i & pow(2, $j) ? "$" : "_";
|
||||||
|
}
|
||||||
|
return $resultKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check utf-8 character
|
||||||
|
function isUtf8($char) {
|
||||||
|
return mb_detect_encoding($char) == "UTF-8";
|
||||||
|
}
|
||||||
|
|
||||||
|
// str_split bad working for utf-8...
|
||||||
|
// it's best alternative
|
||||||
|
function mbStringToArray($string) {
|
||||||
|
$strlen = mb_strlen($string);
|
||||||
|
while ($strlen) {
|
||||||
|
$array[] = mb_substr($string, 0, 1, "UTF-8");
|
||||||
|
$string = mb_substr($string, 1, $strlen, "UTF-8");
|
||||||
|
$strlen = mb_strlen($string);
|
||||||
|
}
|
||||||
|
return $array;
|
||||||
|
}
|
||||||
|
|
||||||
|
// encode char
|
||||||
|
function encodeChar($char) {
|
||||||
|
// get template
|
||||||
|
global $substr;
|
||||||
|
|
||||||
|
// write prefix for char code
|
||||||
|
$result = '"\\\\"';
|
||||||
|
|
||||||
|
// if character is utf-8
|
||||||
|
if (isUtf8($char)) {
|
||||||
|
// get utf-8 code without quotes and slash
|
||||||
|
$code = substr(json_encode($char), 2, -1);
|
||||||
|
} else {
|
||||||
|
// convert decimal to octal
|
||||||
|
$code = base_convert(ord($char), 10, 8);
|
||||||
|
// fix code if digist < 3
|
||||||
|
$code = str_pad($code, 3, 0, STR_PAD_LEFT) . '';
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert string to array
|
||||||
|
$digits = str_split($code);
|
||||||
|
for ($i = 0; $i < count($digits); $i++) {
|
||||||
|
// encode code
|
||||||
|
$result .= '+$.' . array_search($digits[$i], $substr);
|
||||||
|
}
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
// its characters need as it
|
||||||
|
$ignoreChars = '!"#$%&()*+,-./:;<>=?@[]^_`{|}~\'';
|
||||||
|
|
||||||
|
// some characters for decoding
|
||||||
|
$substr = array(
|
||||||
|
'$_$_' => 'a',
|
||||||
|
'$_$$' => 'b',
|
||||||
|
'$$__' => 'c',
|
||||||
|
'$$_$' => 'd',
|
||||||
|
'$$$_' => 'e',
|
||||||
|
'$$$$' => 'f',
|
||||||
|
'_' => 'u',
|
||||||
|
);
|
||||||
|
|
||||||
|
// add to template digits
|
||||||
|
$i = -1;
|
||||||
|
while (++$i < 10) {
|
||||||
|
$key = getCharKey($i, $i <= 7 ? 2 : 3);
|
||||||
|
$substr[$key] = $i;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* START ENCODING!
|
||||||
|
*/
|
||||||
|
$scriptText = file_get_contents($argv[1]);
|
||||||
|
if (!$scriptText) {
|
||||||
|
die("File not found\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// support variable for ignored charaters
|
||||||
|
$prevIgnored = false;
|
||||||
|
// for encoded text (result)
|
||||||
|
$encodedScript = "";
|
||||||
|
// split text
|
||||||
|
$chars = mbStringToArray($scriptText, 0, 1, "UTF-8");
|
||||||
|
// var_dump($chars);
|
||||||
|
|
||||||
|
// encoded each character
|
||||||
|
for ($i = 0; $i < count($chars); $i++) {
|
||||||
|
// get character
|
||||||
|
$ch = $chars[$i];
|
||||||
|
|
||||||
|
// if character is ignored
|
||||||
|
if (strpos($ignoreChars, $ch) != false) {
|
||||||
|
// if not first character
|
||||||
|
// and prev element not ignored
|
||||||
|
if ($i && !$prevIgnored) {
|
||||||
|
// open quotes
|
||||||
|
$encodedScript .= '+"';
|
||||||
|
}
|
||||||
|
|
||||||
|
// if character is quotes
|
||||||
|
if ($ch == '"') {
|
||||||
|
// need mirrors
|
||||||
|
$encodedScript .= "\\\\\\";
|
||||||
|
}
|
||||||
|
|
||||||
|
// else rewrite character
|
||||||
|
$encodedScript .= $ch;
|
||||||
|
// mark as ignored
|
||||||
|
$prevIgnored = true;
|
||||||
|
// get next character
|
||||||
|
continue;
|
||||||
|
} else if ($prevIgnored) {
|
||||||
|
// close quotes if character not ignored
|
||||||
|
// and if prev character is ignored
|
||||||
|
$encodedScript .= '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
// add plus
|
||||||
|
if ($i) {
|
||||||
|
$encodedScript .= '+';
|
||||||
|
}
|
||||||
|
|
||||||
|
// search encoded character in template
|
||||||
|
$ech = array_search($ch, $substr);
|
||||||
|
|
||||||
|
// bug... if array_search is false then return "___"
|
||||||
|
if ($ech == "___" ? $ch == '0' : $ech != false) {
|
||||||
|
// add $. for decoder
|
||||||
|
$encodedScript .= '$.'.$ech;
|
||||||
|
} else {
|
||||||
|
// encode charater ASCII \xxx or UTF-8 \uxxxx
|
||||||
|
$encodedScript .= encodeChar($ch);
|
||||||
|
}
|
||||||
|
|
||||||
|
$prevIgnored = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($prevIgnored) {
|
||||||
|
$encodedScript .= '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
// Decode wrapper
|
||||||
|
$start = '$=~[];$={___:++$,$$$$:(![]+"")[$],__$:++$,$_$_:(![]+"")[$],_$_:++$,$_$$:({}+"")[$],$$_$:($[$]+"")[$],_$$:++$,$$$_:(!""+"")[$],$__:++$,$_$:++$,$$__:({}+"")[$],$$_:++$,$$$:++$,$___:++$,$__$:++$};$.$_=($.$_=$+"")[$.$_$]+($._$=$.$_[$.__$])+($.$$=($.$+"")[$.__$])+((!$)+"")[$._$$]+($.__=$.$_[$.$$_])+($.$=(!""+"")[$.__$])+($._=(!""+"")[$._$_])+$.$_[$.$_$]+$.__+$._$+$.$;$.$$=$.$+(!""+"")[$._$$]+$.__+$._+$.$+$.$$;$.$=($.___)[$.$_][$.$_];$.$($.$($.$$+"\""+';
|
||||||
|
$end = '+"\"")())();';
|
||||||
|
|
||||||
|
// wrap encoded script
|
||||||
|
$encodedScript = $start.$encodedScript.$end;
|
||||||
|
|
||||||
|
// write to file with ext .jj
|
||||||
|
file_put_contents($argv[1].'.jj', $encodedScript);
|
Reference in a new issue