--------------------------------Linux Guide---------------------------------- by Ingo Blechschmidt (c) 2002 ----------------------------------------------------------------------------- ------------------------- Entropie ------------------------- Mit Dec 4 17:21:32 MET 2002 ------------------------- Entropie file Mathematik Perl /etc/magic magic ----------------------------------------------------------------------------- Dieser Artikel zeigt, was man alles mit der Entropie machen kann. ----------------------------------------------------------------------------- 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 siehe <"#unten">unten. --------CODE--------: Beispiele > entropie.pl perlskript.pl -mitte 4.43554668908691 > entropie.pl elf.programm -mitte 3.1079234417147 > entropie.pl englischer.text -mitte 4.51086652352629 --------/CODE-------- 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 file, das jeder Distribution beiliegt, erkennt den Dateityp an charakteristischen Merkmalen, zum Beispiel bei HTML-Dateien. Würde man Tausende von Dateien gleichen Typs untersuchen, und den Durchschnitt herausrechnen, könnte man daraus ein file2 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, siehe <"down/entropie.pl">Download: --------CODE--------: 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 # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. # # Ingo Blechschmidt # Arberstraße 5 # 86179 Augsburg # E-Mail: iblech@web.de, http://www.way.to/uselinux/ # Tel.: +49 / 821 882955 # # $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 = ); } 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); --------/CODE-------- ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- This document is distributed under the terms of the GNU Free Documentation License.