Einzelnen Beitrag anzeigen

Hobbycoder

Registriert seit: 22. Feb 2017
1.025 Beiträge
 
#1

Funktion von altem DEC in neues DEC 6.3

  Alt 6. Okt 2025, 19:15
Hi,

Ich brauche mal eure Hilfe. Hier gibt es doch bestimmt ein paar DEC-Spezialisten.
Ich haben einen alten Code, den ich vor Jahren mal irgendwo herbekommen habe. Für die damalige DEC-Version.

Nun gibt es ja die DEC 6.3 für D12, wo dieser nicht mehr läuft. Mein Wissen bezüglich DEC beschränkt sich leider aus das absolute Minimum, so dass ich selbst nicht in der Lage bin ihn auf 6.3 anzupassen.
Mit den beiden Funktionen Encrypt und Decrypt habe ich für eine INI-Datei Passwörter verschlüsselt.
In dem Parameter AText wird jeweils das zu verschlüsselnde Passwort angegeben, und im APassword ein Key, mit dem Verschlüsselt wurde.
Nun könnte ich natürlich die Funktionen komplett austauschen, dann würden jedoch die bereits gespeicherten Daten nicht mehr korrekt gelesen werden können.
Also wäre es toll, wenn man das mit DEC 6.3 hinbekäme, dass die Funktionen so weiterlaufen können.

(Ist auch als Datei angehängt)

Delphi-Quellcode:
unit u_scsettings;

interface

uses System.Classes, System.IniFiles, System.SysUtils, System.Generics.Collections,
   DECUtil, DECCipher, DECHash, DECFmt, Vcl.Dialogs, u_tools;

var
  ACipherClass: TDECCipherClass = TCipher_Rijndael;
  ACipherMode: TCipherMode = cmCBCx;
  AHashClass: TDECHashClass = THash_Whirlpool;
  ATextFormat: TDECFormatClass = TFormat_MIME64;
  AKDFIndex: LongWord = 1;

implementation

function Encrypt(const AText: string; const APassword: string): string;
var
  ASalt: Binary;
  AData: Binary;
  APass: Binary;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := RandomBinary(16);
    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;

function Decrypt(const AText: String; const APassword: String; var Failed: Boolean): String;
var
  ASalt: Binary;
  AData: Binary;
  ACheck: Binary;
  APass: Binary;
  ALen: Integer;
begin
  with ValidCipher(ACipherClass).Create, Context do
  try
    ASalt := ValidFormat(ATextFormat).Decode(AText);
    ALen := Length(ASalt) - 16 - BufferSize;
    AData := System.Copy(ASalt, 17, ALen);
    ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
    SetLength(ASalt, 16);
    APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
    Mode := ACipherMode;
    Init(APass);
    SetLength(Result, ALen div SizeOf(AText[1]));
    Decode(AData[1], Result[1], ALen);
    Failed:= ACheck <> CalcMAC;
  finally
    Free;
    ProtectBinary(ASalt);
    ProtectBinary(AData);
    ProtectBinary(ACheck);
    ProtectBinary(APass);
  end;
end;

end.
Dank an alle.
Angehängte Dateien
Dateityp: pas u_scsettings.pas (2,1 KB, 1x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat