Décrypter les fichiers image jpg (vous avez égaré la clé)

Contenu du snippet

Certains fichiers jpg cryptés nécessitent une clé pour être visionnés. L'algorythme de cryptage est basé sur l'utilisation de Xor. Il est très facile de le trouver...

J'ai adapté ce code en Delphi à partir d'une source en VB parue en février 2002 dans l'excellent magazine "Pirates Mag" (n° 10), dans le cadre d'un article traitant précisément du décryptage de ces JPG.

Donc, si vous avez égaré la clé de décryptage que vous aviez payée la peau des fesses, tout n'est pas perdu...
Vous pourrez à nouveau visionner ces images de rêve représentant des paysages sublimes, les fonds marins, la faune et la flore de notre planète, etc... ;)

Le code qui suit lit et écrit byte par byte directement dans les fichiers. Il n'est donc pas des plus rapides, et je travaille sur une version utilisant TFileSteam.
J'en avais fait un programme avec progression, temps restant estimé, tout ça, mais il faut que je le reprenne.

Je joindrai bientôt un zip pour la mise en oeuvre, je n'ai pas le temps pour l'instant.

A suivre, donc...

ATTENTION : si vous utilisez la première méthode (sans passer par TFileStream), et que vous travaillez à partir de fichiers en lecture seule (ReadOnly), n'oubliez pas de passer par une procédure qui enlève cette propriété. Voir en Annexe ci-dessous (mise à jour: 06/11/03, code précédent faux).

Pour la mise en application, voir ici :

http://www.delphifr.com/code.aspx?ID=17510

Source / Exemple :


{ Byte par byte }

procedure DecodeFile(const FromFileName, ToFileName: string);
var
  FCod, FDeCod: file of Byte;
  Tmp, Key: Byte;
begin
  AssignFile(FCod, FromFileName);
  try
    Reset(FCod);
    Read(FCod, Tmp);
    Key := Tmp xor 255;  // calcul de la clé de cryptage
    Seek(FCod, 0);
    AssignFile(FDeCod, ToFileName);
    try
      ReWrite(FDeCod);
      while not EOF(FCod) do
      begin
        Read(FCod, Tmp);
        Tmp := Tmp xor Key;
        Write(FDeCod, Tmp);
      end;
    finally
      CloseFile(FDeCod);
    end;
  finally
    CloseFile(FCod);
  end;
end;

{ Avec TFileSteam }

procedure DecodeFileStream(const FromFileName, ToFileName: string);
var
  FSCod, FSDeCod: TFileStream;
  Tmp, Key: Byte;
  i: Integer;
begin
  FSCod := TFileStream.Create(FromFileName, fmOpenRead);
  try
    FSCod.Read(Key, 1);
    Key := Key xor 255;   // calcul de la clé de cryptage
    FSCod.Seek(0, 0);
    FSDeCod := TFileStream.Create(ToFileName, fmCreate);
    try
      for i := 0 to FSCod.Size - 1 do
      begin
        FSCod.Read(Tmp, 1);
        Tmp := Tmp xor Key;
        FSDeCod.Write(Tmp, 1);
      end;
    finally
      FSDeCod.Free;
    end;
  finally
    FSCod.Free;
  end;
end;

{
Supprimer la propriété ReadOnly d'un fichier 
(mise à jour: 06/11/03, code précédent faux)
}

var Attribut: Integer;
    FichierEnco_D: String; // le fichier à lire
begin
  Attribut := FileGetAttr(FichierEnco_D);  // récupère attributs
  if Attribut and faReadOnly <> 0 then   // si lecture seule...
    FileSetAttr(FichierEnco_D, Attribut and not faReadOnly); // ...supprime ReadOnly
end;

Conclusion :


Voila, j'ai balancé tout ça un peu vite, en réponse à une question du forum.
J'espère qu'il n'y a pas trop de bêtises, sinon, n'hésitez pas... hein ?

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.