Vielleicht solltest Du zuerst einmal klären, welche KDF die C#-Funktion PasswordDeriveBytes verwendet. Warum verwendest Du ausgerechnet PBKDF1, das als einzige Funktion eine Maximallänge (= Hashlänge) hat? Der Originalcode kann so nicht funktioniert haben mit 128-Bit-Hash und 256-Bit-Schlüssel.
PasswordDervieBytes benutzt PBKDF1. Zu dem Warum: Hat eine Kollegin gemacht, ich habe damit nix am Hut. Da die Funktion der des OP entspricht, tippe ich mal auf "irgendwo im Netz gefunden". Laut ihrer Aussage funktioniert das Ver- und Entschlüsseln auf C#-Seite. Vielleicht sollte man ja mal den C#-Code ändern...
Bist Du sicher, daß beides mal die gleichen Eingangsdaten benutzt wurden? Insbesondere muß natürlich das Salz übereinstimmen (kein Zeitstempel, Zufall etc)!?
Die Eingangsdaten sind wirklich gleich. Feste Strings zum Testen.
Edit: Arg wie so oft sitzt das Problem vor dem Monitor
pbkdf1(hash,@Password[1], Length(password),@Salt[1],2,key,20);
statt
pbkdf1(hash,@Password[1], Length(password),@Salt,2,key,20);
ist des Rätsels Lösung. Der Salt-Parameter ist ja ein Pointer auf einen String. Naja, ich kann mich damit rausreden, dass ich mich bisher von Pointern fern gehalten habe, wenn es ging
Jetzt funktioniert zumindest schon einmal das Ver- und Entschlüsseln auf Delphi-Seite. Mal schauen, ob es mit den C#-Testvektoren funktioniert.