Einzelnen Beitrag anzeigen

DerNutzer

Registriert seit: 14. Sep 2017
7 Beiträge
 
#1

Entschlüsselung PHP / Delphi

  Alt 15. Jul 2020, 12:23
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.
  Mit Zitat antworten Zitat