![]() |
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:
So sieht die Funktion bei Verwendung des DEC 5.1 aus:
{*** 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;
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; |
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:
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.
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; 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 |
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. :-) |
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 |
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.
|
Re: Passwortlänge DEC 3.0 vs. DEC 5.1
Zitat:
![]()
Delphi-Quellcode:
Context ist somit von Typ "TCipherContext":
type
//.. TDECCipher = class(TDECObject) private //.. protected //... public //... class function Context: TCipherContext; virtual; abstract; //... published //.. end;
Delphi-Quellcode:
Später wird es in den jeweiligen Verschlüsselungsvarianten das TCipherContext Record noch genauer spezifiziert.
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; jus |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz