it-swarm.com.de

Datei mit eigener Prüfsumme

Kann ich eine Datei erstellen, die eine eigene Prüfsumme enthält (MD5, SHA1, was auch immer)? Und um Joker zu verärgern, meine ich Checksum im Klartext, nicht die Funktion, die sie berechnet.

46
zakovyrya

Ich habe einen Code in C erstellt, dann bruteforce weniger als 2 Minuten lang ausgeführt und dieses Wunder geweckt:

The CRC32 of this string is 4A1C449B

Beachten Sie, dass nach dem Satz keine Zeichen (Zeilenende usw.) stehen dürfen.

Sie können es hier überprüfen: http://www.crc-online.com.ar/index.php?d=The+CRC32+of+dieser++erString+is+4A1C449B&de=Calcular+CRC32

Dieser macht auch Spaß:

I killed 56e9dee4 cows and all I got was...

Quellcode (leider etwas chaotisch) hier: http://www.latinsud.com/pub/crc32/

33
LatinSuD

Ja. Es ist möglich und bei einfachen Prüfsummen üblich. Eine Datei mit ihrem eigenen md5sum einzubeziehen, wäre ziemlich schwierig. 

Erstellen Sie im einfachsten Fall einen Prüfsummenwert, der dazu führt, dass der summierte Modul gleich Null ist. Die Prüfsummenfunktion wird dann zu etwas

(n1 + n2 ... + CRC) % 256 == 0

Wenn die Prüfsumme dann Teil der Datei wird, wird sie selbst geprüft. Ein sehr häufiges Beispiel dafür ist der Luhn-Algorithmus , der in Kreditkartennummern verwendet wird. Die letzte Ziffer ist eine Prüfziffer und ist selbst Teil der 16-stelligen Nummer.

17
brianegge

Überprüfen Sie dies:

echo -e '#!/bin/bash\necho My cksum is 918329835' > magic
12
sasha

"Ich wünschte, mein CRC32 wäre 802892ef ..."

Nun, ich fand das interessant, deshalb habe ich heute ein kleines Java-Programm für Kollisionen programmiert. Ich dachte, ich würde es hier lassen, falls jemand es nützlich findet:

import Java.util.Zip.CRC32;

public class Crc32_recurse2 {

    public static void main(String[] args) throws InterruptedException {

        long endval = Long.parseLong("ffffffff", 16);

        long startval = 0L;
//      startval = Long.parseLong("802892ef",16); //uncomment to save yourself some time

        float percent = 0;
        long time = System.currentTimeMillis();
        long updates = 10000000L; // how often to print some status info

        for (long i=startval;i<endval;i++) {

            String testval = Long.toHexString(i);

            String cmpval = getCRC("I wish my crc32 was " + testval + "...");
            if (testval.equals(cmpval)) {
                System.out.println("Match found!!! Message is:");
                System.out.println("I wish my crc32 was " + testval + "...");
                System.out.println("crc32 of message is " + testval);
                System.exit(0);
            }

            if (i%updates==0) {
                if (i==0) {
                    continue; // kludge to avoid divide by zero at the start
                }
                long timetaken = System.currentTimeMillis() - time;
                long speed = updates/timetaken*1000;
                percent =  (i*100.0f)/endval;
                long timeleft = (endval-i)/speed; // in seconds
                System.out.println(percent+"% through - "+ "done "+i/1000000+"M so far"
                        + " - " + speed+" tested per second - "+timeleft+
                        "s till the last value.");
                time = System.currentTimeMillis();
            }       
        }       
    }

    public static String getCRC(String input) {
        CRC32 crc = new CRC32();
        crc.update(input.getBytes());
        return Long.toHexString(crc.getValue());
    }

}

Die Ausgabe:

49.825756% through - done 2140M so far - 1731000 tested per second - 1244s till the last value.
50.05859% through - done 2150M so far - 1770000 tested per second - 1211s till the last value.
Match found!!! Message is:
I wish my crc32 was 802892ef...
crc32 of message is 802892ef

Beachten Sie, dass die Punkte am Ende der Nachricht tatsächlich Teil der Nachricht sind.

Auf meinem i5-2500 dauerte es ca. 40 Minuten, um den gesamten crc32-Speicherplatz von 00000000 bis ffffffff zu durchsuchen, was etwa 1,8 Millionen Tests pro Sekunde ergab. Es war ein Kern heraus.

Ich bin relativ neu mit Java, daher würde ich mich über konstruktive Kommentare zu meinem Code freuen.

"Mein crc32 war c8cb204, und alles, was ich bekam, war dieses miese T-Shirt!"

8
localhost

Sicher ist es möglich. Eine der Anwendungen von Prüfsummen besteht jedoch darin, Manipulationen an einer Datei zu erkennen. Woher wissen Sie, ob eine Datei geändert wurde, wenn der Modifikator auch die Prüfsumme ersetzen kann?

7
Mark Ransom

Sicher, Sie könnten den Digest der Datei selbst bis zum Ende der Datei verketten. Um dies zu überprüfen, würden Sie den Digest von allen bis auf den letzten Teil berechnen und dann mit dem Wert im letzten Teil vergleichen. Natürlich kann jeder ohne Verschlüsselung den Digest neu berechnen und ersetzen.

bearbeiten

Ich sollte hinzufügen, dass dies nicht so ungewöhnlich ist. Eine Technik besteht darin, eine CRC-32 so zu verketten, dass die CRC-32 der gesamten Datei (einschließlich dieses Digests) Null ist. Dies funktioniert jedoch nicht mit Digests, die auf kryptographischen Hashes basieren.

4
Steven Sudit

