Delphi-PRAXiS
Seite 4 von 7   « Erste     234 56     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)

negaH 4. Feb 2008 14:03

Re: DEC 5.1 wie benutzen?
 
@Jargos:

bei ADest.WriteBuffer(Salt[1], Length(Salt)); in Encrypt() kannst du vor oder danach eigene Daten abspeichern. Die musst du natürlich in Decrypt() auch wieder rauslesen. Also eigene Datenmenge abspeichern und exakt gleiche Datenmenge vor dem Entschlüsseln wieder rauslesen. Du musst nur die TStream basierten Prozeduren abändern.

Gruß Hagen

PS: beachte das diese Daten dann unverschlüsselt sind. Möchtest du dies nicht dann kannst du auch ein zweifaches .EncodeStream(ASource, ADest,..) einbauen. das ginge dann so

Delphi-Quellcode:

with ...Create do
try
  ...blabla Init Sequenz

  SetLength(AData, Cipher.Context.BufferSize * x);
  AData := EncodeBinary(AData, TFormat_COPY);
  ADest.WriteBuffer(AData[1], Length(AData));
  EncodeStream(ASource, ADest, ....);
finally
  Free;
end;
Nur musst du beachten das die Anzahl an Bytes in AData exakt ein Mehrfaches der Cipher.BufferSize sind um ein vorzeitiges Padding zu vermeiden. Du verschlüsselt als so als wenn in ASource ein Header von dir vor den eigentlichen Daten drinnenstehen würde.

gammatester 4. Feb 2008 14:20

Re: DEC 5.1 wie benutzen?
 
Zitat:

Zitat von negaH
wenn man den CipherMode cmCTSx/cmCTS8 benutzt kann man am Ende eine CMAC errechnen und abspeichern.

[SNIP]

Am Ende einer Verschlüselung/Entschlüsselung kann man mit Cipher.CalcMAC eine sogenannte Cipher-MAC errechnen und somit auf Datenintegrität testen. Wie oben angedeutet wird sich die so errechnet CMAC komplett unterscheiden wenn nur 1 Datenbit falsch übertragenm wurde. Ok, da die meisten Cipher mit zb. 8 Bytes Feedbackregster arbeiten ist diese CMAC auch meistens nur 64 Bit groß. Das Kollisionsrisiko im Vergleich zu eienr guten Hash-MAC ist also viel größer. Nutzt man aber zb. einen 16 Bytes Blockcipher so ist das identisch mit einer zb. MD5-HMAC. Aber mit dem Unterschied das diese CMAC Berechnung Performancetechnisch schon inklusive ist.

Zuerst war ich verwirrt, weil CMAC das "standardisierte" OMAC1 ist, aber im DEC-Quellcode stehts dann ja drin (wenn man weiß, was man nachsehen soll), und offensichtlich gibts diese "CMAC" praktisch kostenlos für alle Modi bis auf EBC. Wäre doch eine gute Idee für in Luckies Unit, diese Prüfbytes neben Salt und Ciphertext mit abzuspeichern und beim Entschlüsseln zu verifizieren.

Zitat:

Zitat von negaH
Also, das was ich im DEC implementiert habe hat meiner Meinung nach sehr wohl ein kryptographisch sauberes Fundament, ...

Ich habe auch ich nicht unterstellt, daß dem so wäre, und wie man sieht ist ja auch eine Authentizitäts- / Verifikationsmöglichkeit vorhanden, und nur das war ein Punkt meines Beitrags.

Gruß Gammatester

negaH 4. Feb 2008 14:37

Re: DEC 5.1 wie benutzen?
 
;) hey, ich weiß wer du bist und demzufolge weiß ich auch wie du es gemeint hast, ich bin zu keiner Zeit davon ausgegangen das ich mich angegriffen fühlen müsste ;)

Ja, man kann das oben noch einbauen, ginge sogar sehr einfach. Das Thema habe ich aber unter -> Es gibt Verbesserungen und hier in der DP schon als Source zu finden, abgehackt. Ich muß halt immer einen Kompromiß anstreben, zwischen dem was ich hier als Beispiele poste und noch verständlich ist und dem was alles möglich wäre. Kryptographie ist deshalb sicher weil man das bestehende Wissen auch begriffen hat, man weiß es also. Erkläre ich zuviel kann mir keiner mehr folgen und man wird auf gut Glauben das wiederkauen wa ich an Beispielen gepostet habe ohne es verstanden zu haben. Das ist dann keine Kryptographie mehr, leider.

denoch hier die Änderungen mal angedeutet:

Delphi-Quellcode:
procedure Encrypt(ASource, ADest: TStream; ...blabla); overload;
var
  ... blabla
  MAC: Binary;
begin
  with ... do
  try
    ...blabla Initialisierung hier

    EncodeStream(ASource, ADest, -1);

    MAC := CalcMAC(TFormat_COPY);
    ADest.WriteBuffer(MAC[1], Length(MAC));
  finally
    Free;
    ....bla
    ProtectBinary(MAC);
  end;
end;

procedure Decrypt(ASource, ADest: TStream; ...blabla); overload;
var
  ... blabla
  MAC: Binary;
begin
  with ... do
  try
    ...blabla Initialisierung hier

    DecodeStream(ASource, ADest, ASource.Size - ASource.Position - BufferSize);

    SetLengh(MAC, BufferSize);
    ASource.ReadBuffer(MAC[1], Length(MAC));
    if MAC <> CalcMAC(TFormat_COPY) then
      raise Exception.Create('invalid decryption data maybe modifyed or please verify your password');
  finally
    Free;
    ....bla
    ProtectBinary(MAC);
  end;
