Skip to content

Instantly share code, notes, and snippets.

@ammarfaizi2
Created June 11, 2018 14:46
Show Gist options
  • Save ammarfaizi2/cbba9b6f48a3ceee2175952ccd486fb6 to your computer and use it in GitHub Desktop.
Save ammarfaizi2/cbba9b6f48a3ceee2175952ccd486fb6 to your computer and use it in GitHub Desktop.
<?php
/**
* @param int $n
* @return string
*/
function saltGenerator($n = 5)
{
$s = range(chr(1), chr(255));
$r = ""; $c=count($s)-1;
for($i=0;$i<$n;$i++) {
$r.= $s[rand(0, $c)];
}
return $r;
}
/**
* @param string $string
* @param string $key
* @param bool $binarySafe
* @return string
*/
function teaEncrypt($string, $key, $binarySafe = true)
{
$slen = strlen($string);
$klen = strlen($key);
$r = $newKey = "";
$salt = saltGenerator();
$cost = 1;
for($i=$j=0;$i<$klen;$i++) {
$newKey .= chr(ord($key[$i]) ^ ord($salt[$j++]));
if ($j === 5) {
$j = 0;
}
}
for($i=$j=$k=0;$i<$slen;$i++) {
$r .= chr(
ord($string[$i]) ^ ord($newKey[$j++]) ^ ord($salt[$k++]) ^ ($i << $j) ^ ($k >> $j) ^
($slen % $cost) ^ ($cost >> $j) ^ ($cost >> $i) ^ ($cost >> $k) ^
($cost ^ ($slen % ($i + $j + $k + 1))) ^ (($cost << $i) % 2) ^ (($cost << $j) % 2) ^
(($cost << $k) % 2) ^ (($cost * ($i+$j+$k)) % 3)
);
$cost++;
if ($j === $klen) {
$j = 0;
}
if ($k === 5) {
$k = 0;
}
}
$r .= $salt;
if ($binarySafe) {
return strrev(base64_encode($r));
} else {
return $r;
}
}
/**
* @param string $string
* @param string $key
* @param bool $binarySafe
* @return string
*/
function teaDecrypt($string, $key, $binarySafe = true)
{
if ($binarySafe) {
$string = base64_decode(strrev($string));
}
$slen = strlen($string);
$salt = substr($string, $slen - 5);
$string = substr($string, 0, ($slen = $slen - 5));
$klen = strlen($key);
$newKey = $r = "";
$cost = 1;
for($i=$j=0;$i<$klen;$i++) {
$newKey .= chr(ord($key[$i]) ^ ord($salt[$j++]));
if ($j === 5) {
$j = 0;
}
}
for($i=$j=$k=0;$i<$slen;$i++) {
$r .= chr(
ord($string[$i]) ^ ord($newKey[$j++]) ^ ord($salt[$k++]) ^ ($i << $j) ^ ($k >> $j) ^
($slen % $cost) ^ ($cost >> $j) ^ ($cost >> $i) ^ ($cost >> $k) ^
($cost ^ ($slen % ($i + $j + $k + 1))) ^ (($cost << $i) % 2) ^ (($cost << $j) % 2) ^
(($cost << $k) % 2) ^ (($cost * ($i+$j+$k)) % 3)
);
$cost++;
if ($j === $klen) {
$j = 0;
}
if ($k === 5) {
$k = 0;
}
}
return $r;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment