AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Muss Salt für DEC immer 16-stellig sein?
Thema durchsuchen
Ansicht
Themen-Optionen

Muss Salt für DEC immer 16-stellig sein?

Ein Thema von BlueStarHH · begonnen am 21. Aug 2009 · letzter Beitrag vom 27. Aug 2009
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
802 Beiträge
 
Delphi 11 Alexandria
 
#1

Muss Salt für DEC immer 16-stellig sein?

  Alt 21. Aug 2009, 17:42
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;
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
802 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 24. Aug 2009, 11:43
Weiß niemand die Antwort? Ist wichtigt. Danke!
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.260 Beiträge
 
Delphi 12 Athens
 
#3

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 24. Aug 2009, 12:30
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

[add]
ich wußte es doch
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 24. Aug 2009, 13:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 24. Aug 2009, 13:30
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 24. Aug 2009, 13:38
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
  Mit Zitat antworten Zitat
Benutzerbild von negaH
negaH

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

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 24. Aug 2009, 13:47
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:
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;
Diese Reproduzierbarkeit der Resulate ist der einizige Grund für einen solchen Seed als Parameter. Über diese Reproduzierbarkeit kann man also Fehler leichter finden.

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
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
802 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Muss Salt für DEC immer 16-stellig sein?

  Alt 27. Aug 2009, 13:32
[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!
  Mit Zitat antworten Zitat
Antwort Antwort


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:53 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