Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Kannst du mal deine Testdatei hochladen?
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Wenn du jetzt TBytes verwendest, muss hier AES_CBC_Decrypt(@EncryptedData, @Res, length(EncryptedData), ctx); auf jeden Fall der Index schonmal jetzt 0 sein - sowohl bei EncryptedData, als auch bei Res.
Die Zuweisung ctx.IV := aesblck ist überflüssig.
An dieser Stelle steht nicht der Key, sondern der IV!
FS.Seek($24, soBeginning);
SetLength(Key, 16);
FS.Read(Key, length(Key));
Auch...
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Dein BytesStream.Write(Res, Length(Res)) macht vermutlich Murks, weil du immer noch die RawByteStrings verwendest. Deren Indizierung beginnt bei 1 und nicht bei 0. Teste mal Res. Bei dynamischen Arrays/Strings immer explizit den Index angeben, wenn du mit Zeigern arbeitest, sonst zeigt die Referenz nicht auf die Daten selbst, sondern das gemanagte Objekt.
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Vergleiche mal deinen Aufruf:
mit der Funktionsdefinition:
function AES_CBC_Init_Decr(const Key; KeyBits: word; const IV: TAESBlock; var ctx: TAESContext): integer;
Richtig wäre:
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
function AES_CBC_Init_Decr(const Key; KeyBits: word; const IV: TAESBlock; var ctx: TAESContext): integer;
Hier musst du sowohl Key, KeyBits (= 128) und IV übergeben. Den Context solltest du meiner Meinung nach nicht per Hand modifizieren. BlockSize sollte normalerweise automatisch gleich der KeySize sein bei CBC. Müsstest du einfach mal probieren, ob was Sinnvolles als Resultat bei...
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Die befinden sich evtl. auch im Context? Ich kenne die Lib von Wolfgang Erhardt leider nicht.
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Nee, der Schlüssel befindet sich in dem keyBytes Array aus deinem Beispiel. Der IV ist der Initialisierungsvektor für den AES-Cipher (verwendet man analog zu einem Salt, damit gleiche Daten selbst bei gleichem Schlüssel nicht den gleichen Cyphertext generieren). Man benötigt beides, um die Daten zu entschlüsseln.
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Habe grade kein Delphi hier, aber grob aus dem Kopf:
var
FS: TFileStream;
Key: TBytes;
begin
FS := TFileStream.Create('...', fmOpenRead);
try
FS.Seek($24, soBeginning);
SetLength(Key, 16);
Forum: Programmieren allgemein
by Zacherl,
16. Jun 2019
Ich würde vorschlagen den C# Code weitestgehendes zu vergessen und nur die Funktionalität zu reproduzieren. Sprich:
Datei in einen Stream (anstelle des `buffer` Arrays) laden
An Stelle 0x24 den AES-IV mit einer Länge von 0x10 (16) Bytes auslesen
Den Dateiheader(?) ansonsten ignorieren und mit Stream.Seek zu Offset 0x38 springen
Die restlichen im Stream befindlichen Daten entschlüsseln:
...