![]() |
Muss Salt für DEC immer 16-stellig sein?
Hallo,
ich benutze die folgende Funktion um mit dem DEC einen String zu verschlüsseln. Diese ist vom DEC-Beispielcode leicht abgewandelt. Wenn Salt die Länge 6 oder 8 hat, ist ein Entschlüsseln nicht mehr möglich (Exception). Verlängere ich den Salt auf 16 Stellen klappt es. Im DEC-Beispielcode aus der DEC-Zipdatei wird der Salt mit RandomBinary(16) erzeugt. Also 16-stellig. Muss er immer 16 Stellen haben? Oder ist der Fehler wo anders zu suchen?
Delphi-Quellcode:
function Encrypt(const AText: string; const APassword: string; ATextFormat: TDECFormatClass; Salt: Binary): string; overload;
var ASalt: Binary; AData: Binary; APass: Binary; begin with ValidCipher(ACipherClass).Create, Context do try if Salt = '' then ASalt := RandomBinary(16) else ASalt := Salt; APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex); Mode := ACipherMode; Init(APass); SetLength(AData, Length(AText) * SizeOf(AText[1])); Encode(AText[1], AData[1], Length(AData)); Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC); finally Free; ProtectBinary(ASalt); ProtectBinary(AData); ProtectBinary(APass); end; end; |
Re: Muss Salt für DEC immer 16-stellig sein?
Weiß niemand die Antwort? Ist wichtigt. Danke!
|
Re: Muss Salt für DEC immer 16-stellig sein?
Wenn man dir Länge mit angeben kann (Length(ASalt)), dann wird man vermutlich auch andere Längen verwenden können?
Im notfall auf Hagen (den Meister höchst persönlich) warten, bis diese sich meldet, dieser kann dann bestimmt genau sagen, welche Werte am Optimalsten, bzw. möglich sind. Oder einfach mal aufprobieren, was passiert, wenn du da etwas anderes verwendest :angel2: [add] ich wußte es doch :angel: |
Re: Muss Salt für DEC immer 16-stellig sein?
Der Salt kann so lang sein, wie du willst. Wie du siehst, wird aus dem Salt und deinem PW ein interner Key gebildet. Dieser ist je nach Stärke des verwendeten Verschlüsselungs Algos auf eine bestimmte Länge begrenzt. Bei AES-256 Bit wären dies 32 Bytes. Da dein Password & der Salt aber eh nochmal gehasht werden, ist die Länge sowohl des Salts als auch des PWs egal.
|
Re: Muss Salt für DEC immer 16-stellig sein?
Die optimale Länge des Salts kann direkt aus kryptographsichen Erwägungen heraus berechnet werden.
Wir benutzen einen Verschlüsselungsalgorithmus der eine Blockgröße von 16 Bytes hat. Weniger als 16 Bytes Salt wären unsicherer und mehr als 16 Bytes wären Verschwendung da sie die Sicherheit nicht erhöhen können. Ergo: Salts für Blockverschlüsselungen immer gleichgroß wie die Blockgröße des Ciphers. Wir benutzen einen Salt um per KDF ein Passwort sicherer zu machen. Saltgröße = Min(Hash Digest Größe, Cipher Passwortgröße) Angenommen der Cipher erwartet 256 Bit große Passwörter maximal. Macht 32 Bytes. Nun sollte der Hash der KDF eine Digestgröße von 32 haben. Weniger ist unsicherer und mehr macht keinen Sinn. Ergo: Saltgröße für die KDF wäre mit 32 Bytes genau richtig. Gruß Hagen |
Re: Muss Salt für DEC immer 16-stellig sein?
Zu deinem Problem:
Mit der Übergabe des Salt als Parameter ist der von variabler Länge. Wo in deinen verschlüsselten Daten hast du diese Länge denn gespeichert ? Nirgends. Wie also soll bei der Entschlüsselung erkannt werden mit welcher variablen Saltgröße verschlüsselt wurde ? Gehen wir von folgenden Fakten aus: 1.) Cipher ist harcoded festgelegt und hat damit immer gleiche Blockgröße 2.) Zufall ist Zufall Somit gibt es keine logische Begründung den Salt überhaupt als Paramter zu übergeben, das macht es nur von der Benutzung her störanfälliger und dekrementiert somit die Sicherheit. Erst zum Zeitpunkt der Benutzung eines Saltes weist du als Designer effektiv wleche Form von Salt zum jeweiligen Verfahren am besten passt und welche Qualität der benutzte Zufall haben sollte. Bei manchen Verfahren spielt die Qualität keine so wichtige Rolle bei anderen wiederum ist sie enorm wichtig. Ergo: den Salt als Paramater zu übergeben ist unlogisch und reduziert die Verfahrenssichrheit. Es vernichtet das Konzept der Modularisierung von Aufgaben und darin enthalten ist auch das "Expertenwissen" das innerhalb eines Modules steckt. Wäre der Cipher dynamisch zur Laufzeit wählbar und damit zum Entschlüsselungszeitpunkt ebenfalls bekannt so gelten die Annahmen aus dem vorherigen Posting. Salt hat intern eine variable Länge direkt abhängig vom verwendeten Cipher und Hash, ergo wiederum ist es unlogisch diesen als Parameter zu übergeben. Gruß Hagen |
Re: Muss Salt für DEC immer 16-stellig sein?
Möchtest du denoch einen Salt, quasi als Startwert übergeben und damit reproduzierbare Resultate, dann benutze eine MGF. Ist sowas ähnliches wie eine KDF um aus diesem Startwert den Salt zu erzeugen.
Delphi-Quellcode:
Diese Reproduzierbarkeit der Resulate ist der einizige Grund für einen solchen Seed als Parameter. Über diese Reproduzierbarkeit kann man also Fehler leichter finden.
function Encrypt(const AText: string; const APassword: string; ATextFormat: TDECFormatClass; ASeed: Binary = ''): String; overload;
var ASalt: Binary; AData: Binary; APass: Binary; begin with ValidCipher(ACipherClass).Create, Context do try if ASeed = '' then ASalt := RandomBinary(Min(BufferSize, KeySize)) else ASalt := ValidHash(AHashClass).MGFx(ASeed, Min(BufferSize, KeySize), TFormat_Copy); APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex); Mode := ACipherMode; Init(APass); SetLength(AData, Length(AText) * SizeOf(AText[1])); Encode(AText[1], AData[1], Length(AData)); Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC); finally Free; ProtectBinary(ASalt); ProtectBinary(AData); ProtectBinary(APass); end; end; In deiner Decrypt Funktion musst du den formatierten und zusammengesetzten String wieder unformatieren und dann den benutzten ASalt mit Cipher.BufferSize Bytes daraus extrahieren. Beachte aber auch das selbst dieser Seed aus kryptographischer Sicht eben Min(Cipher.BufferSize, Cipher.KeySize) Bytes lang sein sollte. Gruß Hagen |
Re: Muss Salt für DEC immer 16-stellig sein?
[quote="negaH"]Diese Reproduzierbarkeit der Resulate ist der einizige Grund für einen solchen Seed als Parameter.[quote]
Genau das brauche ich. Danke an alle für die hilfreichen Antworten! |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:37 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