Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 
#15

Re: Rijndael-Entschlüsselung

  Alt 17. Feb 2008, 12:07
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.
  Mit Zitat antworten Zitat