end;
ABER VORSICHT! Die Berechnung der CMAC hängt stark vom verwendeten Ciphermode ab. Im Grunde ist diese CMAC nur dann aussagekräftig wenn im cmCTS?/cmCFS? Modus gearbeitet wird. Im cmCBCx Modus kann man eine CMAC berechnen lassen nur wird diese auf Grund der Selbstsynchronisation des CBC Modus eben nicht aussagekräft sein.
Der cmCTS?/cmCFS? Modus enthält quasi einen Lawineneffekt. Ein falsches Bit lösste eine Lawine aus die alle nachfolgenden Bits verändert, bis zum Ende der Verschlüsselung und der Berechnung des CMAC. Die Selbstsynchrnisation ist zerstört dafür ergibt sich quasi sowas wie eine Prüfsumme über alle Datenbits. Dies trifft aber auf alle selbstsynchronisierenden Modis nicht zu.

So. Und wieder die Verständlichkeit dieses Threades verschlechtert ;)

Gruß Hagen

delphin06 4. Feb 2008 16:36

Re: DEC 5.1 wie benutzen?
 
Ich möchte hier kurz nochmal was anderes einwerfen und zwar bekomme ich bei Delphi 2007 sehr viele Warnungen:

Delphi-Quellcode:
[DCC Warnung] DECData.pas(3948): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3948): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3949): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3949): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3950): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3951): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3951): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3951): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3952): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3952): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3954): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3954): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3954): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3954): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3955): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3955): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3957): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3957): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3958): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3958): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3958): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3958): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3959): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3959): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3959): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3962): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3962): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3963): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3963): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3963): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3963): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3964): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3964): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3964): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECData.pas(3964): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2128): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2130): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2133): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2134): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2168): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2170): W1012 Konstantenausdruck verletzt untere Grenzen
[DCC Warnung] DECHash.pas(2172): W1012 Konstantenausdruck verletzt untere Grenzen
Ich weiß nicht ob die schlimm sind, deshalb möchte ich nur mal eben nachfragen. Ich hab es immer lieber, wenn gar keine Warnungen auftreten.

negaH 4. Feb 2008 17:17

Re: DEC 5.1 wie benutzen?
 
In den Projektoptionen -> Compiler -> alle Laufzeitfehlerüberprüfungen wie RangeChecks usw. ausschalten. Das sollte Standard sein. Die gemeldeteten "Fehler" sind in Wahrheit keine, dh. alles ist richtig. Man könnte jetzt im Projekt/Units selber diese Überprüfungen per Compilerswitches deaktivieren, aber auch das hat Nachteile.

Also {$R-} am Anfang der Units einfügen oder alternativ in Ver.inc diesen Switch aufnehmen um damit in allen DEC Units diese Überprüfung auszuschalten.

Gruß Hagen

delphin06 4. Feb 2008 17:22

Re: DEC 5.1 wie benutzen?
 
OK, Danke.

jorgos 5. Feb 2008 09:09

Re: DEC 5.1 wie benutzen?
 
Hallo zusammen,

erstmal Danke für die Tipps.
Ich habe so einigermaßen umgesetzt, was ich wollte.

Delphi-Quellcode:
Adata := 'teststring123';
....
ADest.WriteBuffer(Salt[1], Length(Salt));
EncodeStream(ASource, ADest, -1, AProgress);

...
ADest.WriteBuffer(Adata[1], Length(Adata));
....
Hier schaffe ich es, die Daten ans Ende der Datei anzuhängen.
Ist im Klartext (Erstmal egal).

Aber wie schaffe ich es, diese Daten beim decodieren wieder auszulesen.
Bin bei allen Versuchen gescheitert.

Delphi-Quellcode:
... habe hier versucht am Ende der Datei + lenge adata, die Daten auszulesen.
ASource.ReadBuffer(adata[1], Length(Salt) + length(adata));
form1.Label1.Caption := adata;
Aber das geht nicht (werdet ihr schon gesehen haben :oops: )

Hat jemand noch einen Wertvollen Tipp für mich

Würde mich freuen.
Vielen Dank nochmal
Jorgos

Luckie 5. Feb 2008 09:17

Re: DEC 5.1 wie benutzen?
 
Du musst natürlich zu erste an die Stelle in der Datei springen, an der sich die Daten befinden. Deswegen ist es günstiger diese Daten an den Anfang der Datei zu schreiben. Da kannst du sie einfach lesen und wenn du sie gelesen hast, kannst du einfach den Rest lesen, ohne den Dateizeiger hin und her bewegen zu müssen.

negaH 5. Feb 2008 10:51

Re: DEC 5.1 wie benutzen?
 
Nicht nur das sondern du musst auch die Größe in Bytes deiner AData mit speichern. Wenn AData also in der Länge variable sein kann dann kannst du diese nur exakt wieder auslesen wenn du deren vorherigen Länge weist. Es sei denn AData hat immer die gleiche Länge, dann kannst du das hardcoded machen, quasi wie im Beispiel mit dem Salt.

Gruß hagen

jorgos 5. Feb 2008 15:47

Re: DEC 5.1 wie benutzen?
 
Yepp,
das war´s.
Habe alle Info´s, die ich brauche.
Danke an alle.

Jorgos


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:30 Uhr.
Seite 4 von 7   « Erste     234 56     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