Delphi-PRAXiS
Seite 1 von 7  1 23     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DEC 5.1 wie benutzen? (https://www.delphipraxis.net/107798-dec-5-1-wie-benutzen.html)

delphin06 2. Feb 2008 11:40


DEC 5.1 wie benutzen?
 
Hallo

Ich möchte gerne ein listview verschlüsselt abspeichern. Ich hab dann hier im Forum das DEC von Hagen gefunden. Allerdings wird hier viel nur mit der älteren Version beschrieben. Also ich habe mal die Unit DECCipher eingebunden und habe dan uch 2 passende Funktionen für meinen anwendungsfall gefunden und zwar EncodeStream und DecodeStream.
Allerdings verstehe ich nich was das alles für Parameter sind. Ich muss ja erstma den key initialisieren mit init()

Meine Frage ist nun, was bedeuten die Parameter

von init():
Delphi-Quellcode:
const Key; Size: Integer; const IVector; IVectorSize: Integer; IFiller: Byte = $FF
und von decode/encode:
Delphi-Quellcode:
const Source, Dest: TStream; const DataSize: Int64; const Progress: IDECProgress = nil
Ich hoffe mir kann jemand helfen. ich weiß einfach nich was ich da eintragen soll.

Gruß

Luckie 2. Feb 2008 11:53

Re: DEC 5.1 wie benutzen?
 
Ich arbeite gerade an einer Unit mit Hagen zusammen, die zeigt wie man das DEC richtig benutzt um eine Datei zu verschlüsseln. Mal sehen, eventuell bekomme ich das dieses Wochenende noch fertig.

delphin06 2. Feb 2008 12:06

Re: DEC 5.1 wie benutzen?
 
Das wäre ja super! Weil mir fehlt da irgendwie de vorgehensweise, was ich alles aufrufen muss und wozu

delphin06 2. Feb 2008 14:32

Re: DEC 5.1 wie benutzen?
 
ich hab mir mal das filecrypt beispiel angeguckt von jus.

Jez hab ich versucht das n bisschen abzuändern, dass anstatt einer Datei direkt ein Stream verwendet wird. Aber irgendiwe klappt das nich. Da kommt dann ein Fehler mit der Meldung "Stream-Lesefehler" und der tritt in der procedure:

Delphi-Quellcode:
procedure TDECCipher.EncodeStream(const Source, Dest: TStream; const DataSize: Int64; const Progress: IDECProgress);
begin
  DoCodeStream(Source, Dest, DataSize, Context.BlockSize, Encode, Progress);
end;
auf.

Hier mal meine abgeänderte version:
Delphi-Quellcode:
procedure EncodeMStream(const ADestFilename: String; const APassword: Binary;
                       ACipher: TDECCipherClass = nil; AMode: TCipherMode = cmCTSx;
                       AHash: TDECHashClass = nil);
 var
  Dest: TStream;

  procedure Write(const Value; Size: Integer);
  begin
    Dest.WriteBuffer(Value, Size);
  end;

  procedure WriteByte(Value: Byte);
  begin
    Write(Value, SizeOf(Value));
  end;

  procedure WriteLong(Value: LongWord);
  begin
    Value := SwapLong(Value);
    Write(Value, SizeOf(Value));
  end;

  procedure WriteBinary(const Value: Binary);
  begin
    WriteByte(Length(Value));
    Write(Value[1], Length(Value));
  end;

var
  Sourcestr: TMemoryStream;
  Seed: Binary;
begin
  {if ASourceFileName=ADestFilename then
  begin
    showmessage('Source file and destination file must not be equal!');
    exit;
  end; }
  ACipher := ValidCipher(ACipher);
  AHash := ValidHash(AHash);
  Seed := RandomBinary(16);
  //Source := TFileStream.Create(ASourceFileName, fmOpenReadWrite);
  Sourcestr:=TMemorystream.Create();
  try
    sourcestr.WriteComponent(Form1.listview1);
    Dest := TFileStream.Create(ADestFilename, fmCreate);
    try
      with ACipher.Create do
        try
          Mode := AMode;
          Init(AHash.KDFx(APassword, Seed, Context.KeySize));

          WriteLong(Identity);
          WriteByte(Byte(Mode));
          WriteLong(AHash.Identity);
          WriteBinary(Seed);
          WriteLong(Sourcestr.Size);
          EncodeStream(Sourcestr, Dest, Sourcestr.Size);
          WriteBinary(CalcMAC);
        finally
          Free;
        end;
    finally
      Dest.Free;
    end;
      //ProtectStream(Source);
  finally
    Sourcestr.Free;
  end;
  //DeleteFile(AFileName);
end;
Was habe ich falsch gemacht?

negaH 2. Feb 2008 19:32

Re: DEC 5.1 wie benutzen?
 
Wenn du in einen leeren Stream zb. 1024 Bytes geschrieben hast, wo steht dann der Stream.Position ? Bei 1024 richtig.
Wenn du nun anschließend aus dem Stream was lesen möchtest un Stream.Position = Stream.Size wieviele Bytes kann man dann noch aus dem Stream lesen ? Ah, garkeine da man ja am Ende des Streams ist, richtig.

Delphi-Quellcode:
SourceStr.WriteComponente(blabla)
if SoureStr.Position = SourecStr.Size then
  ShowMessage('Ähm, wenn du nachher mit SourceStr.Read() was lesen möchtest dann solltest du auch SourceStr.Positon := 0 aufrufen');
Also Stream.Position :=0; bevoir du versucht wieder aus dem Stream zu lesen.

einen Stream verschlüsseln auf einfachste Weise
Delphi-Quellcode:
with TCipher_Rijndael.Create do              // Cipher erzeugen
try
  Init('Passwort');                          // mit Passwort initialisieren
  EncodeStream(SourceStream, DestStream, -1); // Stream verschlüssen
finally
  Free;                                      // Cipher freigeben
end;
Beachte das obiges Beispiel die Minimalkonfiguration darstellt, man kann es aus Sicht der Kryptographie noch besser=sicherer machen.

Gruß Hagen

PS: gewöhne dir an deutsch zu schreiben, ich weiß es ist schwer auf modischen Schnickschnack zu verzichten besonders wenn man bischen extrovertiert erscheinen möchte und sein "Image" aufbauen möchte. Aber ansonsten antworte ich einfach nicht mehr ;)

