PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Java Methode in PHP


The_Invisible
2008-02-27, 11:10:31
habe in java kleine encrypt/decrypt funktionen gebaut und würde das jetzt gerne nach php portieren. das größte problem dabei sind anscheinend die datentypen zb int in java 8bit und in php 32bit. heraus kommt dabei nur wurstsalat.

Java:

private static long eKEY = 0xF4603CDE;

private static String eDecrypt(String Text)
{
StringBuffer sbT = new StringBuffer(), sbB = new StringBuffer();
int buf = 0;

int shr1 = (int) ((eKEY & 0xFF000000L) >> 24);
int shr2 = (int) ((eKEY & 0x00FF0000L) >> 16);
int shr3 = (int) ((eKEY & 0x0000FF00L) >> 8);
int shr4 = (int) (eKEY & 0x000000FFL);

sbB.append(Text);
sbB.reverse();
String tEnc = sbB.toString();

int i = 0;
for(int b: tEnc.toCharArray())
{
if (i != 0)
{
char bb = (char) (buf ^ shr2 ^ shr4 ^ shr3 ^ b ^ shr1);
sbT.append(bb);
}
buf = (int) b;

i++;
}
sbT.append((char) (buf ^ shr2 ^ shr4 ^ shr3 ^ shr1));

return sbT.reverse().toString();
}


PHP:

function decrypt(&$text)
{
$sbT = $sbB = "";
$buf = (int) 0;

$shr1 = (int) (($key & 0xFF000000) >> 24);
$shr2 = (int) (($key & 0x00FF0000) >> 16);
$shr3 = (int) (($key & 0x0000FF00) >> 8);
$shr4 = (int) ($key & 0x000000FF);

$sbB = strrev($text);

for($i=0;$i<strlen($sbB);$i++)
{
$b = (int) substr($sbB, $i, 1);

if($i != 0)
{
$bb = (int) ($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $b ^ $shr1);
$sbT .= (string) $bb;
}
$buf = (int) $b;
}
$sbT .= (string) ($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $shr1);

$text = strrev($sbT);
}


wenn wer eine lösung hat nur her damit, verzweifle schon langsam. und bevor die sicherheitsfanatiker kommen: es reicht für den einsatzzweck völlig, also nur posten wenn man lösungsansätze hat.

mfg

The_Invisible
2008-02-27, 11:56:07
habe es hinbekommen :D


function decrypt(&$text)
{
$sbT = $sbB = $buf = "";
$key = (int) 0xF4603CDE;

$shr1 = (int) (($key & 0xFF000000) >> 24);
$shr2 = (int) (($key & 0x00FF0000) >> 16);
$shr3 = (int) (($key & 0x0000FF00) >> 8);
$shr4 = (int) ($key & 0x000000FF);

$sbB = strrev($text);

for($i=0;$i<strlen($sbB);$i++)
{
$b = (int) ord(substr($sbB, $i, 1));

if($i != 0)
{
$bb = (int) ($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $b ^ $shr1);
$sbT .= (string) chr($bb);
}
$buf = (int) $b;
}
$sbT .= chr(($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $shr1));

$text = strrev($sbT);
}


so einfach und doch so schwer :)

mfg

Berni
2008-02-27, 13:34:03
Statt "substr($sbB, $i, 1));" kannst du auch einfach mittels der Arrayschreibweise auf den Buchstaben zugreifen mittels "$sbB[$i]". Dürfte in den meistne Fällen auch (etwas) performanter sein. Das Casten ist an der Stelle auch unnötig, da "ord()" immer ein int zurückgibt. Genauso gibt "chr()" immer einen String zurück und bei "$buf = (int) $b;" dürfte der Cast auch überflüssig sein weil $b ja weiter oben schon als int gespeichert wurde.
Soweit ich das sehe war dein Problem ja quasi nur die Übergabe des keys oder? Ich weiß ja nicht wo der definiert ist, aber evtl. hätte auch ein "global $key;" ganz oben in der Funktion gereicht bzw. eben ne Übergabe an deie Funktion...hardcoded in die Funktion ist ja nicht so ideal normal.

