Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi TFileStream Speichern nach Vergrößerung (https://www.delphipraxis.net/149991-tfilestream-speichern-nach-vergroesserung.html)

SyntaxXx 4. Apr 2010 15:09


TFileStream Speichern nach Vergrößerung
 
Hallo leute,
bin gerade an einem neuen kleinen Projekt dran.

Ich erkläre nur einmal ganz kurz die Funktion:
Also ich habe jetzt die Größe einer Datei als MD5 Hash.

Jetzt möchte ich eine belibige Datei in mein Programm laden, die ein wenig kleiner ist als meine Original Datei.
Sprich:
Original Datei = 5 MB
Datei2 = 4,5 MB

Wenn ich nun Datei2 in mein Programm lade, wird von der Größe dieser Datei ein MD5 Hash erstellt.
Sollte dieser Hash nun gleich sein mit dem Hash der Original Datei, dann soll die Datei gespeichert werden.

Sollte der MD5 Hash nicht gleich sein, wir gehen davon aus, das die Datei2 kleiner ist, dann soll auf die Datei 1 Bit daz addiert werden und wieder von der neuen Größe der MD5 Hash erstellt werden.
Und das so lange, bis eben die beiden Hashs gleich sind.

Soweit ist das ganze auch kein Problem.
Hier mal ein wenig Code von mir:

Delphi-Quellcode:
var lstream : TFileStream;
Sollte klar sein.
Delphi-Quellcode:
begin
 Opendialog1.Execute();
 try
 lStream := TFileStream.Create(OpenDialog1.Filename, fmOpenReadWrite);
Hier wähle ich eine Datei aus, und lade sie auf lStream.

Delphi-Quellcode:
lstream.Size := lstream.Size + 1
Und hiermit erhöhe ich die Größe der Datei immer um 1 Bit.


Sollte soweit richtig sein, hoffe ich^^.

Nunja jetzt zu meinem Problem.
Wenn nun die beiden Hashs übereinstimmen, soll die Datei Natürlich gespeichert werden.
Nur wie mache ich das jetzt?

Habe schon
Delphi-Quellcode:
lstream := TFileStream.Create('E:\MD5 After.txt', fmCreate);
probiert, aber dann wird immer nur eine leere Datei erstellt, die 0 Byte groß ist.

Die Datei die ich auf lStream lade (in meinem falle eine Textdatei) steht aber "1234567890" drin.
Also sollt doch auch wenigstens das nach dem speichern auch wieder drin stehen.

Könnt ihr mir helfen?

SirThornberry 4. Apr 2010 15:42

Re: TFileStream Speichern nach Vergrößerung
 
Du redest von Filestreams und von Speichern. Wenn du etwas an einem TFileStream änderst ist das sofort geändert und nichts muss extra gespeichert werden. Mit TFileStream bearbeitest du die Datei sozusagen direkt.
Des weiteren schreibst du
Zitat:

...dann soll auf die Datei 1 Bit daz addiert werde...
Du weißt aber schon das du ein einzelnes Bit nicht speichern kannst sondern nur ganze Bytes?! Und was meinst du mit "auf die Datei addiert werden"? Soll der Inhalt der Datei irgendwie um ein Bit verschoben werden? Oder willst du die Dateigröße neu setzen (wobei wie gesagt nur ganze Bytes möglich sind)?

Christian Seehase 4. Apr 2010 15:50

Re: TFileStream Speichern nach Vergrößerung
 
Moin SyntaxXx,

was soll das eigentlich werden, wenn's fertig ist?
Der MD5-Hash-Wert über die Grösse (als String?) sollte erst dann gleich sein, wenn die Grösse gleich ist.

SyntaxXx 4. Apr 2010 15:58

Re: TFileStream Speichern nach Vergrößerung
 
Also der Hauptsinn des Programmes ist es, 2 genau gleich große Dateien zu haben.
Wobei eine der Dateien erst einmal auf die größe geändert werden muss.
Und um eben die exacte größe zu bekommen, verwende ich eben den MD5 Hash.


@ SirThornberry

Also die Datei soll ich sag mal aufgepumpt werden.
Die Datei bleibt gleich, nur eben die Größe ändert sich.
Hmmm blöd das zu erklären.



Was eben wichtig ist, wenn eine Datei 1000 Bit groß ist und die andere 1001 Bit, dann bekomme ich 2 verschiedene Hashs.
Und das ist eben das Problem. Die größe muss aufs Bit genau überein stimmen.


Ich will nur die größe neu setzen.

DeddyH 4. Apr 2010 16:04

Re: TFileStream Speichern nach Vergrößerung
 
Ich steig da überhaupt nicht durch. Wozu den Hash, wenn es nur um die Dateigröße geht? Und eine Datei mit genau 1001 Bit kann es nicht geben, da Byte die kleinste Einheit ist.

SyntaxXx 4. Apr 2010 16:08

Re: TFileStream Speichern nach Vergrößerung
 
Also einer macht hier gerade ein Denkfehler.

Soweit ich mich entsinnen kann siehts wie folgt aus:

1 Byte = 8 Bit
1 Kilobyte = 1024 Byte
1 Megabyte = 1024 Kilobyte


Also ist Bit doch die kleinste Einheit.

scrat1979 4. Apr 2010 16:11

Re: TFileStream Speichern nach Vergrößerung
 
Zitat:

Zitat von SyntaxXx
Also einer macht hier gerade ein Denkfehler.

Soweit ich mich entsinnen kann siehts wie folgt aus:

1 Byte = 8 Bit
1 Kilobyte = 1024 Byte
1 Megabyte = 1024 Kilobyte


Also ist Bit doch die kleinste Einheit.

Er meinte, Byte ist die kleinste Einheit mit welcher TFileStream und somit die Datei angesprochen werden kann :) natürlich ist das Bit die kleinste Einheit aber im Beispiel eben nicht praktikabel

