AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Datei stückchenweise mit TFileStream einlesen
Thema durchsuchen
Ansicht
Themen-Optionen

Datei stückchenweise mit TFileStream einlesen

Ein Thema von Luckie · begonnen am 3. Okt 2003 · letzter Beitrag vom 4. Okt 2003
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 03:03
Und genau das sind meine zwei andern Probleme: Es müßte gehen und ich verstehe nicht, warum es nicht geht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 03:06
Moin Luckie,

bekommst Du wirklich bei SrcStream.Read den Fehler?

Wie sieht die Routine denn bei Dir aus.
Am Besten incl. Datendeklaration, und Dateigrösse (genau)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 03:16
Jupp, ich bekomme einen. Deklarationen wie gehabt (siehe oben). UInd ausgesehen hat sie wie von Kamil gepostet. Dateigröße: 49.955.924 Bytes. GetMem habe ich auch aufgerufen.

Keinen Plan. Habe es aber schon wieder rückgängig gemacht.

Wenn ich die if-Konstruktion nehme und statt 1024 2048 oder 4096 einsetze, bekomme ich eine AccessViolation zum Schluß.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#14

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 11:31
Delphi-Quellcode:
var
  Len: integer;
  Buffer: array[0..1023] of Byte;
  ...
begin
...
  while SrcStream.Position < SrcStream.Size do
  begin
    Len := SrcStream.Size - SrcStream.Position;
    if Len > SizeOf(Buffer) then Len := SizeOf(Buffer);
    SrcStream.Read(Buffer, Len);
    EncodeBuffer(Buffer, Buffer, Len);
    DestStream.WriteBuffer(Buffer, Len);
  end;
...
Wichtig! EncodeBuffer() sollte nach Möglichkeit inplaced arbeiten.

oder
Delphi-Quellcode:
var
  Len: integer;
  Buffer: array[0..1023] of Byte;
  ...
begin
...
  repeat
    Len := SrcStream.Read(Buffer, SizeOf(Buffer)); // .Read statt .ReadBuffer um Exceptions zu vermeiden
    EncodeBuffer(Buffer, Buffer, Len);
    DestStream.WriteBuffer(Buffer, Len);
  until Len = 0;
...
end;
Dies vermeidet die Seek-Aufrufe in den Dateistream durch das OS um .Position und .Size zu berechnen. Dadurch wird also der Dateistream nur sequentiell gelesen und dies ist erheblich schneller !! Probier es aus mit großen Files.

Gruß Hagen
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 12:01
Geil. Werde ich gleich ausprobieren. Besten Dank.

PS: Steht das im DEC irgendwo, dass EncodeBuffer inplaced arbeiten sollte? Oder ist das allgemeines Kryptologiewissen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 12:14
So jetzt haben wir den Salat, jetzt bekomme ich unterschiedliche Hash-Werte nach dem Entschlüsseln und die entschlüsselte Datei ist dann natürlich nicht zu gebrauchen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 12:18
Entschlüsseln:
Delphi-Quellcode:
          // ignore the file header
          SrcStream.Seek(sizeof(TFileHeader), soFromBeginning);
          // assign the Cipherclass
          CipherClass := Cipher;
          // prepare for decoding
          with CipherClass.Create(PW, nil) do
          begin
            Mode := cmCFB;
            InitKey(PW, nil);
            // as long as we have not reached the end of the source stream
            repeat
              Len := SrcStream.Read(Buffer, SizeOf(Buffer));
              EncodeBuffer(Buffer, Buffer, Len);
              DestStream.WriteBuffer(Buffer, Len);
            until Len = 0;
          end;
Verschlüsseln:
Delphi-Quellcode:
          // write the head into the stream
          DestStream.Write(FileHeader, sizeof(TFileHeader));
          // prpare vor encoding
          with CipherClass.Create(PW, nil) do
          begin
            Mode := cmCFB;
            InitKey(PW, nil);
            // as long as Len has something to read
            repeat
              Len := SrcStream.Read(Buffer, SizeOf(Buffer));
              EncodeBuffer(Buffer, Buffer, Len);
              DestStream.WriteBuffer(Buffer, Len);
            until Len = 0;
          end;
Was habe ich übersehen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#18

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 12:38
Zitat:
Steht das im DEC irgendwo, dass EncodeBuffer inplaced arbeiten sollte? Oder ist das allgemeines Kryptologiewissen?
Das steht nicht im DEC, du weisst DEC ist NUR eine Sammlung von effizient programmierten Algorithmen.

Wird inplaced gearbeitet so werden die Daten im Buffer implizit mit deren verschlüsseltem Produkt überschrieben. Da .EncodeBuffer() nicht wissen kann ob der Anwender seine Daten geschützt haben will darf .EncodeBuffer() auch nicht den Sourcebuffer von sich aus mit Müll füllen. Dies müsste dann schon deine Funktion machen damit eben keine sicherheitsrelevanten Daten im Speicher verbleiben. Übrigens: dies ist auch der Grund warum ich den Buffer NICHT dynamisch alloziere sondern im Stack ablege. Bei dynamischen Speicher müsstest du wiederum dafür Sorge tragen das er wiped wird. Im Stack wird mit enorm hoher Wahrscheinlichkeit der Stackspeicher durch nachfolgende Funktionen nochmals überschrieben. Geht man davon aus das es heute Techniken gibt die aus benutzten Speicherzellen denoch deren Inhalt vor 100 Schreibänderungen ermitteln können, so wird klar das der Stack zB. einer der Speicherbereiche ist der die meisten Schreibänderungen hat.
Die Lebenszeit der sichertsrelevanten Daten bei inplaced Codierungen ist die kürzt mögliche.
Das Tracen des Stackes ist eine der schwierigsten Operationen eines guten Debuggers.
All diese Überlegungen kann ein Programmierer ohne viel Aufwand umsetzen um seine Kryptofunktionen sicherer zu machen.

Zitat:
So jetzt haben wir den Salat, jetzt bekomme ich unterschiedliche Hash-Werte nach dem Entschlüsseln und die entschlüsselte Datei ist dann natürlich nicht zu gebrauchen.
Ich habe deinen Source noch nicht genauer analysiert. Es ist aber wichtig das der Stream-Dateizeiger korrekt repositioniert wird. Also, nach Hash.CalcStream(Stream) muß Stream.Position := 0 gesetzt werden. Dies ist ein häufig gemachter Anfängerfehler den ich hier nur erwähne weil auch Profi's wie du ihn von Zeit zu Zeit mal machen


Gruß hagen
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#19

Re: Datei stückchenweise mit TFileStream einlesen

  Alt 4. Okt 2003, 12:43
Zitat:
Was habe ich übersehen?
Zitat:
Verschlüsseln ..... EncodeBuffer()
Zitat:
Entschlüsseln ..... EncodeBuffer()
Hm, irgendwas stimmt da aber nicht ?

Gruß Hagen
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 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