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

Soyez le premier à donner votre avis sur cette source.

Snippet vu 40 136 fois - Téléchargée 30 fois

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

Ajouter un commentaire

Commentaires

mokermi
Messages postés
1
Date d'inscription
mardi 13 février 2007
Statut
Membre
Dernière intervention
12 mars 2010

Salut moi ce serai pour decrypter les photos de la naissance de mon fils que j'ai encrypté avec windows xp pro et depuis mon passage sur vista impossible de les lire et je n'ai ni l'ancienne version de xp ni rien d'autres ...je ne sais plus comment faire en plus ma femme me met la pression aidez moi SVP !!!!
Est ce possible de les decrypter ???
Merci d'avance a tous !!!
japee
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
Vraiment très intéressant.
Je testerai à fond... plus tard... fatigué...

Ben, euh... fais de beaux rêves, Cirec ^^
cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Voilà
cette procedure est vraiment la plus rapide de toutes :

procedure DecodeMemoryStreamBlock(const FromFileName, ToFileName: string);
var
Key,
PosPointer: LongWord;
Buffer : Array[1..1024] of Byte;
MStream: TMemoryStream;
NbALire, NbLu, TotalLu : LongInt;
i: Integer;
begin
MStream := TMemoryStream.Create;
try
MStream.LoadFromFile(FromFileName);
MStream.Seek(0, soFromBeginning);
MStream.Read(Key, 4);
Key := Key xor $E0FFD8FF;
MStream.Seek(0, soFromBeginning);
TotalLu := 0;
NbALire := SizeOf(Buffer);
Repeat
If (TotalLu + NbALire) > MStream.Size Then NbALire := MStream.Size - TotalLu;
PosPointer := MStream.Position;
NbLu := MStream.Read(Buffer, NbALire);
For I:= 1 to NbLu do
Buffer[I] := Buffer[I] Xor Key;
MStream.Position := PosPointer;
MStream.WriteBuffer(Buffer, NbLu);
TotalLu := TotalLu + NbLu;
Until TotalLu >= MStream.Size;
MStream.SaveToFile(ToFileName);
finally
MStream.Free;
end;
end;


Bonne nuit ;-)
@+
Cirec
cirec
Messages postés
3809
Date d'inscription
vendredi 23 juillet 2004
Statut
Modérateur
Dernière intervention
25 janvier 2020
35
Ce qui est bizarre c'est que DecodeMemoryStream est plus lent
que la mienne ???

je vais essayer un mix des deux ...
@+
Cirec
japee
Messages postés
1715
Date d'inscription
vendredi 27 décembre 2002
Statut
Modérateur
Dernière intervention
2 décembre 2019
3
Salut Cirec,

J'ai repris ce code car il était vraiment mal foutu et me faisait honte. Son seul intérêt est de montrer le mécanisme du cryptage par xor.

Quant au problème de la rapidité, il est résolu dans un code posté ultérieurement, grâce à Shining et à TMemoryStream.

Mais ta manière de procéder m'intéresse, elle est en quelque sorte à mi chemin entre BlockRead et FileStream, et je vais l'étudier de plus près.

Sinon, j'en ai deux autres en réserve, il va falloir que je compare les performances...

Une version assez rapide :

procedure DecodeFileBlocks(const FromFileName, ToFileName: string);
var
OldF, NewF: file;
Buffer: array[0..1023] of Byte;
FilePointer: LongInt; // pointeur de position dans le fichier
BytesRead: Integer;
i: Integer;
Key: Byte;
begin
AssignFile(OldF, FromFileName);
try
Reset(OldF, 1);
BlockRead(OldF, Buffer, SizeOf(Buffer), BytesRead);
Key := Buffer[0] xor 255;
Seek(OldF, 0);
AssignFile(NewF, ToFileName);
try
Rewrite(NewF, 1);
while not Eof(OldF) do
begin
FilePointer := FilePos(OldF);
BlockRead(OldF, Buffer, SizeOf(Buffer), BytesRead);
for i := 0 to BytesRead - 1 do
Buffer[i] := Buffer[i] xor Key;
Seek(NewF, FilePointer);
BlockWrite(NewF, Buffer, BytesRead);
end;
finally
CloseFile(NewF);
end;
finally
CloseFile(OldF);
end;
end;

Une version ultra rapide :

procedure DecodeMemoryStream(const FromFileName, ToFileName: string);
var
Tmp,
Key,
PosPointer: LongWord;
MStream: TMemoryStream;
begin
MStream := TMemoryStream.Create;
try
MStream.LoadFromFile(FromFileName);
MStream.Seek(0, soFromBeginning);
MStream.Read(Tmp, 4);
Key := Tmp xor $E0FFD8FF;
MStream.Seek(0, soFromBeginning);
while MStream.Position < MStream.Size do
begin
PosPointer := MStream.Position;
MStream.Read(Tmp, 4);
Tmp := Tmp xor Key;
MStream.Position := PosPointer;
MStream.Write(Tmp, 4);
MStream.Position := PosPointer + 4;
end;
MStream.SaveToFile(ToFileName);
finally
MStream.Free;
end;
end;

Quoi qu'il en soit, voilà un beau catalogue des manières de lire et écrire dans les fichier, c'est presque un tutoriel, lol...

A +
japee

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.