Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Entschlüsselung PHP / Delphi (https://www.delphipraxis.net/204934-entschluesselung-php-delphi.html)

DerNutzer 15. Jul 2020 11:23

Entschlüsselung PHP / Delphi
 
Guten Tag,

ich habe gerade ein Problem wo ich nicht so richtig weiter komme, da ich nicht weiß, was ich tue.
Meine Aufgabe ist es, von einem Datenlogger die verschlüsselten Daten abzufragen und zu archivieren.

Und genau an der Verschlüsselung scheitere ich momentan.

Der Hersteller hat einen Pythoncode zur Verfügung gestellt um die Daten entschlüsseln zu können:

Code:
// originaler Herstellercode
==============================================================
def pad(data):
    length = 16 - (len(data) % 16)
    return data + chr(length)*length


def unpad(data):
    return data[:-ord(data[-1])]


def decodeMessage(msgb64):
    try:
        # first step decode base64
        msg = base64.b64decode(msgb64)

        # second step decode AES
        key = airqpass.encode('utf-8')
        if len(key) < 32:
            for i in range(32-len(key)):
                key += b'0'
        elif len(key) > 32:
            key = key[:32]
        cipher = AES.new(key=key, mode=AES.MODE_CBC, IV=msg[:16])
        return unpad(cipher.decrypt(msg[16:]).decode('utf-8'))
    except ValueError:
        return "Passwort falsch!"
    except Exception as e:
        print('Error - '+str(type(e))+' '+str(e))
Da ich jetzt kein ausgesprochener Verschlüsselungsexperte bin, habe ich ein wenig im Internet recheriert und verschiedene Lösungsansätze ausprobiert.
Der folgende Code schien mir noch am Sinnvollsten zu sein:

Code:
procedure Tform1.Decryption(str1 : ansistring);
var Cipher : TDCP_rijndael;
    Data, Key, IV : ansistring;
    index, dataLength, bsize, pad: integer;
begin

 data := DCPBase64.Base64DecodeStr(Str1);

  key := 'passwort';
  IV := copy(data,1,16);
  Data := copy(data,17,length(data));

  Cipher := TDCP_rijndael.Create(nil);
  try
    Cipher.Init(Key[1],128,@IV[1]);
    cipher.BlockSize := 16;
    //don't miss padding
    {start padding}
    dataLength := Length(Data);
    bsize := (Cipher.BlockSize div 8);
    pad := bsize - (dataLength mod bsize);
    for index := 1 to pad do
      Data := Data+chr(pad);
    {end padding}

    Cipher.decryptCBC(Data[1],Data[1],Length(Data));
  finally
    Cipher.Free;
  end;

  Memo_Plaintext.Lines.Add(Data);
end;
Leider kommt aber nie irgendein sinnvolles Ergebnis dabei heraus. Für Hilfestellungen bin ich echt dankbar, da ich schon eine geraume Zeit versuche dieses Problem zu lösen. :oops:

Sinspin 15. Jul 2020 12:36

AW: Entschlüsselung PHP / Delphi
 
Hallo,

hast Du es mit dem original Herstellercode geschafft eine Entschlüsselung durchzuführen? Wenn ja, zieh dir mal die Werte aus den ganzen einzelnen Schritten. Dann hast du was um zumindest ein Stück weiter testen zu können.
Da wird ein bestimmter AES Mode festgelegt. Den sollte deine Funktion dann auch verwenden.

Den Hersteller mal gefragt ob die nicht etwas in C/C++ haben, oder natürlich Delphi? Da könnte man sich zur Not eine Dll draus zimmern.

Sherlock 15. Jul 2020 14:27

AW: Entschlüsselung PHP / Delphi
 
Python erklärt:
Ich gehe mal davon aus, daß die Python Standardbibliothek Crypto (https://pycryptodome.readthedocs.io/....html#cbc-mode) verwendet wurde.

Dann wird es einfach:
- Zu decodierende Nachricht aus Base64 in eine Bytefolge wandeln
- Wenn das Passwort nicht 32 Byte lang ist, den Rest mit 0 auffüllen
- Wenn das Passwort länger als 32 Zeichen ist, nur die ersten 32 Zeichen berücksichtigen
- Jetzt wird decodiert, die ersten 16 Zeichen sind der Initialisierungsvektor, der Rest ist die verschlüsselte Nachricht
- Der AES Modus ist CBC, und es muss nach dem Entschlüsseln noch Polstermaterial (Padding) entfernt werden.

Jetzt zu Delphi:
Leider kenne ich die von Dir verwendete Klasse nicht. Aber grundsätzlich scheinst Du Mit dem Padding arbeiten zu wollen, bevor überhaupt entschlüsselt wurde, das geht natürlich schief. Überhaupt scheinst Du eher Beispielcode zum Verschlüsseln kopiert zu haben. Schau nochmal nach, ob Du nicht etwas zum Entschlüsseln findest. Hier ist ein guter Start, denke ich: https://www.delphipraxis.net/1394543-post6.html

Sherlock

mytbo 15. Jul 2020 15:49

AW: Entschlüsselung PHP / Delphi
 
Wenn du schon einige Zeit gesucht und nichts Passendes gefunden hast, schaue dich mal hier um.

In der mORMot Unit SynCrypto.pas findest du z.B. die Klasse TAESCBC. In der Unit SynCommons.pas verschiedene Base64Toxxx Funktionen. In den Units SynEcc.pas aber vor allem in SynSelfTests.pas sind Beispiele, wie du die Klassen und Funktionen anwendest.

Bis bald...
Thomas

generic 15. Jul 2020 22:21

AW: Entschlüsselung PHP / Delphi
 
@derNutzer An welcher Stelle kommt PHP (Erwähnst du im Titel) zum Einsatz?

TurboMagic 15. Jul 2020 22:25

AW: Entschlüsselung PHP / Delphi
 
In der DEC gibt's auch AES Code, Base64 Konvertierung über die Format Klassen
und ein einfaches Konsolen Demo Programm.
CBC Blockverkettungsmodus gibt's auch.

Zu finden hier:

https://github.com/winkelsdorf/Delph...tionCompendium

Im Unterordner docs ist auch eine Dokumentation.

DerNutzer 16. Jul 2020 06:46

AW: Entschlüsselung PHP / Delphi
 
Guten Morgen,

vielen Dank erstmal für die schnelle Hilfestellung. :-D

@Sinspin : Leider haben die wohl nur den Pythoncode. :?

@Sherlock : Das ist doch mal ne Anleitung, mit der ich vielleicht was anfangen kann. :wink: Wie gesagt, Verschlüsselung ist nicht meines.

@mytbo : Danke. Da schaue ich mal rein. :thumb:

@generic : Sorry ... mein Fehler. Sollte Python werden. :oops:

@TurboMagic : Vielen Dank. Da werde ich mich wohl mal durcharbeiten müssen. :)

Bin aber für weitere Ideen offen. Wünsche allen einen erfolgreichen Tag!


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