Ich weiß nicht, ob ich Ihre Frage richtig verstehe, aber Sie könnten die ersten 16 Bytes der Datei zur Prüfsumme des Restes der Datei machen.

Bevor Sie eine Datei schreiben, berechnen Sie den Hashwert, schreiben zuerst den Hashwert und dann den Inhalt der Datei.

2

Es gibt eine nette Implementierung des Luhn Mod N-Algorithmus in der Bibliothek python-stdnum ( siehe luhn.py ). Die calc_check_digit-Funktion berechnet eine Ziffer oder ein Zeichen, das, wenn es an die Datei angehängt wird (als String ausgedrückt), einen gültigen Luhn Mod N-String erstellt. Wie bereits in vielen Antworten erwähnt, können Sie die Gültigkeit der Datei auf Vollständigkeit prüfen, jedoch keine wesentlichen Manipulationssicherheit. Der Empfänger muss wissen, welches Alphabet verwendet wird, um die Gültigkeit von Luhn mod N zu definieren.

1
Martin Juckes

Wenn die Frage lautet, ob eine Datei neben anderen Inhalten auch eine eigene Prüfsumme enthalten kann , lautet die Antwort für Prüfsummen mit fester Größe trivial Ja, da eine Datei alle enthalten kann mögliche Prüfsummenwerte.

Wenn die Frage ist, ob eine Datei aus einer eigenen Prüfsumme bestehen könnte (und nichts anderes), ist es trivial, einen Prüfsummenalgorithmus zu konstruieren, der eine solche Datei unmöglich macht: Byte-Prüfsumme, nimm die binäre Darstellung der ersten n Bytes der Datei und addiere 1. Da es auch trivial ist, eine Prüfsumme zu konstruieren, die sich immer selbst codiert (dh mach das oben, ohne 1 zu addieren), gibt es offensichtlich einige Prüfsummen, die können sich selbst codieren und einige, die nicht können . Es wäre wahrscheinlich ziemlich schwierig zu sagen, welche davon eine Standardprüfsumme ist.

1
tloflin

Sicher.

Der einfachste Weg wäre, die Datei durch einen MD5-Algorithmus auszuführen und diese Daten in die Datei einzubetten. Sie können die Prüfsumme aufteilen und an bekannten Punkten der Datei platzieren (basierend auf einer Portionsgröße der Datei, z. B. 30%, 50%, 75%), wenn Sie versuchen, sie auszublenden.

Ebenso können Sie die Datei verschlüsseln oder einen Teil der Datei (zusammen mit der MD5-Prüfsumme) verschlüsseln und in die Datei einbetten. Edit Ich habe vergessen zu sagen, dass Sie dies tun würden Sie müssen die Prüfsummendaten entfernen, bevor Sie sie verwenden.

Natürlich, wenn Ihre Datei von einem anderen Programm, z. Wenn dann die Dinge etwas komplizierter werden, möchten Sie die Datei nicht "beschädigen", so dass sie nicht mehr lesbar ist.

0
ChrisBD

Sie können dies natürlich tun, aber in diesem Fall ist der SHA-Digest der gesamten Datei nicht der von Ihnen eingeschlossene SHA, da es sich hierbei um eine kryptographische Hash-Funktion handelt, die ein einzelnes Bit ändert Die Datei ändert den gesamten Hash. Was Sie suchen, ist eine Checksumme , die anhand des Inhalts der Datei berechnet wird, um eine Reihe von Kriterien zu erfüllen.

0
bandi

Es gibt viele Möglichkeiten, Informationen einzubetten, um Übertragungsfehler usw. zu erkennen. CRC-Prüfsummen eignen sich gut zum Erkennen von Läufen aufeinanderfolgender Bit-Flips und können so hinzugefügt werden, dass die Prüfsumme immer z. 0. Diese Art von Prüfsummen (einschließlich fehlerkorrigierender Codes) kann jedoch leicht wiederhergestellt werden und böswillige Manipulationen nicht aufhalten.

Es ist nicht möglich, etwas in die Nachricht einzubetten, damit der Empfänger seine Authentizität überprüfen kann, wenn er nichts anderes über den Absender weiß. Der Empfänger könnte beispielsweise einen geheimen Schlüssel mit dem Sender teilen. Der Absender kann dann eine verschlüsselte Prüfsumme anhängen (die kryptographisch sicher sein muss, z. B. md5/sha1). Es ist auch möglich, die asymmetrische Verschlüsselung zu verwenden, bei der der Sender seinen öffentlichen Schlüssel veröffentlichen und die MD5-Prüfsumme/den Hash mit seinem privaten Schlüssel signieren kann. Der Hash und die Signatur können dann als neue Prüfsumme in die Daten eingefügt werden. Dies geschieht heutzutage ständig im Internet.

Die verbleibenden Probleme sind dann 1. Wie kann der Empfänger sicher sein, dass er den richtigen öffentlichen Schlüssel hat, und 2. Wie sicher ist das alles in der Realität? Die Antwort auf 1 kann variieren. Im Internet ist es üblich, den öffentlichen Schlüssel von jemandem signiert zu haben, dem alle vertrauen. Eine andere einfache Lösung ist, dass der Empfänger den öffentlichen Schlüssel aus einem persönlichen Meeting erhalten hat. Die Antwort auf Punkt 2 kann sich von Tag zu Tag ändern, aber was teuer ist, um den Tag zu erzwingen, wird wahrscheinlich billig sein, um sich in der Zukunft Zeit zu lassen . Zu dieser Zeit haben sich hoffentlich neue Algorithmen und/oder vergrößerte Schlüsselgrößen herausgebildet.

0
Markarian451