Name="Entropie"
Stich="Entropie file Mathematik Perl /etc/magic magic"
#befor Janto:-)Zeit="Son Aug 5 11:26:29 MEST 2001"
Zeit="Mit Dec 4 17:21:32 MET 2002"
Kurz="Dieser Artikel zeigt, was man alles mit der Entropie machen kann."
Lang="
Mit der Entropie - dem Maß der Ordnung - kann man einiges machen.
8 Bit Entropie ist das maximale Chaos, also der Zufall, und 0 Bit Entropie ist
die perfekte Ordung.
Mit der Entropie kann man den Autor eines Buches herausfinden, Daten
entschlüsseln und den Dateityp herausfinden.
Mein Skript entropie.pl befindet sich weiter unten.
`exCodes Beispiele`
> entropie.pl perlskript.pl -mitte
4.43554668908691
> entropie.pl elf.programm -mitte
3.1079234417147
> entropie.pl englischer.text -mitte
4.51086652352629
`exCodee`
Beim englischen Text würde sich, wenn man noch weitere Texte untersucht,
ein Änderung ab der dritten Nachkommastelle zeigen.
Sie sehen, die Entropie unterscheidet sich von Dateityp zu Dateityp.
Das Utility ${esCodes}file${esCodee}, das jeder Distribution beiliegt, erkennt
den Dateityp an charakteristischen Merkmalen, zum Beispiel <html> bei
HTML-Dateien. Würde man Tausende von Dateien gleichen Typs untersuchen,
und den Durchschnitt herausrechnen, könnte man daraus ein
${esCodes}file2${esCodee} bauen. Dieses Programm könnte dann von file
aufgerufen werden, damit file erstmal den groben Dateityp der zu untersuchenden
Datei weiß (beispielsweise kompiliertes Programm, Skript, Text), und dann
den Text genauer analysieren kann (Perl-, Shell-, Basic-Skript). Diese
Vorgehensweise würde bei einer großen Magic-Datei (die Datei, aus der file
seine Informationen zieht, meistens /etc/magic) Zeit sparen.
Janto Trappe hat entropie.pl nach PHP portiert und auf
http://www.sylence.net/entropie/
veröffentlicht. Wer also mal schnell eine
kleine Datei überprüfen will, sollte die PHP-Version benutzen.
Das Skript, Download:
`exCodes entropie.pl`
#!/usr/bin/perl -w
# entropie.pl - Berechnet die Entropie von Dateien
# Copyright (C) Son Aug 5 11:42:36 MEST 2001 by Ingo Blechschmidt
`cat gpl.lic add.lic`
\$file = '';
%char = ();
\$len = 0;
\$a = 0;
\$b = 0;
\$c = 0;
\$d = 0;
\$e = '';
\$f = '';
# Erw:
\$kurz = '';
if (not \$ARGV[0]) {
print 'Bitte Dateinamen angeben: ';
chomp(\$file = <STDIN>);
} else {
\$file = \$ARGV[0];
}
open(DATEI, \$file) || die("Konnte '\$file' nicht laden!");
while () {
\$e = getc(DATEI);
last if (not \$e);
\$char{ord(\$e)}++;
\$len++;
}
close(DATEI);
# Erweiterungen Son Aug 5 11:34:44 MEST 2001:
if (defined \$ARGV[1]) { \$kurz = 'ja' } else { \$kurz = 'nein' }
if (\$kurz eq 'nein') {
open(OUT, '|less') || die "Konnte nicht 'less' starten!";
select(OUT);
}
print("Entropie der Datei '\$file':\\n\\n") unless (\$kurz eq 'ja');
for(\$b = 0; \$b <= 255; \$b++) {
if (not \$char{\$b}) {
\$c = 0;
} else {
\$a = \$char{\$b} / \$len;
\$c = -(\$a * (log(\$a) / log(2)));
}
\$d += \$c;
\$f = chr(\$b); \$f = '' if (\$b < 32);
print "\$b (\$f): \\t\$c\\n" unless (\$c eq 0 or \$kurz eq 'ja');
}
if (\$kurz eq 'ja') {
print "\$d\\n";
} else {
print "\\nMittlere Entropie der Datei: \$d\\n";
}
close(OUT) unless (\$kurz eq 'ja');
select(STDOUT);
`exCodee`
"
case $1 in
Name) echo $Name; exit;;
Stich) echo $Stich; exit;;
Zeit) echo $Zeit; exit;;
Kurz) echo $Kurz; exit;;
Lang) echo $Lang; exit;;
esac
# if [ "$1" = "Name" ]; then echo $Name; fi
mself_vA="txt/0022.txt txt/0023.txt txt/0031.txt txt/0039.txt txt/0051.txt
txt/0053.txt txt/0089.txt"