DeddyH 4. Apr 2010 16:12

Re: TFileStream Speichern nach Vergrößerung
 
Wenn Du es schaffst, eine 1 Bit große Datei anzulegen, geb ich Dir gerne einen aus.

scrat1979 4. Apr 2010 16:17

Re: TFileStream Speichern nach Vergrößerung
 
Wobei ich mich wirklich noch immer Frage, was denn der hash in diesem Beispiel verloren hat. Zwei gleich große Dateien mit unterschiedlichem Inhalt werden mit an Sicherheit grenzender Wahrscheinlichkeit einen komplett anderen md5-Hash produzieren.

Falls es wirklich nur darum geht, die Dateigröße der kleineren an die der größeren anzugleichen, würde ich folgendes machen:

1. Differenz von GroesseDatei1 und GroesseDatei2 bestimmen (sei Hier DiffFileSize)
2. An den FileStream der kleineren Datei z.B. Leerzeichen (DiffFileSize Stück) hinzufügen

Grüsse

DeddyH 4. Apr 2010 16:19

Re: TFileStream Speichern nach Vergrößerung
 
Ja eben, deshalb ja meine Verwunderung.

SyntaxXx 4. Apr 2010 16:21

Re: TFileStream Speichern nach Vergrößerung
 
Ok dann stellt sich aber jetz eine Frage.

Ich habe jetzt 2 Dateien.
Beide sind 58 Byte groß.

Jetzt erstelle ich von beiden den MD5 Hash.
Das Programm, welches den MD5 Hash erstellt, schau sich aber jedes Bit an (so fern das möglich ist).
Dann würde ich doch vielleicht 2 verschiedene Hashs bekommen, weil vielleicht eine der beiden Programme nicht genau 58 byte groß ist, sondern vielleicht 58,4 Byte.

Wäre das möglich, oder kann generell auf dem Computer nicht kleiner als 0 Byte sein? (0,5 Byte würde es dann nie geben)


Das ist das Problem wo ich hänge.





@ DeddyH

Gut 1 Bit geht nicht, weil eine leere Textdatei schon größer ist.






@ scrat1979

Es geht aber halt darum das ich den selben MD5 Hash bekomme.
Fals das nicht möglich ist, dann kann ich hier aufhören ^^
Aber sobald die beiden Größen exakt gleich sind, und sich der MD5 Hash auf der Größe ergibt, wäre der Hasch ja gleich.

DeddyH 4. Apr 2010 16:22

Re: TFileStream Speichern nach Vergrößerung
 
Ein MD5-Hash ergibt sich nicht aus der Dateigröße, sondern aus dem Inhalt.

[edit] Zumindest ist das der Sinn des Hashes. [/edit]

SyntaxXx 4. Apr 2010 16:26

Re: TFileStream Speichern nach Vergrößerung
 
Ok also ist es nie möglich, das 2 verschiedene Dateien, den selben MD5 Hash haben, auch wenn die größe genau gleich ist?

DeddyH 4. Apr 2010 16:28

Re: TFileStream Speichern nach Vergrößerung
 
Das kommt vermutlich auf die Implementierung an, aber man verwendet den Hash je eben genau deshalb, um 2 Dateien inhaltlich zu vergleichen. Sind sie unterschiedlich groß, haben sie logischerweise auch unterschiedliche Hashes. Das heißt aber nicht im Umkehrschluss, dass gleich große Dateien auch gleiche Hashes hätten, diese würden ja dann ihren Sinn verlieren.

[edit] 2 Bachstuben verwechselt [/edit]

SyntaxXx 4. Apr 2010 16:37

Re: TFileStream Speichern nach Vergrößerung
 
Ok thx.

EDIT: Das andere peoblem habe ich hin bekommen^^

Luckie 4. Apr 2010 16:44

Re: TFileStream Speichern nach Vergrößerung
 
Also Bit ist zwar die kleinste digitale Informationseinheit, aber Byte die kleinste Einheit, die der Computer verarbeiten / ansprechen kann.

sx2008 4. Apr 2010 17:28

Re: TFileStream Speichern nach Vergrößerung
 
Ich komme hier mal auf den Kernpunkt:
Wie kann man zu einem gegebenen MD5-Hash einen String von vorgegebener Länge finden?
Antwort: Man muss eine MD5-Kollision finden.
Man bezeichnet das auch als "knacken" des MD5 und benötigt
dazu massive Rechenleistung (z.B. 200 * Sony 3 Playstation) sowie tiefere Kenntnisse in Kryptografie.

Fazit: ein Hobbyprogrammierer hat nicht den Hauch einer Chance


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz