Blowfish Stream Cypher und wahlfreier Zugriff

Rund um die LCL und andere Komponenten
Antworten
Nimral
Beiträge: 390
Registriert: Mi 10. Jun 2015, 11:33

Blowfish Stream Cypher und wahlfreier Zugriff

Beitrag von Nimral »

Hi allseits,

ausnahmsweise habe ich mal kein Problem, sondern eine Lösung, bin mir aber nicht sicher, ob die Lösung kein Problem macht, weil ich eigentlich ein Problem erwartet hatte.

Die Fragestellung taucht auf, weil ich ein Programm, das bisher als "File of TDataRec" definiert war, auf Streams umbauen möchte, Erschwerend kommt hinzu, dass der Datenstrom mit Blowfish verschlüsselt ist.

Ich arbeite im Moment mit folgender Annahme:

die Verschlüsselung verschlüsselt einen bestimmten Record immer gleich, unabhängig davon wo er im Datenstrom steht.

Ein Beispiel, paar Fetzen aus dem Programm, ausgehend von einer Liste (z.B. einem Array of TDataRec) im Speicher:

Code: Alles auswählen


var
   DataArray : Array of TDataRec;

Procedure SaveAll

var
  FileStream: TFileStream;
  EncryptStream: TBlowFishEncryptStream; 
  
...

      FileStream := TFileStream.Create(FilePath, fmOpenWrite);
      EncryptStream := TBlowFishEncryptStream.Create(ENCRYPTKEY, FileStream); 

      for i := Low(DataArray) to High(DataArray) do
         BlowFishEncryptStream.WriteBuffer(DataArray[i],SizeOf(TDataRec))
   
...

Procedure SaveRec(r:TDataRec,ndx:Integer);

var
  FileStream: TFileStream;
  EncryptStream: TBlowFishEncryptStream; 

...

      FileStream := TFileStream.Create(FilePath, fmOpenWrite);
      EncryptStream := TBlowFishEncryptStream.Create(ENCRYPTKEY, FileStream); 

      FileStream.Seek(ndx*SizeOf(TDataRec));
      BlowFishEncryptStream.WriteBuffer(DataArray[i],SizeOf(TDataRec))      
   
Ich habe das Ganze als Testaufbau in das alte Programm hineinimplantiert, und es scheint zu funktionieren. Ein bestimmter Record wird offenbar immer gleich verschlüsselt, egal ob ich ihn zusammen mit allen Anderen schreibe, oder ob ich nur den einen Record an seine Position schreibe. Das Endergebnis auf der Platte scheint beide Male gleich zu sein, sagt mein Hex-Editor. Ich finde das andererseits ein wenig verdächtig. Irgendwie hätte ich erwartet, dass die Verschlüsselung einen bestimmten Record, sprich ein paar Bytes im Datenstrom, anders verschlüsselt, wenn vor ihm bereits andere Bytes im selben Strom verschlsselt wurden. Dann würden die verschlüsselten Bytes für sagen wir mal Record 2 bei SaveAll anders aussehen (da vor ihm im selben Strom schon Record 1 durch die Verschlüsselung gejagt wurde) als bei SaveRec, wo die Verschlüsselung am ersten Byte des zu schreibenden Records aufsetzt.

Dem scheint aber nicht so zu sein. Baue ich z.B. das Array mit 5 identischen Records auf, und schreibe ich das gesamte Array mit SaveAll weg, sehe ich im Hex-Editor auch 5 Mal hintereinander den selben Byte-Haufem in der Datei.

Habe ich das richtig beobachtet, und kann ich mich auf dieses Verhalten denn verlassen? Ich meine, es kommt mir im Moment gelegen, weil ich dadurch nur wenig ändern muss an der Datenzugriffsschicht meiner "Altlast", aber andererseits ... von einer Verschlüsselung, die nach wie vor als sehr gut gehandelt wird, hätte ich schon erwartet, dass gleiche Daten, die an verschiedenen Stellen im Datenstrom auftauchen, verschieden verschlüsselt werden.

Was meint ihr dazu?

Armin.



Ich hoffe, ich konnte mich halbwegs verständlich ausdrücken. Wie gesagt, mein Testprogramm funktioniert. Ich traue der Sache aber nicht ganz.

Benutzeravatar
Aidex
Beiträge: 60
Registriert: Do 24. Sep 2020, 07:02
OS, Lazarus, FPC: Win10 64bit, Laz v2.0.10
CPU-Target: AMD64

Re: Blowfish Stream Cypher und wahlfreier Zugriff

Beitrag von Aidex »

Hi!
Bei dem was du beschreibst, vermute ich, dass TBlowFishEncryptStream bei jedem WriteBuffer() dieses Datenpäcken sofort verschlüsselt und einfach anhängt.
D.h. nicht der gesamte Stream wird als Ganzes verschlüsselt, sondern nur Write-weise.
Würde man den gesamten Stream als Ganzes verschlüsselt haben wollen, müsste man alle Daten wohl zuvor in einem unverschlüsselten Stream sammeln und dann einmal komplett schreiben.
Danach lässt es sich dann aber nicht mehr Record-weise lesen, außer wenn es man zuvor die gesamte Datei an einem Stück entschlüsselt.

Für dein Projekt mit den Records hast du dann ja Glück gehabt.
Aber sicherer wäre es natürlich, wenn jeder Record entweder mit der Gesamtdatei verschlüsselt wäre oder man für jeden Record-Einzelzugriff einen anderen, mutierten Schlüssel benutzen würde.

Antworten