delphin06 3. Feb 2008 10:09

Re: DEC 5.1 wie benutzen?
 
Zitat:

Zitat von negaH
PS: gewöhne dir an deutsch zu schreiben, ich weiß es ist schwer auf modischen Schnickschnack zu verzichten besonders wenn man bischen extrovertiert erscheinen möchte und sein "Image" aufbauen möchte. Aber ansonsten antworte ich einfach nicht mehr ;)

OK. Ich werde es versuchen^^ Aber ehrlich gesagt weiß ich nicht was du für ein Problem hast.

Ich danke dir für deine Hilfe! Damit kann ich schonmal was anfangen. Ich habe noch nicht allzu viel mit Streams gearbeitet.

Aber eine Frage habe ich nochmal:
1. Was bedeutet das "-1" in der Zeile
Delphi-Quellcode:
EncodeStream(SourceStream, DestStream, -1);


Gruß

[EDIT] Ich habe jetzt wie du gesagt hattest die Stream Position vorher auf 0 gesetzt und das funktioniert jetzt wunderbar. Nochmal RIESEN Dankeschön! Genauso sollte das funktionieren. Der obere Code ist natürlich besser als die Minimalkonfiguration, weil da kann ich auch prüfen ob das Passwort richtig ist.

negaH 3. Feb 2008 12:07

Re: DEC 5.1 wie benutzen?
 
Zur Beantwortung deiner Frage würde ich die Unit DECCipher.pas öffnen und im Interfaceteil der Unit nach der Deklaration von TDECCipher.EncodeStream() suchen.

Du findest dann das hier

Delphi-Quellcode:
   
procedure EncodeStream(const Source, Dest: TStream; const DataSize: Int64; const Progress: IDECProgress = nil);
Danach würde ich in die Implementierung dieser Funktion gehen und du findest den Aufruf der internen Procedure DoCodeStream(). Diese Proc ist in Pascal geschrieben und damit eigentlich auch lesbar ;)

DataSize bezeichnet also die Anzahl an Bytes die aus Stream "Source" nach "Dest" verschlüsselt werden sollen. Man kann mit DEC's Streamfunktionen, bzw. eigentlich mit fast allen Streamfunktionen die halbwegs logisch aufgebaut sind, auch nur Teile einen Streams verschlüsseln. Zb. man ver-entschlüsselt ab dem 1000 Bytes eines Streams nur 100 Bytes nach Dest. Dazu wird Stream.Position benutzt.

Wenn man zb. ab .Position := 1000 alles bis .Size = 1500 aus einem TFileStream verschlüsseln möchte müsste man es so aufrufen:

Delphi-Quellcode:
  Source.Position := 1000;
  EncodeStream(Source, Dest, Source.Size - Source.Position);
Das Subtrahieren von .Size - .Position verlangt aber beim TFileStream ständige Aufrufe von .Seek(). Nun Seek() wiederum nutzt das Windows-FileAPI und das ist speziell bei .Seek() arsch langsam. Dh. wenn man Dateioperationen möglichst schnell haben möchte dann sollte man die Aufrufe von .Size und .Position reduzieren und optimieren.

Nun der Aufruf von

Delphi-Quellcode:
  Source.Position := 1000;
  EncodeStream(Source, Dest, -1);
ist identisch zu obigem Aufruf, spart aber zwei Aufrufe von .Seek() da wir .Size und .Position nicht mehr aufrufen.

Die -1 bedeutet also: ver/entschlüssele alles von der aktuellen .Position bis zum Ende des Stream's = .Size.

Zudem fängt es Fehler ab. Wenn zb. Source.Positon und/oder Soure.Size vom Programierer in lokalen Variablen selber berechnet wird (siehe meine Implementation von DoCodeSream) und dabei aber falsch berechnet wurde so das Position > Size wäre so ergibt sich ein negativer Wert von DataSize. In diesem Falle fängt das DoCodeStream() ab und berechnet selber die Anzahl an Bytes von .Position bis .Size des Streams.

