Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   C# zu Delphi mit DEC (https://www.delphipraxis.net/211247-c-zu-delphi-mit-dec.html)

knuut21 20. Aug 2022 22:49

C# zu Delphi mit DEC
 
Hallo zusammen,

ich versuche gerade die Entschlüsselung eines Passworts aus C# in Delphi zu implementieren und stehe wohl auf dem Schlauch.

Ausgehend von C#:

public string Decrypt(string PWD, string Inputtext)
{
try
{
Rijndael AES_Decrypto = Rijndael.Create();
AES_Decrypto.BlockSize = 128;
AES_Decrypto.KeySize = 256;

Rfc2898DeriveBytes pdb = new Rfc2898DeriveBytes(PWD, SALT, 2000);
AES_Decrypto.Key = pdb.GetBytes(32);
AES_Decrypto.IV = pdb.GetBytes(16);
..
..

Schaut mein Ansatz in Delphi so aus:

Delphi-Quellcode:
function Decrypt(PWD, InputText: String): string;
const
  lSALT: TBytes = [x, x, x, x, x, x, x, x];
begin
  Key:= THash_SHA1.PBKDF2(BytesOf(PWD), SALT, 2000, 32);
  IV:= THash_SHA1.PBKDF2(BytesOf(PWD), SALT, 2000, 16);
..
..
Leider erhalte ich für IV und Key unterschiedliche Werte und somit ist die Entschlüsselung des Passworts nicht erfolgreich.

Hat jemand eine Idee, was ich hier falsch mache?

Danke

Knuut21

TurboMagic 21. Aug 2022 08:06

AW: C# zu Delphi mit DEC
 
Hallo,

ich weiß jetzt zwar nicht was Rfc2898 genau beschreibt.
Ich würde aber mal zuerst überprüfen, ob für die 32 Byte beim selben Eingabewert wie in C#
dasselbe raus kommt.

Außerdem frage ich micht, warum du das 2x berechnest. Einmal für 32 Byte und 1x für 16 Byte.
Man kann es doch 1x für 32 Byte berechnen und dann einfach aus dem Ergebnis auch die 16 Byte
extrahieren oder?

Zumindest hinterläßt der C# diesen Eindruck bei mir.

Und nochwas wo man aufpassen muss: ist der string PWD in C# auch ein UTF16 string?
Sonst könnte BytesOf in Delphi ein anderes Ergebnis liefern...

Grüße
TurboMagic

KodeZwerg 21. Aug 2022 08:25

AW: C# zu Delphi mit DEC
 
Zitat:

Zitat von TurboMagic (Beitrag 1510429)
ist der string PWD in C# auch ein UTF16 string?

UTF-16 ist in C# ein Char. (Also auch ein String egal ob System.String oder nur String)

knuut21 21. Aug 2022 08:43

AW: C# zu Delphi mit DEC
 
Ich muss zugeben, dass ich alles andere als Experte beim Thema Verschlüsselung etc. bin.

Zitat:

Zitat von TurboMagic (Beitrag 1510429)
ich weiß jetzt zwar nicht was Rfc2898 genau beschreibt.
TurboMagic

Lt. Beschreibung von "MS" Implementiert die Klasse mithilfe eines auf HMACSHA1 basierenden Generators für Pseudozufallszahlen die kennwortbasierte Schlüsselableitungsfunktion PBKDF2.

Zitat:

Zitat von TurboMagic (Beitrag 1510429)
Außerdem frage ich micht, warum du das 2x berechnest. Einmal für 32 Byte und 1x für 16 Byte.
Man kann es doch 1x für 32 Byte berechnen und dann einfach aus dem Ergebnis auch die 16 Byte
extrahieren oder?

TurboMagic

War anfänglich auch meine Annahme, aber sowohl in C#, als auch durch die Verwendung von THash_SHA1.PBKDF2 werden für unterschiedliche Schlüssellängen unterschiedliche Werte erzeugt.

In meinem Fall allerdings keine identischen für die jeweiligen Keys.

BG

knuut21

TurboMagic 22. Aug 2022 20:51

AW: C# zu Delphi mit DEC
 
Man müsste Mal prüfen wo DECs Unit Test Daten für den PBKDF2 her sind und was C# daraus macht bzw. ob der RFC Testdaten enthält und DEC die auch erfolgreich nutzen kann.

TurboMagic 22. Aug 2022 20:54

AW: C# zu Delphi mit DEC
 
Gibt's davon auch eine Variante in der DEC die komplett mit TBytes arbeitet? Kann man der Mal zum Vergleich die Daten des C# Strings in dessen UTF16 Repräsentation füttern?

knuut21 30. Aug 2022 21:20

AW: C# zu Delphi mit DEC
 
So wie es ausschaut, scheint es einen Fehler in der Implementierung der Methode Hash_SHA1.PBKDF2 zu geben.
Bug-Ticket ist erstellt.

TurboMagic 30. Aug 2022 21:36

AW: C# zu Delphi mit DEC
 
Ja, Issue hab's ich gesehen. Wird aber ein bisschen dauern, es sei denn es findet sich jemand der PBKDF2 besser kann als ich ;-)

Ich erinnere mich noch, keine Ahnung ob das hier relevant ist, dass ich
damals rausgefunden hatte, dass DECs KDF2 eigentlich KDF1 oder 3 war.
Hatte das dann entsprechend umbenannt und die anderen beiden umgesetzt, da die Unterschiede nur in den Aufruf Reihenfolgen einiger darin aufgerufene Funktionen liegt.

knuut21 31. Aug 2022 07:25

AW: C# zu Delphi mit DEC
 
Mir ist bei den Tests aufgefallen, dass scheinbar die ersten 16 Bytes korrekt erzeugt werden:

Ergebnis von THash_SHA1.PBKDF2('PassWord', 'Salt', 1000, 16):

(5, 231, 179, 63, 147, 234, 29, 53, 147, 155, 50, 173, 89, 148, 239, 99)

Ergebnis der Referenz- Bibliothek (https://onlinephp.io/hash-pbkdf2):, hier allerdings mit einer Länge von 32 (warum auch immer)

Hex: 05 e7 b3 3f 93 ea 1d 35 93 9b 32 ad 59 94 ef 63
entspricht (5 231 179 63 147 234 29 53 147 155 50 173 89 148 239 99)

Bei längeren Keys klappt es mit THash_SHA1.PBKDF2 nicht mehr.

@TurboMagic, Danke für Deine Unterstützung.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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