AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

DEC 5.1 wie benutzen?

Ein Thema von delphin06 · begonnen am 2. Feb 2008 · letzter Beitrag vom 23. Nov 2008
Antwort Antwort
Seite 5 von 7   « Erste     345 67   
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#41

Re: DEC 5.1 wie benutzen?

  Alt 9. Feb 2008, 18:13
Ich habe nochmal eine kleine Frage zur Verschlüsselung mit DEC. Und zwar wollte ich fragen wie man das machen würde, wenn man anstatt einem Passwort zum Verschlüsseln eine Datei benutzt. Also ein "Keyfile" sozusagen, wie es bei TrueCrypt der Fall ist. TrueCrypt liest ja ein paar Bytes vom Anfang der Datei und verschlüsselt dann damit. Kann man das mit DEC auch machen, dass man ein Stream von einer Datei öffnet (bestimmte länge vom Anfang) und dann dies als Passwort übergibt?
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: DEC 5.1 wie benutzen?

  Alt 10. Feb 2008, 02:34
Ja geht, allerdings auf Umwegen

1.) Datestream öffnen
2.) einen TMemoryStream erzeugen und die Bytes aus dem Dateistream lesen
3.) .Init(MemoryStream.Memory^, MemoryStream.Size); aufrufen

Aber Vorsicht! Diese Methode muß sehr genau überlegt sein. Besser ist es mit zb. THash_SHA1.CalcFile(KeyFileName, TFormat_Copy) erstmal nur einen digitalen Fingerabdruck der Schlüsseldatei zu erzeugen. Dieser 160 Bit Wert wird dann mit Hilfe einer KDF und einem Zufallssalt in einen Sessionkey umgewandelt. Benutzt du direkt den Inhalt einer beliebigen Datei als Passwort so ist die Wahrcheinlichkeit sehr hoch das du schlechte Schlüssel erzeugst. Denn viele Dateien enthalten zb. große Datenbereiche die zb. nur aus Nullen bestehen, deren Inhalte auf Grund von Headern quasi bekannt sind und somit erraten werden können. Die Entropie solcher Dateien muß also komprimiert werden, am besten mit einer Hash Funktion. Es sei denn diese Schlüsseldatei wurde mit echten Zufall befüllt. Nur ist dann der Sinn das der Anwender sich eine beliebige Datei auf seinem Rechner als Schlüsseldatei auswählt, und so nur deren Location merken muß, fraglich.

Also besser wäre es wenn du obige Funktionen von mir so aufrufen würdest:

Encrypt(bla,bla, THash_SHA256.CalcFile(KeyFileName, TFormat_Copy));

Gruß Hagen
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#43

Re: DEC 5.1 wie benutzen?

  Alt 10. Feb 2008, 13:03
OK danke! Werde ich mal versuchen.
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#44

Re: DEC 5.1 wie benutzen?

  Alt 21. Feb 2008, 18:28
Ich wollte jetzt nicht wieder einen extra Thread aufmachen, also frag ich einfach nochmal hier nach.

Erstmal muss ich sagen das DEC ist einfach super! Gut das es Leute gibt die sich die Arbeit machen und sowas zusammenstellen.


Ich habe allerdings nochmal eine Frage. Und zwar rufe ich die decrypt-function schon in der FormCreate auf. Jetzt bekomme ich allerdings eine Exception von der Funktion:
Delphi-Quellcode:
function DECClassByIdentity(Identity: LongWord; ClassType: TClass): TDECClass;

  function DoFind(Identity: LongWord; ClassType: TDECClass): Boolean;
  begin
    Result := ClassType.Identity = Identity;
  end;

begin
  Result := DECEnumClasses(@DoFind, Pointer(Identity), ClassType);
  if Result = nil then
    raise EDECException.CreateFmt(sClassNotRegistered, [IntToHEX(Identity, 8)]); //Hier die Exception
end;
Die Funktion "DECClassByIdentity" wird ja so ziemlich am Anfang der decrypt-function aufgerufen.

Da muss wohl erst irgendeine Klasse registriert werden, aber welche? Und vor allem wie registriere ich diese.
Vieleicht habe ich ja irgendwas übersehen, aber ich finde den Fehler einfach nicht.

Gruß


[EDIT] Man bin ich ein Trottel!
Ich weiß was ich vergessen hab!

Delphi-Quellcode:
  SetDefaultCipherClass(TCipher_Rijndael);
  SetDefaultHashClass(THash_SHA1);
  IdentityBase := $84485225;
  RegisterDECClasses([TCipher_Rijndael, THash_SHA1]);
ich sollte mir mal angewöhnen erst zu denken und dann zu schreiben
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: DEC 5.1 wie benutzen?

  Alt 21. Feb 2008, 20:01
