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"