Entwickler-Ecke

Dateizugriff - BlockWrite und BlockRead liefern unterschiedliche Ergebnisse


Kay E. - Do 03.03.11 15:04
Titel: BlockWrite und BlockRead liefern unterschiedliche Ergebnisse
Hallo!

Ich muss ein paar Daten meines Programms verschlüsseln. Ich nutze dafür eine einfache XOR verschlüsselung mit festem Key. Das wird in einem File als Bytes gespeichert.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TSystemAdjustmentsForm.Button1Click(Sender: TObject);
var
  ByteFile: file;
  aData, aDataRead: TCryptData;
  vData, vData2: TSystemData;
begin
  vData := FData;
  SetLength(aData, sizeof(TSystemData));
  AssignFile(ByteFile, 'Testfile.txt');
  Rewrite(ByteFile, SizeOf(TSystemData));
  aData := EncryptData(FData);
  BlockWrite(Bytefile, aData, 1);
  CloseFile(Bytefile);


  SetLength(aDataRead, sizeof(TSystemData));
//  AssignFile(byteFile, 'Testfile.txt');
  reset(ByteFile, SizeOf(TSystemData));
  BlockRead(ByteFile, aDataRead[0], 1);
  vData2 := DecryptData(aDataRead);
  CloseFile(ByteFile);
end;


FData ist vom Typ TSystemData, was ein Record mit Integern, Single und von der Größe festgelegten Strings ist. Größe 576 Bytes.
TCryptData ist ein dynamisches array of Byte;
aData und aDataRead haben zwar die selber Länge und in jedem Index steht ein Wert, dieser Wert unterscheidet sich aber teilweise dramatisch. Das die Codierung damit nicht funktioniert und sich dementsprechend vData und vData2 massiv unterscheiden ist auch klar.
Ich bin mir ziemlich sicher, dass die Codierung funktioniert, also die Daten werden zumindest richtig encrypted. Auch wird die richtige Anzahl Bytes in die Datei geschrieben. Es hapert grad nur am Auslesen, da bekomm ich nicht die richtigen Werte wieder zurück.
Was läuft da schief?

Danke schon mal
Grüße Kay


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 03.03.2011 um 14:54


Narses - Do 03.03.11 15:54

Moin!

Also ich habe ehrlich gesagt noch nie mit Blockread/write gearbeitet. Spricht was gehen Suche in: Delphi-Forum, Delphi-Library TFILESTREAM oder überhaupt Streams? :nixweiss: Weil da kann man das Ganze mit dem Verschlüsseln total schön transparent zwischenklemmen [http://www.delphi-forum.de/viewtopic.php?p=563921#563921] und gut ist. :idea: ;)

cu
Narses


Gammatester - Do 03.03.11 16:45

Zu Schreiben nimm 'mal BlockWrite(Bytefile, aData[0], 1);.

Weiter ist zu beachten, daß wenn in Deinem Record zB ein string[20] steht, aber der aktuelle String nur 4 Zeichen hat, später beim Lesen 16 Zeichen/Bytes undefiniert sein können.


jasocul - Do 03.03.11 17:39


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
procedure TSystemAdjustmentsForm.Button1Click(Sender: TObject);
var
  ByteFile: file;
  aData, aDataRead: TCryptData;
  vData, vData2: TSystemData;
begin
  vData := FData; // Wozu die Zuweisung? vData wird nicht weiter verwendet
  SetLength(aData, sizeof(TSystemData));
  AssignFile(ByteFile, 'Testfile.txt');
  Rewrite(ByteFile, SizeOf(TSystemData));
  aData := EncryptData(FData); // Wolltest du hier vielleicht vData verwenden?
  BlockWrite(Bytefile, aData, 1);
  CloseFile(Bytefile);


  SetLength(aDataRead, sizeof(TSystemData));
//  AssignFile(byteFile, 'Testfile.txt');
  reset(ByteFile, SizeOf(TSystemData));
  BlockRead(ByteFile, aDataRead[0], 1);
  vData2 := DecryptData(aDataRead); // Hier könnte ein Fehler sein
  CloseFile(ByteFile);
end;


Du übergibst beim Encrypten einen festen Record und beim Decrypten ein dynamisches Array. Ich vermute den Fehler bei der Übergabe an DecryptData.

Du kannst es aber einfach testen. Lass das En- und Decrypten einfach mal weg und vergleiche die geschriebenen Daten mit den gelesenen. Die sollten ohne diese beiden Routinen identisch sein. Ich kann zumindest keinen Fehler darin finden. Du hast ja sogar daran gedacht, beim BlockRead den Anfang des Arrays zu übergeben.


Kay E. - Do 03.03.11 17:42

Ah, perfekt, mit dem index scheint es zu funktionieren. Was so ein doofer Index alles anrichten kann -.-
Ich hab Blockwrite / -read genommen, weil ich im Internet kurz gegoogelt hab, wie ich Bytefiles speicher. Auf TFileStream bin ich nicht gekommen, da bin ich wohl auf der Leitung gesessen :]
Naja, aber hauptsache, es funktioniert jetzt :) Danke euch beiden!

Grüße Kay

---Moderiert von user profile iconNarses: Beiträge zusammengefasst---

@ Jasocul: Ne, die Fuunktionsparameter sind schon so abgestimmt, das passt. Ich hab zum Testen ja auch extra die lokalen Variablen reingenommen, um sehen zu können, ob die geschriebenen und gelesenen identisch sind. Waren sie aber nicht. Wie gesagt: Mit dem Anfangsindex beim Schreiben klappts auch.
Ach, und noch was: Kanns sein, dass du Hohlbein gelesen hast? ;)

Grüße Kay


jasocul - Do 03.03.11 22:19

user profile iconKay E. hat folgendes geschrieben Zum zitierten Posting springen:

Ach, und noch was: Kanns sein, dass du Hohlbein gelesen hast? ;)

Wie kommst du denn nur auf diese Idee? :mrgreen: