Unmögliche Aufgabe?
Unmögliche Aufgabe?
Man kann MD5 Prüfsumme einer Exe erstellen. Das ist kein Problem. Und man kann die Prüfsumme in die Exe packen.
Auch kein Problem. Aber ist es möglich die selbe Prüfsumme in die Exe einzubunden die mit der neuen Prüfsumme
nach dem einbinden übereinstimmt? Problem ist sobald man die Exe verändert indem man die Prüfsumme einbindet
dann ändert sich die Prüfsumme der neuen Exe. Kann man MD5 Prüfsumme vorhersagen? Ich möchte in der Exe die
eigene MD5 Prüfsumme der selben Exe haben damit die Exe die Prüfsummme aus der eigenen Exe liest und mit
FileFingerprint(ProgramFilename(),#PB_Cipher_MD5) vergleicht ob die Exe von einem anderen Programm modifiziert
wurde. Das klingt unlösbar oder
Auch kein Problem. Aber ist es möglich die selbe Prüfsumme in die Exe einzubunden die mit der neuen Prüfsumme
nach dem einbinden übereinstimmt? Problem ist sobald man die Exe verändert indem man die Prüfsumme einbindet
dann ändert sich die Prüfsumme der neuen Exe. Kann man MD5 Prüfsumme vorhersagen? Ich möchte in der Exe die
eigene MD5 Prüfsumme der selben Exe haben damit die Exe die Prüfsummme aus der eigenen Exe liest und mit
FileFingerprint(ProgramFilename(),#PB_Cipher_MD5) vergleicht ob die Exe von einem anderen Programm modifiziert
wurde. Das klingt unlösbar oder
- Fluid Byte
- Beiträge: 3110
- Registriert: 27.09.2006 22:06
- Wohnort: Berlin, Mitte
Re: Unmögliche Aufgabe?
Du führst den Sinn einer MD5-Prüfsumme ad absurdum.
Windows 10 Pro, 64-Bit / Outtakes | Derek
Re: Unmögliche Aufgabe?
@¯\_(ツ)_/¯
Dein Text liest sich verwirrend.
Hierbei stimme ich dem fließenden Byte zu.
Dein Text liest sich verwirrend.
Hierbei stimme ich dem fließenden Byte zu.
Betriebssysteme: div. Windows, Linux, Unix - Systeme
no Keyboard, press any key
no mouse, you need a cat
no Keyboard, press any key
no mouse, you need a cat
Re: Unmögliche Aufgabe?
Es ist nicht unmöglich, nur schwierig.
Das prinzip bei Bitcoin ist ziemlich ähnlich, nur dass die Prüfsumme dabei nicht im Block, welcher gehasht wird, vorhanden ist. Außerdem wird bei bitcoin nach einem Hash gesucht, welcher mit einer bestimmten Anzahl von 0 Bits beginnt. Es macht aber keinen Unterschied, ob man nach einer Kette von 0 Bits, oder einer Kette von bestimmten Bits sucht.
Auf das Problem hier bezogen, auch wenn der Hash-Algorithmus nicht MD5, sondern SHA256 ist, könnte man es folgendermaßen vergleichen:
Die Zeit wird proportional mit dem Suchraum größer, und da sich dieser mit jedem weiteren Bit verdoppelt wird die benötigte Zeit um den Faktor 2^(128-73) größer. Also 3,6*10^17 Minuten. (685 milliarden Jahre)
Also selbst mit der gigantischen Rechenleistung von Bitcoin ist das recht aussichtslos. Auch wenn man noch berücksichtigt, dass bei Bitcoin zwei mal mit SHA256 gehasht wird, und dass MD5 viel schneller zu Hashen wäre, wird man nicht wahrscheinlich nicht zu einer nutzbaren Rechendauer kommen.
Eine Sache wäre da aber noch: MD5 gilt nicht mehr als sicher, eventuell kann man gezielt Kollisionen oder andere Lücken ausnutzen, um schneller zu einem Ergebnis zu kommen.
Ich hoffe ich habe mich nirgends vertan.
Das prinzip bei Bitcoin ist ziemlich ähnlich, nur dass die Prüfsumme dabei nicht im Block, welcher gehasht wird, vorhanden ist. Außerdem wird bei bitcoin nach einem Hash gesucht, welcher mit einer bestimmten Anzahl von 0 Bits beginnt. Es macht aber keinen Unterschied, ob man nach einer Kette von 0 Bits, oder einer Kette von bestimmten Bits sucht.
Auf das Problem hier bezogen, auch wenn der Hash-Algorithmus nicht MD5, sondern SHA256 ist, könnte man es folgendermaßen vergleichen:
- Anzahl von zu suchenden Bits des MD5-Hashes: 128 (Es muss ja der komplette Hash gefunden werden, welcher vorher festgelegt und in die exe-Datei geschrieben wurde)
- Aktuelle Hashrate von Bitcoin: 25.295.477.650 GH/s
- Aktuelle Difficulty von Bitcoin: 3290605988754 (Umgerechnet muss also der Hash des Blockes mit ca. 73 Null-Bits beginnen)
- Durchschnittszeit zwischen gefundenen Bitcoin-Blöcken: 10 Minuten
Die Zeit wird proportional mit dem Suchraum größer, und da sich dieser mit jedem weiteren Bit verdoppelt wird die benötigte Zeit um den Faktor 2^(128-73) größer. Also 3,6*10^17 Minuten. (685 milliarden Jahre)
Also selbst mit der gigantischen Rechenleistung von Bitcoin ist das recht aussichtslos. Auch wenn man noch berücksichtigt, dass bei Bitcoin zwei mal mit SHA256 gehasht wird, und dass MD5 viel schneller zu Hashen wäre, wird man nicht wahrscheinlich nicht zu einer nutzbaren Rechendauer kommen.
Eine Sache wäre da aber noch: MD5 gilt nicht mehr als sicher, eventuell kann man gezielt Kollisionen oder andere Lücken ausnutzen, um schneller zu einem Ergebnis zu kommen.
Ich hoffe ich habe mich nirgends vertan.
- NicTheQuick
- Ein Admin
- Beiträge: 8679
- Registriert: 29.08.2004 20:20
- Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti - Wohnort: Saarbrücken
- Kontaktdaten:
Re: Unmögliche Aufgabe?
Einfach die MD5-Summe an das Ende der Datei packen und beim Berechnen nicht miteinbeziehen. Anders geht es nicht. Im Übrigen nutzt man hier eher SHA256 und nicht das veraltete MD5.
Re: Unmögliche Aufgabe?
Tut mir wirklich sehr leid, dass ich mich ungenau ausgedrückt habe. Sorry Ich versuche es so zu erklären...
geänderte Exe erneut auf MD5 prüfe. Ich meine so:
MD5.s = FileFingerprint("meineExe.exe",#PB_Cipher_MD5)
MD5.s -> Exe einbinden
MD5_2.s = FileFingerprint("meineExe.exe",#PB_Cipher_MD5)
Ergo: MD5_2.s ist anders als MD5.s. Ich will aber dass MD5 Summe gleichbleibt damit meine Exe feststellen kann ob
meine Exe geändert wurde.
Wenn ich das mache, dann ist die MD5-Summe veraltet bzw. stimmt nicht mit der MD5-Summe überein wenn ich dieNicTheQuick hat geschrieben:Einfach die MD5-Summe an das Ende der Datei packen
geänderte Exe erneut auf MD5 prüfe. Ich meine so:
MD5.s = FileFingerprint("meineExe.exe",#PB_Cipher_MD5)
MD5.s -> Exe einbinden
MD5_2.s = FileFingerprint("meineExe.exe",#PB_Cipher_MD5)
Ergo: MD5_2.s ist anders als MD5.s. Ich will aber dass MD5 Summe gleichbleibt damit meine Exe feststellen kann ob
meine Exe geändert wurde.
Re: Unmögliche Aufgabe?
Beherzige doch einfach mal den Ratschlag, welcher Dir hier gegeben wurde:
http://www.purebasic.fr/german/viewtopi ... 16&t=30681
http://www.purebasic.fr/german/viewtopi ... 16&t=30681
Re: Unmögliche Aufgabe?
Nein.¯\_(ツ)_/¯ hat geschrieben:Wenn ich das mache, dann ist die MD5-Summe veraltetNicTheQuick hat geschrieben:Einfach die MD5-Summe an das Ende der Datei packen
Du hast ne Exe mit einer Funktion, die sich selber liest, dabei aber die letzten x Byte ignoriert (x = Länge der Prüfsumme), aus den gelesenen Daten die Prüfsumme generiert und mit den letzten x Byte der Datei vergleicht.
Zum Verteilen der Exe brauchst du ein zweites Programm, welches die komplette Exe einliest, die Prüfsumme bildet und dann die Prüfsumme an's Ende schreibt.
Signatur und so
Re: Unmögliche Aufgabe?
Danke Derren, dann darf ich nicht FileFingerprint benutzen sondern StringFingerprint oder so so das nicht die
komplette Datei gechecktsummt wird sondern bis zum Ende wo der Platzhalter der Checksumme ist. Okay dann gings
damit. Aber mit FileFingerprint scheint also unmöglich zu sein. Ich werde es so machen wie du es gesagt hast
Danke! Nur der einzige Nachteil ist dass es trotzdem unsicher ist weil der Cracker könnte den Inhalt meiner Exe
verändern und die CHecksumme am Ende nur anpassen und so glaubt mein Programm es sei nichts verändert worden.
Deshalb hätte ich gerne FileFingerprint nur kann ich keine CHecksumme vorhersagen damit es auch nach der Exe-
Änderung stimmt.
komplette Datei gechecktsummt wird sondern bis zum Ende wo der Platzhalter der Checksumme ist. Okay dann gings
damit. Aber mit FileFingerprint scheint also unmöglich zu sein. Ich werde es so machen wie du es gesagt hast
Danke! Nur der einzige Nachteil ist dass es trotzdem unsicher ist weil der Cracker könnte den Inhalt meiner Exe
verändern und die CHecksumme am Ende nur anpassen und so glaubt mein Programm es sei nichts verändert worden.
Deshalb hätte ich gerne FileFingerprint nur kann ich keine CHecksumme vorhersagen damit es auch nach der Exe-
Änderung stimmt.
Re: Unmögliche Aufgabe?
Wenn's denn unbedingt so sein soll:
Länge ist hier Dein Freund.
Code: Alles auswählen
Ergebnis$ = FileFingerprint(Dateiname$, Plugin [, Bits [, Offset [, Länge]]])