function decrypt(&$text) {
global $key;
$sbT = $sbB = $buf = "";

$shr1 = (int) (($key & 0xFF000000) >> 24);
$shr2 = (int) (($key & 0x00FF0000) >> 16);
$shr3 = (int) (($key & 0x0000FF00) >> 8);
$shr4 = (int) ($key & 0x000000FF);

$sbB = strrev($text);

for($i=0;$i<strlen($sbB);++$i) {
$b = ord($sbB[$i]);
if($i != 0) $sbT .= chr ($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $b ^ $shr1);
$buf = $b;
}
$sbT .= chr($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $shr1);

$text = strrev($sbT);
}
Möglicherweise könnte mans auch so machen, dürfte noch bissel schneller sein wenns immer noch dasselbe ausspuckt (kann das nicht testen). Man spart sich einmal das (je nach Textlänge kostspielige) Umdrehen des Textes sowie viele strlen-Abfragen (wird ja bei jedem Schleifendurchlauf aufgerufen).
function decrypt(&$text) {
global $key;
$sbT = $sbB = $buf = "";

$shr1 = (int) (($key & 0xFF000000) >> 24);
$shr2 = (int) (($key & 0x00FF0000) >> 16);
$shr3 = (int) (($key & 0x0000FF00) >> 8);
$shr4 = (int) ($key & 0x000000FF);
$j=0;
for($i=strlen($text);$i>-1;--$i) {
$b = ord($text[$i]);
if($j == 1) $sbT .= chr ($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $b ^ $shr1);
else $j = 1;
$buf = $b;
}
$sbT .= chr($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $shr1);

$text = strrev($sbT);
}
Evtl. geht sogar noch das:
function decrypt(&$text) {
global $key;
$sbT = $sbB = $buf = "";

$shr1 = (int) (($key & 0xFF000000) >> 24);
$shr2 = (int) (($key & 0x00FF0000) >> 16);
$shr3 = (int) (($key & 0x0000FF00) >> 8);
$shr4 = (int) ($key & 0x000000FF);
$j=0;
for($i=strlen($text);$i>-1;--$i) {
$b = ord($text[$i]);
if($j == 1) $text[$i+1] = chr ($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $b ^ $shr1);
else $j = 1;
$buf = $b;
}
$text[0]= chr($buf ^ $shr2 ^ $shr4 ^ $shr3 ^ $shr1);
}

Expandable
2008-02-27, 13:37:54
dabei sind anscheinend die datentypen zb int in java 8bit und in php 32bit.

Das glaube ich nicht. Ein int mit 8 bit könnte ja grad mal 256 verschiedene Werte speichern.

Berni
2008-02-27, 14:05:48
Ist es bei Java nicht so, dass die Größe der Datentypen vom verwendeten System abhängt? 8Bit sinds auf modernen Rechnern aber sicher nicht, da hast du Recht. Normal müssten es auch 32Bit sein aber es lag ja eh an was Anderem...

The_Invisible
2008-02-27, 14:10:51
Das glaube ich nicht. Ein int mit 8 bit könnte ja grad mal 256 verschiedene Werte speichern.

ja natürlich, ich trottel habe da irgendwie an char gedacht :D

@Berni
das problem war das ich den ascii wert der einzelnen zeichen brauchte und umgekehrt durch die funktionen chr() und ord(), in java ging das automatisch durchs casten.

werde auch mal deine version probieren :)

mfg

Coda
2008-02-27, 14:19:25
Ist es bei Java nicht so, dass die Größe der Datentypen vom verwendeten System abhängt?
Nein, natürlich nicht. Java verhält sich überall gleich. "int" ist immer 32 Bit und "long" 64 Bit.

Referenzen sind natürlich intern bei 64-Bit-Architekturen auch als 64-Bit-Pointer implementiert, aber das spielt in dem Zusammenhang keine Rolle.