Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12586[/thread]

Algorythmus liefert verschiedene Werte?



<< >> 6 Einträge, 1 Seite
~Br4inP4in~
 2008-10-05 14:44
#115178 #115178
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hallo.

Ich habe, um eine einfache Dateinamen-verschlüsselung zu erstellen, einen kleinen einseitigen Algorythmus programmiert.
Der Dateiname wird bei der erstellung einer Datei damit erzeugt und das öffnen der Datei erfolgt dann, nachdem der gewünschte Dateiname durchgejagt wurde.
Funktioniert auch alles wunderbar, nur wollte ich den Algo nun auf einem Webserver zum Einsatz bringen und er liefert mir plötzlich andere Ergebnisse.

Hier der Algo:
Code (perl): (dl )
1
2
3
4
5
6
7
8
sub file_algorithm
{
    my @cryptedchr  = split(//, reverse (crypt (reverse (shift), '4%')));
    my $filename    = ();
    splice (@cryptedchr, 0, -5);
    foreach (@cryptedchr) { $filename .= sprintf ("%02x", ord($_)); }
    return $filename;
}


Beim Input 'turnen' sollte eigentlich herauskommen:
Code: (dl )
586c742534


Das Ergebnis des Webservers ist aber:
Code: (dl )
634e5a2534


Ich habe schon mit ord() die einzelnen ASCII-Werte des Strings ausgeben lassen, die Inputs stimmen 100%ig überein.

Gibt es betriebssystemabhängige Abweichungen bei den Funktionen oder an was kann das liegen?

Gruß, ~Br4inP4in~
topeg
 2008-10-05 15:22
#115179 #115179
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
"crypt" greif auf den gleichnamigen Systemaufruf des Betriebssystem zurück. Die Implemtation kann von OS zu OS unterschiedlich sein (sollte eigentlich bei allen POSIX kompatiblen Systemen gleich sein). Bei Betriebssystemen, die das nicht unterstützen wird sie von Perl emuliert.
Um OS unabhängig zu sein sollte man md5 oder ähnliches nutzen.

Nachtrag:
Auf meinem Linux kommt bei "turnen" "634e5a2534" raus.
Dir ist hoffentlich klar, dass die letzten 4 Zeichen das "Salt" sind.
Besser währe wohl wenn du die ersten Zeichen nimmst anstatt die letzten.
~Br4inP4in~
 2008-10-05 16:04
#115180 #115180
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Ah, nun versteh ich auch, warum die letzten vier Zeichen gleich sind..
Das scheint aber wohl ein unterschied zwischen Unix und Windowskisten zu sein, denn auf meinem Rechner läuft Windows, auf dem Server ein Unix-System.
Gut zu wissen - Werde es wohl jetzt mit MD5 lösen, danke dir!
topeg
 2008-10-05 16:12
#115181 #115181
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Nebenbei
Deinen Code kann man auch kürzer schreiben:
Code (perl): (dl )
1
2
3
4
 sub file_algorithm
{
 return unpack('H*',reverse(substr(crypt (reverse (shift), '4%'),0,5)));
}


oder besser (die ersten 5 Zeichen nicht die letzten):
Code (perl): (dl )
1
2
3
4
 sub file_algorithm
{
 return unpack('H*',substr(reverse(crypt (reverse (shift), '4%')),0,5));
}



Das mal mit MD5
mit MD5:
Code (perl): (dl )
1
2
3
4
5
 sub file_algorithm
{
 use Digest::MD5 qw(md5);
 return unpack('H*',reverse(substr(md5(reverse(shift) xor '")§$/$00§"9&?4?+'),0,5)));
}
~Br4inP4in~
 2008-10-05 19:31
#115184 #115184
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Dein letztes Beispiel werde ich jetzt verwenden, allerdings erstellt er, wenn ich
Code: (dl )
 xor '")§$/$00§"9&?4?+'

im String habe, immer den gleichen filename, deshalb habe ich den Teil jetzt erstmal nicht implementiert.
Ich habe xor bis jetzt noch nicht verwendet, bedeutet das einfach, dass er falls kein Wert vorliegt, diesen String als Hash umwandeln soll?
Danke dir nochmal für die Mühe :)
topeg
 2008-10-05 22:31
#115187 #115187
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
"xor" ist eine logische Verknüpfung:
Code: (dl )
1
2
3
4
  | 0 1
--+----
0 | 0 1
1 | 1 0

Mein Fehler war "xor" mit "^" gleich zu setzen.
"^" macht hier mit jedem Bit "xor" von der Eingabe mit dem String.


Das besondere an "xor" bzw. "^" ist, dass man den verschlüsselten String mit dem selben Schlüssel entschlüsseln kann mit dem man ihn Verschlüsselt hat. Ist der Schlüssel nicht bekannt, so ist der Verschlüsselte String nicht mehr Entschlüsselbar.

Ich benutze hier das "^" um den Sring noch ein wenig zu "salzen". Das ist an sich nicht Umbedingt nötig, schadet aber auch nichts. :-)
MD5 ist bedingt knackbar (es gibt ein endliche Anzahl von Strings, die den selben MD5 String liefert). Einfacher wird es in deinem Fall auchnoch, da du nur einen Teilstring der MD5-Summe nutzt, darum fügte ich noch etwas "Salz" hinzu um das zu Erschwehren, vorausgesetzt man kennt den Code nicht. :-)

Noch etwas besser wäre die Variante:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# Zufallsgenerator mit "Zufallswert" initialisieren
srand(rand(time));

my $name='turnen';

my $filename=create_crypt($name);
print "$filename\n";

print "OK\n" if(check_crypt($filename,$name));

sub create_crypt
{
 my $salt=join('',grep{$_=chr(int(rand(256)))}(0..5));
 return unpack('H*',reverse(substr(md5(reverse(shift) ^ $salt),0,5)).$salt );
}

sub check_crypt
{
 my $crypt=pack('H*', shift);
 my $salt=substr($crypt,5,length($crypt),'');
 return 1 if($crypt eq reverse(substr(md5(reverse(shift) ^ $salt),0,5)));
 return 0;
}

Vorteile:
- Es ist sehr unwahrscheinlich zweimal den selben Dateinamen zu erzeugen.
- Es ist eine recht "starke" Verschlüsselung.
Nachteile:
- Wenn du den verschlüsselten Dateinamen zu einem Namen suchst, musst du alle vorhanden Dateinamen mit check_crypt gegen den den Namen testen. Das kann natürlich recht langsam werden.
- Security by obscurity. Nur wer den Code nicht kennt hat es schwer.
<< >> 6 Einträge, 1 Seite



View all threads created 2008-10-05 14:44.