Revision: 36874
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at November 29, 2010 09:27 by whatshakin
Initial Code
class Hash{
var $scramble1;
var $scramble2;
var $errors;
var $adj;
var $mod;
function Hash(){
$this->errors = array();
$this->scramble1 = '! #$%&()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~';
$this->scramble2 = 'f^jAE]okIOzU[2&q1{3`h5w_794p@6s8?BgP>dFV=m D<TcS%Ze|r:lGK/uCy.Jx)HiQ!#$~(;Lt-R}Ma,NvW+Ynb*0X';
if (strlen($this->scramble1) <> strlen($this->scramble2)) {
trigger_error('** SCRAMBLE1 is not same length as SCRAMBLE2 **', E_USER_ERROR);
}
$this->adj = 1.75;
$this->mod = 3;
}
function decrypt ($key, $source){
$this->errors = array();
$fudgefactor = $this->_convertKey($key);
if ($this->errors) return;
if (empty($source)) {
$this->errors[] = 'No value has been supplied for decryption';
return;
}
$target = null;
$factor2 = 0;
for ($i = 0; $i < strlen($source); $i++) {
if (function_exists('mb_substr')) {
$char2 = mb_substr($source, $i, 1);
} else {
$char2 = substr($source, $i, 1);
}
$num2 = strpos($this->scramble2, $char2);
if ($num2 === false) {
$this->errors[] = "Source string contains an invalid character ($char2)";
return;
}
$adj = $this->_applyFudgeFactor($fudgefactor);
$factor1 = $factor2 + $adj; // accumulate in $factor1
$num1 = $num2 - round($factor1); // generate offset for $scramble1
$num1 = $this->_checkRange($num1); // check range
$factor2 = $factor1 + $num2; // accumulate in $factor2
if (function_exists('mb_substr')) {
$char1 = mb_substr($this->scramble1, $num1, 1);
} else {
$char1 = substr($this->scramble1, $num1, 1);
}
$target .= $char1;
//echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2<br />\n";
}
return rtrim($target);
}
function encrypt ($key, $source, $sourcelen = 0){
$this->errors = array();
$fudgefactor = $this->_convertKey($key);
if ($this->errors) return;
if (empty($source)) {
$this->errors[] = 'No value has been supplied for encryption';
return;
}
$source = str_pad($source, $sourcelen);
$target = null;
$factor2 = 0;
for ($i = 0; $i < strlen($source); $i++) {
if (function_exists('mb_substr')) {
$char1 = mb_substr($source, $i, 1);
} else {
$char1 = substr($source, $i, 1);
}
$num1 = strpos($this->scramble1, $char1);
if ($num1 === false) {
$this->errors[] = "Source string contains an invalid character ($char1)";
return;
}
$adj = $this->_applyFudgeFactor($fudgefactor);
$factor1 = $factor2 + $adj; // accumulate in $factor1
$num2 = round($factor1) + $num1; // generate offset for $scramble2
$num2 = $this->_checkRange($num2); // check range
$factor2 = $factor1 + $num2; // accumulate in $factor2
if (function_exists('mb_substr')) {
$char2 = mb_substr($this->scramble2, $num2, 1);
} else {
$char2 = substr($this->scramble2, $num2, 1);
}
$target .= $char2;
//echo "char1=$char1, num1=$num1, adj= $adj, factor1= $factor1, num2=$num2, char2=$char2, factor2= $factor2<br />\n";
}
return $target;
}
function getAdjustment (){
return $this->adj;
}
function getModulus (){
return $this->mod;
}
function setAdjustment ($adj){
$this->adj = (float)$adj;
}
function setModulus ($mod){
$this->mod = (int)abs($mod); // must be a positive whole number
}
function _applyFudgeFactor (&$fudgefactor){
$fudge = array_shift($fudgefactor); // extract 1st number from array
$fudge = $fudge + $this->adj; // add in adjustment value
$fudgefactor[] = $fudge; // put it back at end of array
if (!empty($this->mod)) { // if modifier has been supplied
if ($fudge % $this->mod == 0) { // if it is divisible by modifier
$fudge = $fudge * -1; // make it negative
}
}
return $fudge;
}
function _checkRange ($num) {
$num = round($num);
$limit = strlen($this->scramble1);
while ($num >= $limit) {
$num = $num - $limit;
}
while ($num < 0) {
$num = $num + $limit;
}
return $num;
}
function _convertKey ($key){
if (empty($key)) {
$this->errors[] = 'No value has been supplied for the encryption key';
return;
}
$array[] = strlen($key);
$tot = 0;
for ($i = 0; $i < strlen($key); $i++) {
if (function_exists('mb_substr')) {
$char = mb_substr($key, $i, 1);
} else {
$char = substr($key, $i, 1);
}
$num = strpos($this->scramble1, $char);
if ($num === false) {
$this->errors[] = "Key contains an invalid character ($char)";
return;
}
$array[] = $num; // store in output array
$tot = $tot + $num; // accumulate total for later
}
$array[] = $tot; // insert total as last entry in array
return $array;
}
}
Initial URL
http://harvest-media.com
Initial Description
I had the hardest time finding a reliable way to encode/decode the password temporarily for an integration. So here it is.
Initial Title
PHP Password Encode/Decoder
Initial Tags
Initial Language
PHP