Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Passwortlänge DEC 3.0 vs. DEC 5.1 (https://www.delphipraxis.net/67919-passwortlaenge-dec-3-0-vs-dec-5-1-a.html)

ringli 21. Apr 2006 20:16


Passwortlänge DEC 3.0 vs. DEC 5.1
 
Ich verwende das DEC um einen String zu verschlüsseln und wollte jetzt von Version 3.0 auf Version 5.1 aktualisieren. Den Funktionsaufruf habe ich entsprechend angepasst und grundsätzlich funktioniert das Ganze auch. Das einzige Problem ist das die angepasste Funktion keine Passwörter über 32 Zeichen erlaubt. Wenn ich nämlich ein Passwort >32 Zeichen verwende, erhalte ich vom Compiler nur den Fehler Keymaterial is to large as can be used, security issue. Mit dem alten DEC war ein Passwort >32 Zeichen kein Problem, also vermute ich mal das ich noch irgendwas falsch mache. Die Frage ist nur was ich falsch mache... :gruebel:

So sah die Funktion bei Verwendung des DEC 3.0 aus:
Delphi-Quellcode:
{*** Einen beliebigen String verschlüsseln ***}
function Encode(const Value : String): String;
begin
  with TCipher_Rijndael.Create('Passwort mit über 32 Zeichen ohne Probleme', nil) do
    try
      Result := CodeString(Value, paEncode, fmtMIME64);
    finally
      Free;
  end;
end;
So sieht die Funktion bei Verwendung des DEC 5.1 aus:
Delphi-Quellcode:
{*** Einen beliebigen String verschlüsseln ***}
function Encode(const Value : String): String;
begin
  with TCipher_Rijndael.Create do
    try
      Mode := cmCBCx;
      Init('Passwort bis maximal 32 Zeichen');
      Result := EncodeBinary(Value, TFormat_MIME64);
    finally
      Free;
    end;
end;

negaH 21. Apr 2006 20:55

Re: Passwortlänge DEC 3.0 vs. DEC 5.1
 
Du machst garnichts falsch !

Unter den vielen Änderungen im DEC 5.x verglichen zur Version 3.x sind im Besonderen die konzeptionellen Änderungen wichtig. Das sind Änderungen am Konzept zu Gunsten höherer Anwendungssicherheit (Fehlervermeidung durch den Programmierer) und die "Abspeckungs-" Maßnahmen zu nennen.

In Version 3.x gab es zb. zwei verschiedene Möglichkeiten einen Cipher zu initialisiren
a.) .Init()
b.) .InitKey()


Während .Init() die Standardmethode zur Initialisierung eines Ciphers ist und dabei zu langes Keymaterial einfach abgeschnitten hat, benutzte Methode .InitKey() eine interne Transformation per Hashfunktion vom Keymaterial um dieses auf die erforderliche Passwortgröße des Ciphers umzuwandeln.

Diese Umwandlung erfolgt heutzutage durch sogennate KDF = Key Derivation Function. Der Trend geht absehbar in diese Richtung. Allerdings sind die benutzten Verfahren so unterschiedlich das es faktisch unmöglich ist dise alle im DEC zu integrieren. Es entsteht eine Zwickmühle, entweder die vielen KDFs ins DEC integrieren und damit die Abspeckmaßnahmen zunichte machen und wieder eine "überfrachtete" Library zu bauen, oder einfach nur die notwendigen Mittel integrieren und den letzten Schliff muß der Endanwender in par Zeilen Sourcecode selber machen. Ich habe mich für letzteres entschieden, weil nur so die Zielsetzung das DEC 5.x einfacher werden sollte, erreichbar war.

Im DEC 5.x gibt es also die Methode .InitKey() nicht mehr. Methode .Init() und die ganze Benutzung der Cipher seber wird durch eine FSM=Finite State Machine nun zusätzlich abgesichert. Dh. es sind mehr Überprüfungen, Plausibilitätschecks im Version 5.x integeriert. Dies erhöht die Sicherheit vor Fehlbenutzungen der Cipher durch Endanwender wie Dich.

Du müsstest also die Art & Weise des Keysetups aus dem DEC 3.x in Version 5.x manuell nachbauen, oder aber wie ich es empfehlen würde darauf verzichten und neuere im DEC 5.x unterstütze Wege einschlagen.

