Weißt du was der PHP Code macht, wie er funktioniert ?
Als Hinweis: wie oft wird der Cipher erzeugt und mit einem Password gefüttert im Vergleich zu der Anzahl der Datenzeilen die man entschlüsselt ?
Delphi-Quellcode:
with TCipher_Rijndael.Create do
try
Mode := cmCFB8;
Init(TFormat_HEX.Decode('8C35192D964DC3182C6F84F3252239EB4A320D2500000000'));
WriteLn(DecodeBinary('imlVf7HadQ70zlFlQno/ssi7aJalsNLvX0cgQ4Y0TNT20D4qCAEkPesRMBKI0IzzW5z=', TFormat_MIME64));
WriteLn(DecodeBinary('8tGaLlkO6Rd1H1EX8kAOUfKGINHnO4lo7lJ1wr3Qnxg1R4EUqrM7RYo/2O357k+/Zv90NqYvBTV9', TFormat_MIME64));
finally
Free;
end;
Delphi-Quellcode:
procedure CCFLoadFiles(AItems: Strings; const AFileName: String; const APassword: Binary);
var
I: Integer;
begin
AItems.BeginUpdate;
try
AItems.LoadFromFile(AFileName);
AItems.Text := TFormat_HEX.Decode(AItems.Text);
with TCipher_Rijndael.Create do
try
Mode := cmCFB8;
Init(APassword);
for I := 0 to AItems.Count -1 do
AItems[I] := DecodeBinary(AItems[I], TFormat_MIME64);
finally
Free;
end;
finally
AItems.EndUpdate;
end;
end;
procedure TForm1.ButtonClick(Sender: TObject);
begin
if OpenDialog1.Execute then
CCFLoadFiles(ListBox1.Items, OpenDialog1.FileName, TFormat_HEX.Decode('8C35192D964DC3182C6F84F3252239EB4A320D2500000000'));
end;
Warum RapidShare das so verschlüsselt ist unklar. Man hätte
1.) mit einem Salt arbeiten müssen
2.) alle unverschlüsselten Zeilen als eine Zeile in einem Rutsch verschlüsseln können und dieses Resultat in einem Rutsch in MIME64 und dann nochmal in HEX umwandeln können.
3.) die Zusätzliche Umwandlung in HEX eines MIME64 String ist für den Popo und expandiert die Datenmenge nur unnötig. Es sei denn das DU diese HEX-Umwandlung eingebaut hast und in Wahrheit Rapidshare in seinen Dateien nur einfach zeilenweise MIME64 formatierte Strings enthalten. Das würde dieses ständige Umwandeln von HEX nach MIME64 erklären. Sollte das der Fall sein dann ändere oben Source um in
Delphi-Quellcode:
procedure CCFLoadFiles(AItems: Strings; const AFileName: String; const APassword: Binary);
var
I: Integer;
begin
AItems.BeginUpdate;
try
AItems.LoadFromFile(AFileName);
// AItems.Text := TFormat_HEX.Decode(AItems.Text);
with TCipher_Rijndael.Create do
try
Mode := cmCFB8;
Init(APassword);
for I := 0 to AItems.Count -1 do
AItems[I] := DecodeBinary(AItems[I], TFormat_MIME64);
finally
Free;
end;
finally
AItems.EndUpdate;
end;
end;
Gruß Hagen
EDIT: erkläre uns doch mal was das eigentlich werden soll, ich möchte ungern unwissentlich in eine Straftat verwickelt werden. Davon abgesehen habe ich deine Arbeit gemacht und meine das alle hier im Forum interessierten Leute auch was davon haben sollten.
EDIT: übrigens sieht man sehr schön an Hand deiner fehlerhaften Resultate wie sich der Cipher sauber selbstsynchronisert. In deinem Output ist der 1. Datenblock a 16 Bytes der 2. Zeile zerstört. Aber alle nachfolgenden Datenblöcke sind wieder richtig. Das ist die Selbstsynchronisierung des Ciphers. Der 1. Datenblock ist deshalb falsch weil des interne Feedback-Register des Ciphers, 16 Bytes, neu mit einem Password initlaisiert wurde und nicht der letzte Wert aus der vorherigen 1. Zeile weiterbenutzt wurde. Da wir immer das gleiche Passwort benutzen, für jede Zeile separat, werden alle Datenblöcke nach dem 1. Datenblock wieder korrekt entschlüsselt. Für einen erfahrenen Laien ist also an Hand deines fehlerhaften Outputs sofort ersichtlich wo der Fehler im Source liegt, man erkennt sofort das der 1. Datenblock=16 Bytes falsch sind und stellt autom. die Vermutung auf das die Daten an einem Stück verschlüsselt wurden, auch ohne das PHP Script gesehen zu haben.