Delphi-Quellcode:
  SetDefaultCipherClass(TCipher_Rijndael);
  SetDefaultHashClass(THash_SHA1);
  IdentityBase := $84485225;
  RegisterDECClasses([TCipher_Rijndael, THash_SHA1]);
das RegisterDECCasses() kannst du in diesem Falle weglassen, da beide Klassen schon bei SetDefaultCipherClass() und SetDefaultHashClass() automatisch registeriert werden.

Als Alternativ zu RegisterDECCalsses([..]) geht auch der dirkete Aufruf mit

Delphi-Quellcode:
THash_SHA1.Register;
TCipher_Rijndael.Register;
Allerdings benötigt man dies nur wenn man ausgehende von einer Identity, das ist eine Cardinal Zahle die Eindeutig zur DEC Klasse sein sollte, diese Zahl aus einem TStream lädt um ein DEC Klasse Objekt zu laden. Man speichert also zb. TCipher_Rijndeal.Identity als Zahl in einem Stream. Später lädt man diese Identity wieder aus dem Stream und sucht mit CpiherByIdentity(Identity aus TStream) die TCipher_Rijndael Klasse. Der Wert in IdentityBase ist Anwendungsbezogen und beeinflusst alle .Identity Werte aller DECClassen. Man kann also durch das Änderen dieses Wertes alle Identity Codes serialisieren so das nur mit diesem bekannten Wert DEC Klassen aus Stream geladen werden können.

Du kannst also somit eine Datei mit einem variaben Cipher/Hash verschlüsseln, speicherst die Identity dieser benutzen Klassen als Header in der verschlüsselten Datei. Beim Entschüsseln lädst du erstmal diese Identities wieder aus diesem TStream, holst dir mit HashByIdentity() und CipherByIdentity() diese Klassen, erzegtst damit deiner Objekte und entschlüsselst den Rest des Streams. Somit kannst du mit verschiedenen Cipher/Hashs arbeiten stattt nur mit hardcoded Klassen.

Wenn du aber meinen obigen Vorschlag an Funktionen gearbeitet hast dann sollte eigentich in den globalen Konstanten die korrekte Klasse schon gesetzt sein. Dies ist aber bei dir anscheinend nicht der Fall, dh. du hast diese Konstanten aus NIL gesetzt. Das führt nun dazu das

with ValidCipher(globale Konstane == nil).Create do

die Funktion ValidCipher() die übergebene Klasse==nil überprüft. ValidCipher() gibt bei NIL als Parameter die mit SetDefaultCipherClass() installierte Klasse zurück.

Du hast also deine globalen Konstanten nicht richtig initialisert, eg. auf NIL stehen, alos hier

Delphi-Quellcode:
const
  ACipherClass: TDECCipherClass = TCipher_Rijndael;
  AKDFClass: TDECHashClass = THash_SHA1;
Es sei denn du benutzt die Methode aus dem allerersten Posting. Diese speichert natürlich die .Identity der benutzten Klassen in den TStream.
Dann musst du mit RegisterDECClasses([]) alle DEC Klassen, eg. Hash und Cipher, registrieren die du in der Gegenwart und Zukunft benutzen möchtest. Denn nur bei alle diesen registrierten Klassen ist sichergestellt das der Wert von .Identity auch eineindeutig ist, das ist wichtig.
Der Aufruf von RegisterDECClasses([]) sollte in der Initialization Sektion der Unit steht, also nur einmalig aufgerufen werden (man kann es aber auch mehrmals aufrufen wenn nötig). Dabei ist WICHTIG das der Wert in BaseIdentity noch davor gesetzt wird !! Also auch vor dem Aufruf von SetDefaultCipherClass(), SetDefaultHashClass() und evtl. TCipher_XYZ.Register und THash_XYZ.Register.


Gruß Hagen
  Mit Zitat antworten Zitat
delphin06

Registriert seit: 18. Jun 2006
154 Beiträge
 
#46

Re: DEC 5.1 wie benutzen?

  Alt 22. Feb 2008, 16:20
Ich benutze so in etwa die function die ich so ziemlich am Anfang mal gepostet habe nur halt für n Memorysream umgeschrieben.

Und den Code:
Delphi-Quellcode:
SetDefaultCipherClass(TCipher_Rijndael);
  SetDefaultHashClass(THash_SHA1);
  IdentityBase := $84485225;
  RegisterDECClasses([TCipher_Rijndael, THash_SHA1]);
Rufe ich beim Start in der Formcreate() auf. Da ich nur diese eine Verschlüsselung benutze sollte es da keine Probleme geben oder?