Zb.

Delphi-Quellcode:
var
  Salt: Binary;
begin
  Salt := RandomBinary(16);
  with TCipher_Rijndael.Create do
  try
    Mode := cmCBCx;
    Init(THash_SHA1.KDFx(APassword, Salt, Context.KeySize));
   
    En/DecodeBlaBla();
  finally
    Free;
  end;
end;
Schaue dir auch mal des Project DECTest.dpr im Ordner \DECx\PART_I\DECtest\ an. Dort findest du einen Vorschlag wie man Dateien sicherer verschlüsseln kann.

Und noch eines ist ganz wichtig. In meinem Rijndael aus Version 3.x wurde noch das originale KeySetup des Rijndaels benutzt. Erst später in Version 5.1c (<- wichtig) habe ich das keySetup auf den neuesten Stand nach AES gebracht (wurde ja auch 3 -> dreimal -> im AES Standard geändert !!). Das bedeutet Rijndael im DEC 3.x ist nicht kompatibel im KeySetup zum DEC 5.1c !!

Gruß Hagen

ringli 22. Apr 2006 01:17

Re: Passwortlänge DEC 3.0 vs. DEC 5.1
 
Danke für die ausführliche Erklärung Hagen. :thumb:

Ich habe meinen Code jetzt so abgeändert wie du es vorgeschlagen hast. Eine interessante Beobachtung habe ich noch gemacht. Nachdem ich jetzt die neue Version vom DEC verwende ist die Anwendung um über 200kB kleiner geworden. :-)

negaH 22. Apr 2006 13:00

Re: Passwortlänge DEC 3.0 vs. DEC 5.1
 
Ja ich weis. Das liegt eben auch daran das durch das überarbeitete Klassenkonzeot im DEC 5.x einige Klassen fehlen, einige Exceptionklassen wegoptimiert wurden und ganz wichtig eben nicht mehr alle möglichen Algorithmen per Standard auch registriert werden. Dies reduziert dann beim Linken enorm den benötigten Speicherbedarf.

Und obwohl DEC 5.x also sparsammer ist ist die ereichbare Funktionalität eben höher und universeller als in Version 3.x (quasi mehr Inhalt bei weniger Masse).

Gruß Hagen

Zacherl 22. Apr 2006 17:48

Re: Passwortlänge DEC 3.0 vs. DEC 5.1
 
Wahrscheinlich stelle ich mich nur dumm an, aber Context gibt es bei mir nicht. Ich habe das DEC allerdings auch nicht als Komponente registriert, sondern binde nur die erfordlerlichen Units, also DECCipher und DECFmt zum en/decodieren ein.

jus 22. Apr 2006 21:02

Re: Passwortlänge DEC 3.0 vs. DEC 5.1
 
Zitat:

Zitat von Florian Bernd
Wahrscheinlich stelle ich mich nur dumm an, aber Context gibt es bei mir nicht. Ich habe das DEC allerdings auch nicht als Komponente registriert, sondern binde nur die erfordlerlichen Units, also DECCipher und DECFmt zum en/decodieren ein.

Schau dir mal diesen Beitrag an. Da hat Hagen freundlicherweise ein komplettes Beispiel gepostet. Ich habe DEC auch lediglich über Library Pfad in Delphi eingebunden und es funktioniert auch. Der "Context" kommt von DECCipher.pas und wird zunächst algemein in der TDECCipher Klasse definiert:
Delphi-Quellcode:
type
//..

TDECCipher = class(TDECObject)
  private
    //..
  protected
    //...
  public
    //...
    class function Context: TCipherContext; virtual; abstract;
    //...
  published
    //..
  end;
Context ist somit von Typ "TCipherContext":
Delphi-Quellcode:
type
//..
TCipherContext = packed record
    KeySize: Integer;           // maximal key size in bytes
    BlockSize: Integer;         // mininmal block size in bytes, eg. 1 = Streamcipher
    BufferSize: Integer;        // internal buffersize in bytes
    UserSize: Integer;          // internal size in bytes of cipher dependend structures
    UserSave: Boolean;          
  end;
Später wird es in den jeweiligen Verschlüsselungsvarianten das TCipherContext Record noch genauer spezifiziert.

jus


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 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