Gruß Hagen

negaH 3. Feb 2008 12:27

Re: DEC 5.1 wie benutzen?
 
Zitat:

OK. Ich werde es versuchen^^ Aber ehrlich gesagt weiß ich nicht was du für ein Problem hast.
Ich habe ansich kein Problem. Nur vertrete ich die Meinung das wir Deutschen in unserer Sprache ständig irgendwelchen Modetrends bzw. absichtlich geschaffenen Wortschöpfungen der kommerziellen Industrie nachrennen. Das erfolgt ohne plausiblen Grund, besonders weil die deutsche Sprache eine sehr präzise und schöne Sprache ist. Im Umkehrschluß, meine Meinung zur Realität, ergibt sich für mich daraus eine Handlungsanweisung: nämlich kämpfe aktiv gegen solche Unsitten. Da Du der Fragende bist und ich der potentiell beste Antworter für deine Frage, habe ich die Möglichkeit indirekt Druck auf dich auszuüben, und das mache ich auch. Denn ich möchte das wir in 50 Jahren auch noch gutes Deutsch reden können. Denn die Sprache ist es die unsere Denkweise und Kommunikationsform untereinander definiert, ändert man die Sprache nach rein kommerziellen oder nach irgendwelchen Harlemgang Slang so ändert man die Denkweise der Menschen. Das möchte ich nicht und so kämpfe ich dagegen.

Zudem definiert sich die Gesamtqualität der Delphi Praxis eben auch gerade über die benutzte Sprache und der zwischenmenschliche Umgangston. Je besser dieser ist desto höher ist die Wahrscheinlichkeit das in Fragen Delphi/Pascal die Delphi Praxis im deutschsprachigen Raum die Nase vorne hat.

Ich möchte also verhindern das immer mehr Leute hier deinen Jargon nachahmen, bzw. an Hand dieses Threads erkennen können, wie ich gerne reden möchte.

Aus meiner Sicht handelst du also egoistisch: du stellst deine Frage in deinem Slang und erwartest das dir speziell auch geantwortet wird und damit auch geholfen wird. Andere Hilfesuchende mit dem gleichen Problem sprechen nicht deine Sprache und somit wäre dieser Thread auch für diese Leute wenig hilfreich. Du bist der Hilfesuchende und ich stelle klar das du es bist der sich an den potentiell Antwortenden anpassen musst, nicht umgekehrt. Es ist meine Zeit die ich verschwende um deine Probleme zu lösen, und wenn du dann noch im Slang redest verlangst du von mir das ich das in mein Deutsch übersetzen soll. Im Grunde also unverschämt von dir.

Ich bin also nur ehrlich und offen zu dir und sage dir direkt was ich an Konsequenzen zu ziehen bereit sein werde. Ich könnte auch einfach meine Zeit anders nutzen und lasse dich mit deiner Frage im Stich. Dann würdest du irgendwann schon von selber merken das irgendwas nicht stimmt, da du nämlich Zeit verlierst, und änderst dich dann doch. Du würdest dich also selber anpassen und verändern in deiner Sprache und schwups wird dir auch wieder geholfen. Du als Fragender hast also im Grunde die Pflicht deine Fragen so zu formulieren das ein Antwortender dir schnell helfen kann, ansonsten antwortet dir eben keiner Ergo: mit deinem Slang schiesst du dir in's eigene Knie.

Gruß Hagen

[edit]
Das es nun konkret dich getroffen hat ist -> Pech gehabt ;)
[/edit]

DeddyH 3. Feb 2008 12:32

Re: DEC 5.1 wie benutzen?
 
Gut gebrüllt, Löwe :thumb:

juergen 3. Feb 2008 13:07

Re: DEC 5.1 wie benutzen?
 
Die Argumentation von negaH gefällt mir sehr gut! :thumb:
Ich hoffe nicht nur mir ist in letzter Zeit die Gleichgültigkeit der Mitglieder aufgefallen, wenn man sie daraufhin anspricht.
So ganz nach dem Motto: ist halt Chat-Sprache...Müsst ihr alle damit leben.
Das Delphipraxis Forum ist eben kein Chat! (Chatfunktion wäre sogar vorhanden, hat aber nichts mit den öffentlichen Threads zu tun)

Ich denke auch, dass die darauf angesprochenen Leute nicht vorsätzlich so handeln ,
sie sind sich ihrer verwendeten was-auch-immer-Sprache leider nicht bewusst, weil anscheinend im tägl. Umfeld nur so geschrieben wird.

Beleidigte Reaktionen sind dann aber falsch, schließlich möchte der Threadsteller ja etwas.
Und viele Mitglieder hier sind bereit da auch Zeit zu investieren und zu helfen.

Die Eigenschaft OBJEKTIV mit Kritik umzugehen ist ein wesentlicher Faktor zur persönlichen Weiterentwicklung.
[/mein Wort zum Sonntag]


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:30 Uhr.
Seite 1 von 7  1 23     Letzte »    

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