Jump to content

Encryption Not Working


Mute

Recommended Posts

OK, a problem with our server migration. Our TEA encryption doesn't work anymore....

Works fine on my local computer with PHP 4.3.10 and on the old server with 4.4.2 but not on the new server with 4.4.2....

Any ideas on this one? Code is below.

[CODE]<?php
//---------------------------------------------------------
// TEA Encryption Functions
// Encryption and decryption of text
// Using the Tiny Encryption Algorithm

function DecToHex( $x )
{
$r = dechex( $x );
while( strlen( $r ) < 8 )
$r = '0'.$r;
return $r;
}

function shiftRightOne( $n )
{
$s = $n & 0x80000000;
$n &= 0x7fffffff;
$n >>= 1;
if( $s ) $n |= 0x40000000;
return $n;
}

function shiftRight( $n, $t )
{
for( $i = 0; $i < $t; ++$i )
{
$n = shiftRightOne( $n );
}
return $n;
}

function tea_encipher($p1, $p2, $k)
{
$temp = array( $p1, $p2 );
$n = 32;
$sum = 0;
while ($n-- > 0)
{
$temp[0] += (($temp[1] << 4 ^ shiftRight( $temp[1], 5 )) + $temp[1] ^ $sum + $k[($sum & 3)]);
$sum = $sum + 0x9E3779B9;
$temp[1] += (($temp[0] << 4 ^ shiftRight( $temp[0], 5 )) + $temp[0] ^ $sum + $k[( shiftRight( $sum, 11 ) & 3)]);
}
return $temp;
}

function tea_decipher($p1, $p2, $k)
{
$temp = array( $p1, $p2 );
$n = 32;
$sum = 0x9E3779B9 * $n;
while ($n-- > 0)
{
$temp[1] -= (($temp[0] << 4 ^ shiftRight( $temp[0], 5 )) + $temp[0] ^ $sum + $k[(shiftRight( $sum, 11 ) & 3)]);
$sum = $sum - 0x9E3779B9;
$temp[0] -= (($temp[1] << 4 ^ shiftRight( $temp[1], 5 )) + $temp[1] ^ $sum + $k[($sum & 3)]);
}
return $temp;
}

function tea_encrypt($inString, $key)
{
$outString = "";

// pad the input so that it's a multiple of 8
while ( strlen($inString) & 7 )
{
$inString .= ' ';
}

$i = 0;
while($i < strlen($inString) )
{
// slam 4 bytes into a dword
$p1 = ord( substr( $inString, $i++, 1 ) );
$p1 |= ord( substr( $inString, $i++, 1 ) ) << 8;
$p1 |= ord( substr( $inString, $i++, 1 ) ) << 16;
$p1 |= ord( substr( $inString, $i++, 1 ) ) << 24;
// mask off 32 bits to be safe
$p1 = $p1 & 0xFFFFFFFF;

// slam 4 bytes into a dword
$p2 = ord( substr( $inString, $i++, 1 ) );
$p2 |= ord( substr( $inString, $i++, 1 ) ) << 8;
$p2 |= ord( substr( $inString, $i++, 1 ) ) << 16;
$p2 |= ord( substr( $inString, $i++, 1 ) ) << 24;
// mask off 32 bits to be safe
$p2 = $p2 & 0xFFFFFFFF;

// send dwords to be enciphered
$res = tea_encipher($p1, $p2, $key);
$outString .= DecToHex($res[0]).DecToHex($res[1]);
}
// return encrypted string
return $outString;
}

