Autor Beitrag
Kay E.
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: Do 03.03.11 15:04 
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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: 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 und gut ist. :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Gammatester
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 328
Erhaltene Danke: 101



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Do 03.03.11 17:39 
ausblenden 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. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 118



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: 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: