AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion von altem DEC in neues DEC 6.3

Ein Thema von Hobbycoder · begonnen am 6. Okt 2025 · letzter Beitrag vom 7. Okt 2025
Antwort Antwort
Hobbycoder

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

Funktion von altem DEC in neues DEC 6.3

  Alt 6. Okt 2025, 18: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
EKON 29
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.162 Beiträge
 
Delphi 12 Athens
 
#2

AW: Funktion von altem DEC in neues DEC 6.3

  Alt 6. Okt 2025, 20:02
Hättest du vielleicht ein Beispielprojekt mit den erwarteten Ergebnissen? Sprich das Beispielwerte aus der bisherigen Version drin hat und prüft? Ich hätte schon Ideen, was geändert werden muss, aber ohne zu wissen, womit du das genau erstellt hast, ist das schwer zu prüfen.

Wenn ich ein Projekt hätte, das prüft, ob die erwarteten Ergebnisse beim Aufruf der Funktionen herauskommen, könnte ich das mal ausprobieren.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Hobbycoder

Registriert seit: 22. Feb 2017
1.021 Beiträge
 
#3

AW: Funktion von altem DEC in neues DEC 6.3

  Alt 7. Okt 2025, 09:10
Ich hab dir mal ein Beispiel angehängt.

In der Datei Verschlusselungsbeispieldaten.txt sind sowohl Klartext- als auch Verschlüsselt-String drin.
Die Zip-Datei ist mit Passwort gesichert, weil ich in den Units den original Verschlüsselungskey drin habe. Das Passwort für die Zip hast du per PN.
Angehängte Dateien
Dateityp: zip TestProjekt1.zip (7,8 KB, 3x aufgerufen)
Gruß Hobbycoder
Alle sagten: "Das geht nicht.". Dann kam einer, der wusste das nicht, und hat's einfach gemacht.
  Mit Zitat antworten Zitat
EdAdvokat

Registriert seit: 1. Mai 2016
Ort: Berlin
420 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Funktion von altem DEC in neues DEC 6.3

  Alt 7. Okt 2025, 15:54
Hallo,
anbei die unit tools.crypt, die auch mit DEC 6.3 laufen sollte. Ich habe sie in einem kleinen
Projekt "KeyGenerator" mit DEC 6.41 verarbeitet, um eine Memo-Liste zu verschlüsseln und dann
wahlweise auch wieder zu entschlüsseln.
Dazu greife ich auf ein edit-Feld mit dem Key zu, der natürlich nur als ##### zu erkennen ist.
Natürlich könnten div. units aus diesem Tool herausgenommen werden, da du diese nicht benötigst.
Ist es das was du suchts?

Delphi-Quellcode:
unit Tools.Crypt;

interface

uses
  System.SysUtils,
  DECUtil, DECHash,
  //DECCipher, DECFmt;
  DECHashBase, DECCipherBase, DECCiphers, DECFormatBase, DECFormat,
  DECHashAuthentication, DECRandom;

const
  conKey = 'aYr14iaz8u)xO7Ok';

var
  CipherMode: TCipherMode = cmCBCx;
  HashClass: TDECHashClass = THash_SHA256;
  TextFormat: TDECFormatClass = TFormat_Base64;
  KDFIndex: LongWord = 1;

type
  TToolsCrypt = class
  public
    class function Decrypt(aHash: string; aKey: string = ''): string;
    class function Encrypt(aText: string; aKey: string = ''): string;
  end;

implementation

{ TToolsCrypt }

class function TToolsCrypt.Decrypt(aHash, aKey: string): string;
var
  Cipher: TCipher_Rijndael;
  Salt: RawByteString; //Binary;
  Data: RawByteString;
  Check: RawByteString;
  Pass: RawByteString;
  PassBytes: TBytes;
  Len: Integer;