function tea_decrypt( $inString, $key)
{
$outString = '';
// loop through input string
$i = 0;
while ( $i < strlen($inString) )
{
// 8 hex chars make a dword
$p3 = intval( substr( $inString, $i, 4 ), 16 ); // read high 16 bit word
$p3 <<= 16; // shift hi word correct position
$i += 4;
$p3 |= intval(substr( $inString, $i, 4 ), 16 ); // read low 16 bit word
$i += 4;

$p4 = intval( substr( $inString, $i, 4 ), 16 ); // read high 16 bit word
$p4 <<= 16; // shift hi word correct position
$i += 4;
$p4 |= intval(substr( $inString, $i, 4 ), 16 ); // read low 16 bit word
$i += 4;

// pass dwords to decipher routine
$res = tea_decipher($p3, $p4, $key);

// transform results back into alphanumic characters
// unpack first dword
$outString .= chr( ( $res[0] & 0x000000FF ) );
$outString .= chr( ( $res[0] & 0x0000FF00 ) >> 8 );
$outString .= chr( ( $res[0] & 0x00FF0000 ) >> 16 );
$outString .= chr( shiftRight( ( $res[0] & 0xFF000000 ), 24 ) );
// unpack second dword
$outString .= chr( ( $res[1] & 0x000000FF ) );
$outString .= chr( ( $res[1] & 0x0000FF00 ) >> 8 );
$outString .= chr( ( $res[1] & 0x00FF0000 ) >> 16 );
$outString .= chr( shiftRight( ( $res[1] & 0xFF000000 ), 24 ) );
}
return trim($outString);
}

function tea_isValid( $plain, $crypt, $keys )
{
return ( tea_encrypt( $plain, $keys ) == $crypt );
}

?>[/CODE]
Link to comment
Share on other sites

Could yougive an explanation to "[i]doesn't work anymore....[/i]"

Whats it supposed to do, what it supposed to return. Whats it returns now

I ran your code and it worked fine, however when I ran your code there was a few perse errors. Parse errors shouldn't stop the script from working, these errors where due to undefined index on your arrays. I suppressed these errors by place in @ symbol at the start of lines, 40, 42, 54 and 56.

The below is what I used to run your function:
[code]echo tea_encrypt('helloworld', 'a0b1c2');
echo '<br>';
echo tea_decrypt('7bacf8ad8397ed1b43b0f0a73eb42a63', 'a0b1c2');[/code]
And I got the following:
[code]7bacf8ad8397ed1b43b0f0a73eb42a63
helloworld[/code]
Which to me appears to be working. I cannot see why this is not wokring on your new server as it doesnt appear to be using any functions that require extensions.
Link to comment
Share on other sites

[quote author=wildteen88 link=topic=99672.msg393000#msg393000 date=1152264208]
Could you give an explanation to "[i]doesn't work anymore....[/i]"[/quote]

Sorry, that was pretty undescriptive. The code processes fine and I get no errors. It just doesn't encrypt the word (a username on the site) properly anymore and then can't decrypt the word then.

[quote author=wildteen88 link=topic=99672.msg393000#msg393000 date=1152264208]
The below is what I used to run your function:
[code]echo tea_encrypt('helloworld', 'a0b1c2');
echo '<br>';
echo tea_decrypt('7bacf8ad8397ed1b43b0f0a73eb42a63', 'a0b1c2');[/code]
And I got the following:
[code]7bacf8ad8397ed1b43b0f0a73eb42a63
helloworld[/code]
Which to me appears to be working. I cannot see why this is not wokring on your new server as it doesnt appear to be using any functions that require extensions.
[/quote]

That's exactly what I'm stumped about, just seems like simple PHP code that should work anywhere. I ran the same as you above on my local machine and got the same results. When on the server though I get this as the encrypted string....

86bb954593b1edad43b0f0a73eb42a63

By the way, I didn't write this code, it was part of the site when I took over.
Link to comment
Share on other sites

As far as I can tell, everything works fine till this part of the code....

[code]
function shiftRightOne( $n )
{
$s = $n & 0x80000000;
$n &= 0x7fffffff;
$n >>= 1;
if( $s ) $n |= 0x40000000;
return $n;
}
[/code]

And after that is where the two environments start having differences.
Link to comment
Share on other sites

OK, here's some phpinfo from the old server which works and the new server which doesn't.

Old Server (works)
[url=http://83.245.15.145/~check/test.php]http://83.245.15.145/~check/test.php[/url]

New Server (doesn't work)
[url=http://87.117.198.116/~chav0ly/test.php]http://87.117.198.116/~chav0ly/test.php[/url]

Are there any blatant differences in variables or some such that could be causing this problem?
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.