Also ich benutze diese beiden Funktionen jeweils zum entschlüsseln bzw. verschlüsseln:
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
  ACipher := ValidCipher(ACipher);
  AHash := ValidHash(AHash);
  Seed := RandomBinary(16);
  Sourcestr:=TMemorystream.Create();
  try
    sourcestr.WriteComponent(Form1.listview1);
    SourceStr.Position := 0;
    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;

procedure TForm1.DecodeMStream(const ASourceFileName: String; const APassword: Binary);
var
    Source: TStream;

  procedure Read(var Value; Size: Integer);
  begin
    Source.ReadBuffer(Value, Size);
  end;

  function ReadByte: Byte;
  begin
    Read(Result, SizeOf(Result));
  end;

  function ReadLong: LongWord;
  begin
    Read(Result, SizeOf(Result));
    Result := SwapLong(Result);
  end;

  function ReadBinary: Binary;
  begin
    SetLength(Result, ReadByte);
    Read(Result[1], Length(Result));
  end;

var
    Dest: TMemoryStream;
    error:Boolean;
begin
  error:=false;
  Source := TFileStream.Create(ASourceFileName, fmOpenRead or fmShareDenyNone);
  try
    try
      Dest := TMemorystream.Create;
      try
        try
          with CipherByIdentity(ReadLong).Create do
          try
            Mode := TCipherMode(ReadByte);
            Init(HashByIdentity(ReadLong).KDFx(APassword, ReadBinary, Context.KeySize));
            DecodeStream(Source, Dest, ReadLong);
            if ReadBinary <> CalcMAC then
              //raise EDECException.Create('Invalid decryption');
              begin
                showmessage('Fehler: falsches Passwort');
                error:=true;
              end;
          finally
            Free;
          end;
        except
          //ProtectStream(Dest);
          raise;
        end;
        finally
          dest.Position := 0;
          if error = false then
            dest.ReadComponent(Form1.ListView1);
          Dest.Free;
        end;
      except
      //DeleteFile(ChangeFileExt(AFileName, ''));
      raise;
    end;
  finally
    Source.Free;
  end;
  if error = true then
    begin
      form1.close;
      PasswordDlg.Close;
    end
  else
    begin
      form1.Enabled:=true;
      form1.Visible:=true;
    end;
end;
Und dann halt die Klassenregestrierungen im formcreate().

Gruß
  Mit Zitat antworten Zitat
noway

Registriert seit: 24. Mär 2008
9 Beiträge
 
#47

Re: DEC 5.1 wie benutzen?

  Alt 24. Mär 2008, 09:51
Hallo zusammen,

ich hoffe, die Eier sind gefunden im Schnee...

Ich habe mir diesen Thread mal durchgelesen und bin bei der Unit "MyCrypt" hängen geblieben, die für meine Zwecke OK ist.
Wie kann ( muss ) ich abfragen, ob das Passwort richtig eingegeben wurde.
Und wie man ggf. auf ein falsches Kennwort reagiert.
Bei mir klappt das irgendwie nicht
Kann mir jemand helfen ?


Gruß
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.251 Beiträge
 
Delphi 2006 Professional
 
#48

Re: DEC 5.1 wie benutzen?

  Alt 24. Mär 2008, 10:32
Hai Thomas,

ersteinmal: "Herzlich Willkommen in der Delphi-PRAXiS".

Zitat von noway:
... Wie kann ( muss ) ich abfragen, ob das Passwort richtig eingegeben wurde. ...
Lese Dir doch mal diesen Beitrag von negaH durch.
Der sollte Dir helfen.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
noway

Registriert seit: 24. Mär 2008
9 Beiträge
 
#49

Re: DEC 5.1 wie benutzen?

  Alt 24. Mär 2008, 11:48
Hallo Sharky,

danke erstmal für das "Willkommen" und wür die schnelle Antwort.
Ich bin jetzt nicht so der große Delphianer und bekommt das irgendwie nicht umgesetzt.

Hilfe ????

Tom
  Mit Zitat antworten Zitat
noway

Registriert seit: 24. Mär 2008
9 Beiträge
 
#50

Re: DEC 5.1 wie benutzen?

  Alt 29. Mär 2008, 07:14
Hallo zusammen,

habe mir mal den Beitrag durchgelesen, kann ihn nur nicht umsetzen
Delphi-Quellcode:
Salt_1 = RandomBinary(16);
Salt_2 = RandomBinary(16);
SessonKey = KDF(Salt_1, Passwort);
Checksum = MGF(Salt_2, SessionKey);
CipherText = ENCYPT(SessionKey, Salt_2 + Checksum + PlainText);
FinalData = Salt_1 + CipherText;
Finde diese KDF und MGF funktionen nicht
Kann mir das jemand übersetzen

Wäre echt gut

Danke schonmal
noway
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 03:22 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