begin
  if aKey = 'then
  begin
    aKey := conKey;
  end;

  HashClass:=TDECHashClass(THash_SHA256.create);

 try
  Cipher := TCipher_Rijndael.Create;
  try
    Salt := ValidFormat(TextFormat).Decode(RawByteString(aHash));
    Len := Length(Salt) - 16 - Cipher.Context.BufferSize;
    Data := Copy(Salt, 17, Len);
    Check := Copy(Salt, Len + 17, Cipher.Context.BufferSize);
    SetLength(Salt, 16);
    PassBytes := THash_SHA256.KDFx(aKey[1],
                                  Length(aKey) * 2,
                                  Salt[1],
                                  Length(Salt),
                                  Cipher.Context.KeySize,
                                  KDFIndex);

    SetLength(Pass, Length(PassBytes));
    Move(PassBytes[0], Pass[low(Pass)], Length(PassBytes));

    Cipher.Mode := CipherMode;
    Cipher.Init(Pass);
    SetLength(Result, Len div 2);
    Cipher.Decode(Data[1], Result[1], Len);
    if Check <> Cipher.CalcMAC then
    begin
      Result := '';
    end;
  finally
    Cipher.Free;
    //ProtectBinary(Salt);
    ProtectString(Salt);
    ProtectString(Data);
    ProtectString(Check);
    ProtectString(Pass);
  end;

 finally
   THash_SHA256(HashClass).Free;
 end;

end;

class function TToolsCrypt.Encrypt(aText, aKey: string): string;
var
  Cipher: TCipher_Rijndael;
  SaltBytes : TBytes;
  Salt: RawByteString; //Binary;
  Data: RawByteString; //Binary;
  Pass: RawByteString; //Binary;
  PassBytes: TBytes;
begin
  if aKey = 'then
  begin
    aKey := conKey;
  end;

  HashClass:=TDECHashClass(THash_SHA256.create);
 try

  Cipher := TCipher_Rijndael.Create;
  try
    SaltBytes := RandomBytes(16); //RandomBinary(16);
    SetLength(Salt, Length(SaltBytes));
    Move(SaltBytes[0], Salt[low(Salt)], Length(SaltBytes));

    PassBytes := THash_SHA256.KDFx(aKey[1],
                                  Length(aKey) * 2,
                                  Salt[1],
                                  Length(Salt),
                                  Cipher.Context.KeySize,
                                  KDFIndex);

    SetLength(Pass, Length(PassBytes));
    Move(PassBytes[0], Pass[low(Pass)], Length(PassBytes));

    Cipher.Mode := CipherMode;
    Cipher.Init(Pass);
    SetLength(Data, Length(aText) * 2);
    Cipher.Encode(aText[1], Data[1], Length(Data));
    Result := string(ValidFormat(TextFormat).Encode(Salt + Data + Cipher.CalcMAC));
  finally
    Cipher.Free;
    ProtectString(Salt);
    ProtectString(Data);
    ProtectString(Pass);
  end;
 finally
   THash_SHA256(HashClass).Free;
 end;
end;

end.
Norbert
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.162 Beiträge
 
Delphi 12 Athens
 
#5

AW: Funktion von altem DEC in neues DEC 6.3

  Alt 7. Okt 2025, 16:05
Ich wollte das gerade testen, als ich die Antwort gesehen habe, deshalb konnte ich das gerade testen. Da kommt zwar etwas anderes bei der Verschlüsselung heraus, aber die Entschlüsselung klappt offenbar. Von daher halte ich mich mal zurück.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.483 Beiträge
 
Delphi 12 Athens
 
#6

AW: Funktion von altem DEC in neues DEC 6.3

  Alt 7. Okt 2025, 16:59
conKey = 'aYr14iaz8u)xO7Ok'; ...kommt mir bekannt vor.
  Mit Zitat antworten Zitat
Alt 8. Okt 2025, 09:07     Erstellt von istingpopul
Dieser Beitrag wurde von TBx gelöscht. - Grund: Verdacht auf SPAM und den damit verbundenen verschwenderischen Umgang von wertvollen Bits und Bytes
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 16:10 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